Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: OOD
Дата сообщения: 30.06.2006 18:06
проблемка такая решил отобразить содержимое web страничьки в memo, а на страничьке оказались фреймы Как добраться до них через WebBrowser не знаю пробую вот так:


[more]
uses mshtml, activex;

procedure GetHtmlCode(WebBrowser: TWebBrowser; FileName: string);
var
htmlDoc: IHtmlDocument2;
PersistFile: IPersistFile;
begin
htmlDoc := WebBrowser.document as IHtmlDocument2;
PersistFile := HTMLDoc as IPersistFile;
PersistFile.save(StringToOleStr(FileName), true);
end;


var
Document: IHTMLDocument2;
begin
Document := WB.Document as IHtmlDocument2;
if Document < > nil then
Memo1.Text := (Document.all.Item(NULL, 0) as IHTMLElement).OuterHTML;

[/more]

Страничька отображается в мемо, а фреймы внутри её нет подскажите как можно сделать чтобы отображались в мемо содержимое фреймов?!
Автор: dyr farot
Дата сообщения: 30.06.2006 18:27
не понял как те два кучка кода связанны, но в любом случае у главного документа (тот, что WB.Document) запроси frames; если коллекция не пустая -- пройдись по всем элементам (они тоже IHTMLDocument2)
Автор: OOD
Дата сообщения: 30.06.2006 18:42
Подскажите а можно ли из компонента TEdit Не и спользуя Memo перенести содержимое TEdit в текстовый файл temp.txt в определенную часть этого файла т.е. в определенную строку, определенный столб?
Автор: greenpc
Дата сообщения: 03.07.2006 07:36
OOD
Данный пример показывает как определить в каких фреймах разрешена команда 'copy':
[more]

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to (WebBrowser1.OleObject.Document.frames.Length - 1) do
if WebBrowser1.OleObject.Document.frames.item(i).document.queryCommandEnabled('Copy') then
ShowMessage('copy command is enabled for frame no.' + IntToStr(i));
end;
[/more]

Автор: OOD
Дата сообщения: 03.07.2006 07:39
greenpc
Да всё спасибо сделал
вот :
[more]
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, OleCtrls, SHDocVw, StdCtrls, mshtml, Buttons, ComCtrls;


type
TForm2 = class(TForm)
WebBrowser1: TWebBrowser;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
Memo1: TMemo;
Memo2: TMemo;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
Memo3: TMemo;
Edit2: TEdit;
Label1: TLabel;
procedure WebBrowser1StatusTextChange(ASender: TObject;
const Text: WideString);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
Webbrowser1.Navigate(Edit1.Text);
end;


procedure TForm2.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i,y:integer;
iDoc:IHtmlDocument2;
iDisp: IDispatch;
iElement:IHTMLElement;
iInputElement:IHTMLInputElement;
Uni:IHTMLSelectElement;
Link:IHTMLDivElement;
r:IHTMLOptionButtonElement;
Chil:IHTMLElementCollection;
ed20:string;
ListNumber:integer;
begin
ListNumber:=1;


iDoc:=(pDisp as IWebBrowser).Document as IHtmlDocument2;
if Assigned(iDoc) then
begin
if (ListNumber=1) or (ListNumber=10) then
Memo1.Text:= Memo1.Text+(iDoc.all.Item(0,0) as IHTMLElement).outerText;
Memo2.Text:= Memo1.Text+(iDoc.all.Item(0,0) as IHTMLElement).outerHTML;
ed20:= (iDoc.all.Item(0,0) as IHTMLElement).outerText;
//Edit20.Text:= (iDoc.all.Item(0,0) as IHTMLElement).outerText;
{------------------------------}
{------------------------------}

for i:=0 to iDoc.All.length-1 do
begin
iDisp:=iDoc.all.item(i,0);
iDisp.QueryInterface(IHTMLElement, iElement);
if assigned(iElement) then
begin



end;
end;
end;

end;



procedure TForm2.WebBrowser1StatusTextChange(ASender: TObject;
const Text: WideString);
begin
Label1.Caption := Text;
Memo3.Lines.Add(text);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin

end;

end.
[/more]

Теперь проблема как сохранить содержимое из TEdit в определенную часть текстового файла?! не использую мемо можно это сделать?
Автор: RomanTim
Дата сообщения: 03.07.2006 08:42
OOD

Цитата:
как сохранить содержимое из TEdit в определенную часть текстового файла?! не использую мемо можно это сделать?

Можно, используя TStringList - такой же наследник от TStrings, как и Lines в TMemo. Например так [more]
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(FileName);
sl[Row] := NewRowValue;
sl.SaveToFile(FileName);
finally
sl.Free;
end;
[/more]
Автор: SERGE_BLIZNUK
Дата сообщения: 03.07.2006 09:25

Цитата:
Теперь проблема как сохранить содержимое из TEdit в определенную часть текстового файла

RomanTim тебе вполне рабочий вариант предложил... Если только ты номер строки, куда сохранять надо, знаешь... ещё можно работать через нетипизированныхй файл MyF : file; или file of char; file of byte;
ручками открывать, находить смещение, через ReadBuffer/WriteBuffer читать, писать..
А что вообще за бредовая задача - сохранять в определённую часть файла... Для чего это может понадобится?

Автор: OOD
Дата сообщения: 03.07.2006 09:46
SERGE_BLIZNUKУгу понял Спасибо, а если нужно внести в 10 строку 10 ряд слово "xxx", то через TStringList тоже получиться сделать это?
В мемо не хочеться это делать ну вообще никак
Автор: greenpc
Дата сообщения: 03.07.2006 09:54
SERGE_BLIZNUK

Цитата:
ещё можно работать через нетипизированныхй файл

в этой ситуации не удобно, тк прийдется обрабатывать каждый байт
информации
OOD
что подразумеваешь под словом "ряд" позиция? INSERT
Автор: OOD
Дата сообщения: 03.07.2006 10:09
greenpc
ну да наверное я синтаксис мало знаю , но инсерт значит добавить, следовательно, если в текстовом файле будет какие-то символы они заменятся, после операции INSERT?

смысл такой есть файл test.txt В нем
[more]
1111111|1111111
2222222|2222222
333333333333333
444444444444444
[/more]

можно ли заманить
2 ряд 7 символ на |

Ну и естественно сохранить его туда же....
при этом если произвести операцию INSERT 7-й символ замениться на тот, который мы поставили ? или просто допишеться?
Автор: RomanTim
Дата сообщения: 03.07.2006 10:43
OOD
TStrings - это грубо говоря массив строк. Метод Insert вставляет в определенное место новую строку - число строк увеличивается на 1 (Add добавляет в конец). Доступ к i-й строке соответственно StringList[i]. Для твоего случая
Код: cl.LoadFromFile('test.txt');
sl[1][7] := '|'; // элементы списков нумеруются с 0
sl.SaveToFile('test.txt');
Автор: SERGE_BLIZNUK
Дата сообщения: 03.07.2006 12:30

Цитата:
cl.LoadFromFile('test.txt');

Описка, наверное, sl.LoadFromFile('test.txt');



Цитата:
sl[1][7] := '|'; // элементы списков нумеруются с 0

так не покатит!
можно вот так:

Код:
var
sl : TStringList;
sTempStr : string;
begin
try
sl := TStringList.Create;
sl.LoadFromFile('test.txt');
sTempStr := sl.Strings[1];
sTempStr[7] := '|';
sl.Strings[1] := sTempStr; // элементы списков нумеруются с 0
sl.SaveToFile('test.txt');
finally
sl.Free
end;
end;
Автор: greenpc
Дата сообщения: 03.07.2006 12:51
SERGE_BLIZNUK

Цитата:
sl := TStringList.Create
ставится перед try....
ну и немного корректние FreeAndNil(sl)
Автор: OOD
Дата сообщения: 03.07.2006 12:54
SERGE_BLIZNUK

Да всё отлично вот:

[more]
rocedure TForm1.Button1Click(Sender: TObject);
var
sl : TStringList;
s : string;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('test.txt');
s := sl[0];
s[7] := '|';
sl[0] := s;
sl.SaveToFile('test.txt');
finally
sl.Free;
end;
end;
[/more]

А как можно сделать чтобы данные s[7] := '|'; именно "|" ,или любой другое брались из TEdit?
Автор: vshersh
Дата сообщения: 03.07.2006 12:54
greenpc

Цитата:
ну и немного корректние FreeAndNil(sl)

А в чем корректность то? Переменная то локальная...
Автор: greenpc
Дата сообщения: 03.07.2006 13:04
vshersh
help по F1 или _http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1186

Цитата:

Reader.Free;
После уничтожения объекта переменная Reader сохраняет свое значение, продолжая ссылаться на место в памяти, где объекта уже нет. Если эту переменную предполагается еще использовать, то желательно присвоить ей значение nil, чтобы программа могла проверить, существует объект или нет. Таким образом, наиболее правильная последовательность действий при уничтожении объекта должна быть следующая:
Reader.Free;
Reader := nil;
С помощью стандартной процедуры FreeAndNil это можно сделать проще и элегантнее:
FreeAndNil(Reader);

OOD
если символ один то s[7] := edt1.Text[1];
если несколько:
delete(s,7,1);
insert(s,edt1.text,7);
Автор: vshersh
Дата сообщения: 03.07.2006 13:07
greenpc
Эт я знаю...
Но для локальных переменных это ничем не поможет... (по крайней мере для приведенного кода, когда после освобождения объекта мы выходим из области видимости процедуры)
Автор: greenpc
Дата сообщения: 03.07.2006 13:15
vshersh
для данного кода разницы нету
а если будет использоваться в цикле, то есть
Автор: OOD
Дата сообщения: 03.07.2006 13:59
greenpc
А зачем делать
Код: delete(s,7,1);
Автор: greenpc
Дата сообщения: 03.07.2006 14:12
OOD
s:=Copy(sl[0],1,6);
while Length(s)<6 do s:=s+' ';
s:=s +edt1.Text;
if Length(sl[0])>s then s :=s+Copy(sl[0], Length(s)+1, Length(sl[0]));
Автор: OOD
Дата сообщения: 03.07.2006 14:24
greenpc
ругается
Код: then
Автор: greenpc
Дата сообщения: 03.07.2006 14:50
OOD
а если подумать
if Length(sl[0])>LENGTH(s)
Автор: OOD
Дата сообщения: 03.07.2006 15:18
greenpc
ВСЕМ ПРИОГРОМНЕЙШЕЕ СПАСИБО, ВЫ МНЕ ОЧЕНЬ, ОЧЕНЬ, ОЧЕНЬ ПОМОГЛИ
Ещё раз спасибо всё работает

Но эта процедура только для одной строки а как быть чтобы в другой строке производилась запись значения из TEdit?
т.е. не для первой строки , а для любой тругой

Допустим если нужно вносить параметры в 5 строчку 10 символ?
Автор: SERGE_BLIZNUK
Дата сообщения: 03.07.2006 21:59
OOD

Цитата:
Допустим если нужно вносить параметры в 5 строчку 10 символ?


странные желания продолжаются?... ;-)))

И, хоть ты так и не рассказал, что тебе нужно... (может, это лабораторная?)

Ладно, если я тебя правильно понял, ты хочешь, чтобы в одном Tedit был символ, который ты хочешь заменить, в другом TEdit - был номер строки, в третьем - номер символа в этой строке, который нужно заменить?

ну сейчас лень запускать дельфю, но, грубо говоря это будет так: [more]

не... всё таки пришлось запустить, чтобы кое-что проверить...


Код:

procedure TForm1.Button1Click(Sender: TObject);
var
sl : TStringList;
s : string;
Row : integer;
PosChar : integer;
begin
// в Edit1 - новый текст, который будет вставлен
// в Edit2 - номер строки, в которую вставляем новый текст - нумерация начиная с 1
// в Edit3 - с какой позиции вставляем текст

// получаем номер строки из Edit2
Row := 0;
try
Row := StrToInt(Edit2.Text);
except
Row := 0;
end;

// получаем номер символа из Edit3
PosChar := 0;
try
PosChar := StrToInt(Edit3.Text);
except
PosChar := 0;
end;

if (PosChar< 1) or (Row<1) then begin
ShowMessage('Ошибка ввода данных - обработка прервана!');
Exit
end;

sl := TStringList.Create;
try
sl.LoadFromFile('test.txt');

if ( sl.Count <= Row ) then begin
ShowMessage('Указан номер строки боьше, чем строк в файле! Обработка прервана!');
Exit
end;

// взяли нужную строчку
s := sl[Row-1]; // номеровать строчки в Edit2 будем по человечески от 1...

while Length(s) < PosChar do s := s + ' ';

// удалим из строки символы, которые мы хотим заменить
Delete( s, PosChar, Length(edit1.Text));

s := s + edit1.Text;

sl[Row-1] := s;

sl.SaveToFile('test.txt');
finally
sl.Free;
end;
end;

Автор: OOD
Дата сообщения: 03.07.2006 22:58
SERGE_BLIZNUK
Спасибо нет это не лабораторная пишу просто бота , но тяжко переключиться с других языков на делфи хелп во многом не рулит Задачи могут показаться странными, но только они могут помочь в данной ситации Вы очень , очень помогли!
Автор: SERGE_BLIZNUK
Дата сообщения: 03.07.2006 23:10
OOD

Цитата:
Спасибо нет это не лабораторная пишу просто бота , но тяжко переключиться с других языков на делфи

понятно. Заметно, что Delphi для вас не родной...
всё получилось? Больше вопрос нет?...

P.S.А вы прямо с обеда и до полуночи бьётесь с этой задачёй... ;-))) Уважаю ваше упорство ;-)) я лично - иду спать ;-))

Автор: OOD
Дата сообщения: 03.07.2006 23:50
SERGE_BLIZNUK
Нет действительно большое спасибо , чтобы я делал без ру - боарда не знаю...
бью уже третьи сутки не сплю и уже могу похвастаться Вашими и моими трудами ,а именно активация и запуск прогаммы по смс с мобильного телефона всех операторов умс, возможность управления программой через смс , отчеты на этот телефон, лог файлы, подтверждения действия,бот для онлайн игры и многое другое!
Принцип вообще какой посылаю смс , обработчие её смотрит в сохраняет в тхт файл, дальше нужно искать в тхт файле это самое действие и его обрабатывать другим обработчиком.. пот по этому Вас и достал тут с ТСтрингами ТЕдитами и всем прочим , Вы уж извенити, но сделали очень полезное и нужное дело
Автор: ShadowMen
Дата сообщения: 04.07.2006 06:54
Установил KAV 6. Теперь при запуске Дельфя частенько ругается на испорченый файл регистрации. Отключаешь антиыирусную защиту - запускается нормально.
Автор: RostY
Дата сообщения: 04.07.2006 08:19
ShadowMen
Автор: greenpc
Дата сообщения: 04.07.2006 08:34
SERGE_BLIZNUK
нашел ошибку в Вашем коде
пример: строчка длинной 10 символов, вставка: 2 символа,Позиция: 5
добавление идет в конец строки.
[more]
procedure TForm1.Button1Click(Sender: TObject);
var
sl : TStringList;
s : string;
Row : integer;
PosChar : integer;
begin
// в Edit1 - новый текст, который будет вставлен
// в Edit2 - номер строки, в которую вставляем новый текст - нумерация начиная с 1
// в Edit3 - с какой позиции вставляем текст

// получаем номер строки из Edit2
(* коментарий
Row := 0;
try
Row := StrToInt(Edit2.Text);
except
Row := 0;
end; *)

Row :=StrToIntDef(Edit2.Text,0); // тоже самое, только короче

// получаем номер символа из Edit3
(* PosChar := 0;
try
PosChar := StrToInt(Edit3.Text);
except
PosChar := 0;
end; *)

PosChar :=StrToIntDef(Edit3.Text,0);

if (PosChar< 1) or (Row<1) then begin
ShowMessage('Ошибка ввода данных - обработка прервана!');
Exit
end;

sl := TStringList.Create;
try
sl.LoadFromFile('test.txt');

if ( sl.Count <= Row ) then begin
ShowMessage('Указан номер строки боьше, чем строк в файле! Обработка прервана!');

sl.Free // НАДО !!!

Exit
end;

(*
// взяли нужную строчку
s := sl[Row-1]; // номеровать строчки в Edit2 будем по человечески от 1...

while Length(s) < PosChar do s := s + ' ';

// удалим из строки символы, которые мы хотим заменить
Delete( s, PosChar, Length(edit1.Text));

s := s + edit1.Text;

sl[Row-1] := s;
*)

// таже обработка
s:=Copy(sl[Row-1],1, PosChar-1); // копируем начало строки до нужно нам позиции
while Length(s)<PosChar-1 do s:=s+' ';
s:=s +edit1.Text;
if Length(sl[Row-1])>Length(s) then s :=s+Copy(sl[Row-1], Length(s)+1, Length(sl[Row-1]));
//добавляем концовку строки
// не совсем корректно вычиляется кол-во сиволов для копирования, но это не важно

sl[Row-1] := s;
sl.SaveToFile('test.txt');
finally
sl.Free;
end;
end;
[/more]

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.