Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизTWebBrowser и HTML Найти похожие ветки
← →
Polo © (2005-02-08 09:43) [0]Тема такая: нужно написать броузер с хитрой опцией замены(подмены) HTML перед открытием, но после скачивания самого HTML. т.е. до того как начнет грузить картинки и прочее(до обработки)...
Вот .. нашел место нужное где код вставить :NavigateComplete2
нашел как скачать код в мемо и без проблем его поправил... пример: на форме: Мемо1, баттон1(с методом навигейт на текст Эдит1) webBrowser1 и Эдит1(с http://www.ya.ru)
var
HTMLDocument: IHTMLDocument2;
ss: integer;
begin
// Сохранение в Мемо
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
Memo1.Lines.Add(HTMLDocument.body.outerHTML);
// Сохранение в Мемо Энд
// Замена
ss := Pos(AnsiLowerCase("Найти"),AnsiLowerCase(Memo1.Lines.Text));
Memo1.SelStart := ss-1;
Memo1.SelLength := Length("Найти");
Memo1.SelText := "Пойти";
//Замена Энд
далее надо продолжить и всё вернуть обратно в броузер ... не нарушив целостности просмотра... тут проблема ((( из 3х методов ни один до конца довести не смог! ХЕЛП! (Если нада выложу то что проюовал ... )
← →
Polo © (2005-02-08 10:08) [1]Методы которыми пробовал вернуть HTML обратно в Броузер:
1й
HTMLDocument.body.innerHTML:=Memo1.Lines.Text;
HTMLDocument.Close;
результат: грузит всё как надо, но ! дает ошибку IE
2й
var
v: Variant;
begin
....// загрузка и обработка HTML в MEMO далее:
v := VarArrayCreate([0, 0], varVariant);
v[0] := Memo1.Text;
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
Результат Еррор
3й
var
Stream : TMemoryStream;
begin
... //загрузка и обработка HTML в MEMO далее:
try
Memo1.Lines.SaveToStream(Stream);
Stream.Seek(0,soFromBeginning) ;
(WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(Stream)) ;
finally
Stream.Free;
end;
← →
Ihor Osov'yak © (2005-02-08 10:12) [2]с ходу напрашивается два варианта.
Первый. APP - Asynchronous pluggable protocols - см. msdn и как пример http://www.euromind.com/iedelphi/app.htm
Второй. Работа на уровне IHTMLElement.outerHTML или outerText тех тегов, подмену которых нужно осуществить.
← →
Polo © (2005-02-08 10:39) [3]to Ihor Osov"yak
вот вторым и пытаюсь.. ближе всего подошел к сути...
у меня это 1й способ... но что-то в нем не хватает.. а вот чего?
← →
Polo © (2005-02-08 15:37) [4]Даже подобная функция вызывает ошибку при Навигейт
procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
var
HTMLDocument: IHTMLDocument2;
bod: IHTMLElement;
begin
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
bod :=HTMLDocument.body as IHTMLElement;
bod.innerHTML:="<html><body>hello world</body></html>";
end;
← →
Ihor Osov'yak © (2005-02-09 10:10) [5]> вот вторым и пытаюсь..
Вы менеяте весь боди, а это не то, что "тех тегов, подмену которых нужно осуществить" в общем случае. Так как Ващ подход всегда будет противоречить "не нарушив целостности просмотра", предложенный мною при грамотном подходе - нет.
>Даже подобная функция вызывает ошибку при Навигейт
вот, если бы (мечтательно) более детально об ошибке.. Хотя бы сообщение, сопровождаемое ошибку..
Да, еще. То, что Вы пытаетесь подсунуть на место body таковым не является. Как на это WB прореагирует - не знаю и знать не желаю. Просто советовал бы таких вещей не делать.
← →
kai © (2005-02-10 12:13) [6]uses MSHTML, SHDocVw;
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var _HTML: IHTMLDocument2;
i: Integer;
begin
_HTML := webbrowser1.document as IHTMLDocument2;
for i := 0 to _HTML.images.length - 1 do
begin
ShowMessage(VarToStr((_HTML.images.item(NULL, i) as IHTMLImgElement).src));
(_HTML.images.item(NULL, i) as IHTMLImgElement).width := 100;
(_HTML.images.item(NULL, i) as IHTMLImgElement).src :=
"C:\test.jpg";
end;
end;
прошу прощения за убогость примера, но, думаю, мысля ясна.
только если документ фрэеймовый - нужно будет полазить по всем фреймам.
успехов
← →
Polo © (2005-02-10 14:11) [7]To Ihor Osov"yak
>То, что Вы пытаетесь подсунуть на место body таковым не является.bod.innerHTML:="<html><body>hello world</body></html>";
Пример Микрософта.. видно они думают что body может быть таким.. я проверил )<html><body><html><body>hello world</body></html></body></html>
в файле htm прекрасно ведет себя.
>предложенный мною при грамотном подходе..
это о
>Работа на уровне IHTMLElement.outerHTML или outerText тех тегов,
есть пример? Пробуем поправить пример приведенный kai - в нем ошибка закралась - пока не понятно в чем.. заменяет только 1ю картинку.. хм...
Допустим нельзя менять целиком Body. жаль конечно - придется делать 2ю работу... но как в условиях этой двойной работы сделать правильно пока тоже не понятно...
как менять нужные ссылки на то что нужно и нужные картинки на то что нужно ... (хоро что не надо менять структуру документа: таблицы и всё такое )
← →
Polo © (2005-02-10 15:58) [8]Немного поправил, правильней так:
_HTML := webbrowser1.document as IHTMLDocument2;
ShowMessage(IntToStr(_HTML.images.length));
for i := 0 to _HTML.images.length-1 do
begin
ShowMessage(VarToStr((_HTML.images.item(i, 0) as IHTMLImgElement).src));
end;
Сначала показывает общее количество картинок, потом показывает пути до кажой из них... (показывает правильно)
kai заметь (i,0) - так правильнее несмотря на то что Дельфи в подсказке уверяет в обратном! взял отсюда:
http://www.delphirus.com.ru/delphi-sovetid-1557.html
НО! если вместо ShowMessage попытаться менять:
(_HTML.images.item(1,0) as IHTMLImgElement).src :="C:\test.gif";
то меняется только одна из 3х картинок
проверить можно здесь: http://www.seaman.ru/x.htm
если замену оставить и вместе с этим ShowMessage то вообще странности показывает... (
← →
Polo © (2005-02-10 16:02) [9]Сори так как раз всё работает !
← →
Polo © (2005-02-10 16:22) [10]Только! смотрю моргает что-то.. при работе...
пустил через прокси, так он картинки заменяемые всёравно скачивает... ((
← →
Polo © (2005-02-10 16:35) [11]Может я ошибаюсь и методы NavigateComplite2 и DownloadComplit происходят после скачки всех картинок?
← →
Ihor Osov'yak © (2005-02-10 19:10) [12]DownloadComplete - после окончания скачивания, в тч картинок.
NavigateComplite2 - специально не иследовал.. Вероятнее всего где то перед началом либо в процессе, но точно до окончания, гарантировано перед DownloadComplete. Немного сложнее для многофреймового документа - но в пределах любого фрейма - так как сказал.
А вообще-то идеологически правильно Вашу задачу решать на уровне APP - Asynchronous pluggable protocols. Подменой контекста тегов на уровне DOM вероятнее всего задачу без всяких побочных явлений типа "так он картинки заменяемые всёравно скачивает" не решить.
← →
Polo © (2005-02-11 09:06) [13]To Ihor Osov"yak
Кто нибудь пробовал с APP работать? И есть ли какие материалы кроме MSDN. там я пытался разобраться но мозг отказался понимать..
← →
Polo © (2005-02-11 09:17) [14]To Ihor Osov"yak
Нашел Ваш пример APP но исходники не могу скачать ((
Internal Server Error
а вот ЕХЕ скачал... правда без описания не понял разницы работы Browserov...
← →
Polo © (2005-02-11 10:19) [15]Нашел также Клиента для Этого форума написаного с использованием этого протакола...
Как Вы поняли: я никогда ещё с ним не работал.. в чем его основа, приемущества, особенности, и как вообще он(APP) работает?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c