|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Хитрое копирование текста из WebBrowser
Доброго всем дня!
Очень прошу помочь с проблемой. Проблема в следующем: На неком сайте есть кнопка и пара полей ввода даты. При нажатии на нее, сервер выдает таблицы в виде текста в окне браузера. Изначально на странице есть некая шапка, ниже которой потом приписываются эти таблицы. Суть вот в чем: во втором потоке постоянно проверять наличие некой фразы в тексте веб страницы, и, если кусок фразы присутствует, копировать весь текст в Memo1. Не имею представления как сделать в 1 поток, поэтому стал делать в 2. Если в 1 поток, по при нажатии на кнопку запроса этой таблицы, программа сперва выполнит все sleep и задержки по таймеру, а уж потом отправит запрос на сервер и получит эту таблицу. Я делаю примерно следующее (Все html объекты и ссылки вырезаны) Код:
procedure TForm1.Button1Click(Sender: TObject); var MSt, MEnd: string; HTML_id: variant; HTMLDocument: IHTMLDocument3; begin MSt := ''; MEnd := ''; button1.Enabled := false; If Edit1.Text<>'' then MSt := Edit1.Text else begin showmessage(''); exit; end; If Edit2.Text<>'' then MEnd := Edit2.Text else begin showmessage(''); exit; end; WebBrowser1.Navigate('http://anywebsite.com'); while WebBrowser1.ReadyState<READYSTATE_COMPLETE do Application.ProcessMessages; HTMLDocument:=WebBrowser1.Document as IHTMLDocument3; HTML_id := HTMLDocument.getElementById(''); HTML_id.value := MSt; HTML_id := HTMLDocument.getElementById(''); HTML_id.value := MEnd; HTML_id := HTMLDocument.getElementById(''); HTML_id.click; //перед нажатием последней кнопки (HTML_id.click) //почему-то выполняются все sleep и задержки по таймеру. sleep (100); end; Далее, во втором потоке, пытаюсь отслеживать изменение страницы (получается не очень) Код:
procedure TNewThread.Execute; var HTMLDocument: IHTMLDocument3; begin while Form1.WebBrowser1.ReadyState<READYSTATE_COMPLETE do Application.ProcessMessages; HTMLDocument:=Form1.WebBrowser1.Document as IHTMLDocument3; while pos('некая фраза', Form1.Memo1.Lines.Text) = 0 do begin HTMLDocument:=Form1.WebBrowser1.Document as IHTMLDocument3; Form1.Memo1.Text := HTMLDocument.documentElement.innerText; end; end ; procedure TForm1.Button4Click(Sender: TObject); var NewThread: TNewThread; begin NewThread:=TNewThread.Create(true); NewThread.FreeOnTerminate:=true; NewThread.Priority:=tpLower; NewThread.Resume; end; Что делаю не так? Может какие-то варианты еще есть? В идеале конечно хотелось сделать, чтобы оба потока запускались по нажатию 1 кнопки. голову сломал. Таблица грузится (примерно секунд за 5) на страничку, а вот процесс поиска и копирования никак не желает работать. Вылетает с ошибкой обращения к пустому блоку памяти.... Последний раз редактировалось Darjeeling, 06.12.2011 в 13:57. Причина: Неверное отображение информации |
#2
|
|||
|
|||
Ну хоть какие-нибудь мысли подскажите плз.
|
#3
|
|||
|
|||
Код:
procedure TNewThread.Execute; var HTMLDocument: IHTMLDocument3; begin while Form1.WebBrowser1.ReadyState<READYSTATE_COMPLETE do Application.ProcessMessages; HTMLDocument:=Form1.WebBrowser1.Document as IHTMLDocument3; while pos('некая фраза', Form1.Memo1.Lines.Text) = 0 do begin HTMLDocument:=Form1.WebBrowser1.Document as IHTMLDocument3; Form1.Memo1.Text := HTMLDocument.documentElement.innerText; end; вот это ВСЕ не так, обращение к элементам формы, надо, как миниум, в синхронайз выносить |