Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2015, 14:48   #1
keholem
Пользователь
 
Регистрация: 20.08.2015
Сообщений: 11
По умолчанию Проверка текста в WebBrowser

Доброго дня, Форумчане!
Возникла такая проблема: нужно проверить или получить определенный кусок исходного кода страницы загруженной в WB.

Ну хотелось бы сделать это без использования подобных функций:

Код:
function SaveHTML(Strings:TStrings;WB: TWebBrowser):boolean;
var
 PersistStream: IPersistStreamInit;
 MS: TMemoryStream;
 Stream: IStream;
 SaveResult: HRESULT;
begin
 PersistStream := WB.Document as IPersistStreamInit;
 MS := TMemoryStream.Create;
 Result:=false;
 try
  Stream := TStreamAdapter.Create(MS, soReference) as IStream;
  SaveResult := PersistStream.Save(Stream, True);
  if FAILED(SaveResult) then exit;
  Result:=true;
  MS.position:=0;
  Strings.LoadFromStream(MS);
 finally
  MS.Free;
 end;
end;
Это не совсем удобно постоянно загружать текст в stringlist, а потом с ним работать, к тому же она почему-то криво работает, если загружаешь страницу первый раз и сразу вызвать эту функции, то вывалится ошибка. Можно ли это сделать как-то по другому, что-то на подобие pos(text,webbrowser1)<>0 ?
keholem вне форума Ответить с цитированием
Старый 20.08.2015, 15:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я не знаю что именно тебе нужно получить, но можно примерно так:
Код:
var all,tbls:IHTMLElementCollection; d:IHTMLDocument2;
...
  d:=IHTMLDocument2(WB.Document);
  all:=d.all;
  tbls:=IHTMLElementCollection(all.tags('TABLE'));
Получить скажем коллекцию таблиц.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2015, 15:15   #3
keholem
Пользователь
 
Регистрация: 20.08.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я не знаю что именно тебе нужно получить, но можно примерно так:
Код:
var all,tbls:IHTMLElementCollection; d:IHTMLDocument2;
...
  d:=IHTMLDocument2(WB.Document);
  all:=d.all;
  tbls:=IHTMLElementCollection(all.tags('TABLE'));
Получить скажем коллекцию таблиц.
Ну предположим мне нужно получить содержимое определенного div блока, например:

<div id="container">
....
</div>
keholem вне форума Ответить с цитированием
Старый 20.08.2015, 15:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну напиши там вместо TABLE слово DIV.
Получишь коллекцию, которую пройдешь в цикле:
Код:
for i:=0 to tbls.length-1 do begin
     c:=tbls.item(i,0) as IHTMLElement;
     if c.id='container' then begin
      ...:=c.innerHTML;
     end;
   end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2015, 15:41   #5
keholem
Пользователь
 
Регистрация: 20.08.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну напиши там вместо TABLE слово DIV.
Получишь коллекцию, которую пройдешь в цикле:
Код:
for i:=0 to tbls.length-1 do begin
     c:=tbls.item(i,0) as IHTMLElement;
     if c.id='container' then begin
      ...:=c.innerHTML;
     end;
   end;
а без цикла не как?

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну напиши там вместо TABLE слово DIV.
Получишь коллекцию, которую пройдешь в цикле
Попробовал, когда нажимаю на кнопку, программа просто завершается без ошибок.

Код:
var
tbls:IHTMLElementCollection;
  c: IHTMLElement;
  d: IHTMLDocument2;
  all: IHTMLElementCollection;
...
    d:=IHTMLDocument2(WebBrowser1.Document);
    all:=d.all;
    tbls:=IHTMLElementCollection(all.tags('DIV'));

for i:=0 to tbls.length-1 do begin
     c:=tbls.item(i,0) as IHTMLElement;
     if c.id='container' then begin
     showmessage(c.innerHTML);
    // ...:=c.innerHTML;
     end;
   end;

Последний раз редактировалось Stilet; 20.08.2015 в 20:07.
keholem вне форума Ответить с цитированием
Старый 20.08.2015, 17:32   #6
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Код:
Uses MSHTML;

Procedure TForm1.ToolButton1Click(Sender: TObject);
Var Doc: IHTMLDocument3;
Begin
WB.Navigate('http://www.programmersforum.ru/showthread.php?t=281607');
While WB.ReadyState<>READYSTATE_COMPLETE Do // While WB.Busy Do
      Application.ProcessMessages;
WB.Document.QueryInterface(IID_IHTMLDocument3, Doc);
Doc.getElementById('posts').style.border:='solid red 40px';
End;
ResourceSpace вне форума Ответить с цитированием
Старый 20.08.2015, 19:07   #7
keholem
Пользователь
 
Регистрация: 20.08.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Код:
Uses MSHTML;

Procedure TForm1.ToolButton1Click(Sender: TObject);
Var Doc: IHTMLDocument3;
Begin
WB.Navigate('http://www.programmersforum.ru/showthread.php?t=281607');
While WB.ReadyState<>READYSTATE_COMPLETE Do // While WB.Busy Do
      Application.ProcessMessages;
WB.Document.QueryInterface(IID_IHTMLDocument3, Doc);
Doc.getElementById('posts').style.border:='solid red 40px';
End;
и что это?
keholem вне форума Ответить с цитированием
Старый 20.08.2015, 20:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
а без цикла не как?
А чем цикл не устроил?
Цитата:
когда нажимаю на кнопку, программа просто завершается без ошибок.
Ну а что показывает в отладке tbls.length?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2015, 20:10   #9
keholem
Пользователь
 
Регистрация: 20.08.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну а что показывает в отладке tbls.length?
Я не понимаю как пользоваться откладчиком, сколько раз пробовал, не чего не выходит.

через try except отловил:

Цитата:
eoleexception ошибка с сообщением: не поддерживается
что это значит?

Последний раз редактировалось Stilet; 21.08.2015 в 09:01.
keholem вне форума Ответить с цитированием
Старый 21.08.2015, 09:04   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
сколько раз пробовал, не чего не выходит.
1) Становишься на строку, с которой будешь отлаживать
2) Жмешь F5 - Появляется точка прерывания (бряк)
3) Просто запускаешь программу (В меню Run выбери запуск и отладчиком)
4) Прога брякается на бряке - начинается отладка
5) Мышкой наводишь на переменную, или свойство - в хинте вылезает ее значени
6) Жмешь F7 - отладка проскакивает на следующий оператор вглубь программы - происходит трассировка (или пошаговка, если по русски)
Цитата:
что это значит?
Скорее всего какой-то из интерфейсов не может быть использован. Нужно знать на какой строке ошибка, поэтому делай пошаговку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка текста в WebBrowser nibufep Общие вопросы Delphi 2 17.08.2015 15:22
Проверка наличия поля в webbrowser Dima170792 Работа с сетью в Delphi 4 01.12.2013 18:48
Проверка окончания загрузки страницы в WebBrowser Vladimir K. Работа с сетью в Delphi 8 31.10.2010 19:20
Проверка текста в webbrowser nenoob1 Работа с сетью в Delphi 3 07.08.2010 02:17
Проверка наличия элемента в Webbrowser Verst Общие вопросы Delphi 6 29.11.2009 16:56