Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 обратно в Броузер:


    HTMLDocument.body.innerHTML:=Memo1.Lines.Text;
    HTMLDocument.Close;

результат: грузит всё как надо, но ! дает ошибку IE


var
 v: Variant;
begin
....// загрузка и обработка HTML в MEMO далее:
   v := VarArrayCreate([0, 0], varVariant);
   v[0] := Memo1.Text;
   HTMLDocument.Write(PSafeArray(TVarData(v).VArray));  
   HTMLDocument.Close;

Результат Еррор


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
14-1107771563
Тульский
2005-02-07 13:19
2005.02.27
Струйник


14-1107767464
Хинт
2005-02-07 12:11
2005.02.27
XP и 2000


4-1105658508
Colonel
2005-01-14 02:21
2005.02.27
Ring0


3-1106861489
Dell3r
2005-01-28 00:31
2005.02.27
Скроллинг


1-1108013410
Atrion
2005-02-10 08:30
2005.02.27
RegKey.ReadBinaryData нужно Binary в String





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский