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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2014, 21:05   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию html из WebBrowser

Привет.

Пытаюсь получить html код из WB, но без успешно. Поможете?

Код:
function WB_GetHTMLCode(URL: string): string;
  var
    WebBrowser1: TWebBrowser;
    Doc:IHTMLDocument2;
begin
  WebBrowser1.Navigate(URL);
  while WebBrowser1.ReadyState<READYSTATE_COMPLETE do
    begin
      Application.ProcessMessages;
    end;
  Doc:= WebBrowser1.Document as IHTMLDocument2;
  result:=doc.body.innerHTML;
end;
bilibian вне форума Ответить с цитированием
Старый 30.08.2014, 21:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Doc:= WebBrowser1.Document as IHTMLDocument2;
result:=doc.body.innerHTML;
А вот это лучше поместить в OnDocumentComplete компонента браузера а не использовать какой-то бешеный ИМХО цикл для проверки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.08.2014, 22:15   #3
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Stilet, а как это сделать? Ведь сам WebBrowser создается внутри функции.
bilibian вне форума Ответить с цитированием
Старый 30.08.2014, 22:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Кинь на форму веббрайзер. Опиши в дизайне событие. Все. Шалон готов - компонент удаляй. Описание события оставь. Когда будешь создавать браузер динамически пропиши (пример):
Код:
 WebBrowser1.OnDocumentComplete:=Form1OnDocumentComplete;
Цитата:
сам WebBrowser создается внутри функции.
Боюсь что ты ошибаешься
Он у тебя не создается вообще. Это видно по коду. Отсюда кстати и ошибки скорее всего, текст который из тебя видимо выпартизанивать придется.
Ну пентотал натрия у меня закончился, так что тебе повезло. Могу впрочем паяльником...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.08.2014, 22:50   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Могу впрочем паяльником...
Сурово

Цитата:
Сообщение от Stilet Посмотреть сообщение
Отсюда кстати и ошибки скорее всего, текст который из тебя видимо выпартизанивать придется.
Текст ошибки: Access violation at address 0064B6A6 in module 'имя проги.exe'. Read of address 00000444

Цитата:
Сообщение от Stilet Посмотреть сообщение
Боюсь что ты ошибаешься
А как тогда будет правильно?

Последний раз редактировалось bilibian; 30.08.2014 в 22:53.
bilibian вне форума Ответить с цитированием
Старый 30.08.2014, 23:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как тогда будет правильно?
Дак ведь с этого и нужно было начинать.
Код:
WebBrowser1:=TWebBrowser.Create(...);
Вот про TWebBrowser почитай в хелпе, как правильно его создавать. А то ты описал переменку, а создавать ее не потрудился. Отсюда и AV твое. Ну всмысле Акцессус Виолончелиус
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.09.2014, 14:41   #7
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

В общем нифига не получается, пишу так:

Код:
uses mshtml, Vcl.OleCtrls, SHDocVw, Winapi.ActiveX;


type
  POTOK = class(TThread)
    WebBrowser1: TWebBrowser;
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure WB_GetHTMLCode(URL: string);
    procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
  end;


procedure POTOK.WB_GetHTMLCode(URL: string);
begin
  CoInitialize(nil);
  WebBrowser1:=TWebBrowser.Create(nil);
  WebBrowser1.Navigate(URL);
  WebBrowser1.OnDocumentComplete:=WebBrowser1DocumentComplete;
end;


procedure POTOK.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
  var
    Doc:IHTMLDocument2;
begin
  Doc:= WebBrowser1.Document as IHTMLDocument2;
  Form1.Memo3.Text:=doc.body.innerHTML;
  WebBrowser1.Free;
  CoUnInitialize;
end;


procedure POTOK.Execute;
begin
  WB_GetHTMLCode('http://site.ru/');
end;
При запуске ошибок нет, но и html кода тоже не получаю.

Что я делаю не так и где накосячил?

Последний раз редактировалось bilibian; 08.09.2014 в 14:47.
bilibian вне форума Ответить с цитированием
Старый 08.09.2014, 15:46   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Код:
procedure POTOK.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
  var
    Doc:IHTMLDocument2;
begin
  Doc:= WebBrowser1.Document as IHTMLDocument2;
  Form1.Memo3.Text:=doc.body.innerHTML;
  WebBrowser1.Free;
  CoUnInitialize;
end;
Неслыханный бред.

Объект не дождался когда отработает его метод, а в методе вы этот объект убиваете.

И да, потоком является только тот код, который вызывается внутри execute.

Я про синхронизацию уже говорил?
Человек_Борща вне форума Ответить с цитированием
Старый 08.09.2014, 16:19   #9
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Я про синхронизацию уже говорил?
В данном случаем я отправляю html на форму только ради проверки, что все работает, на самом деле html пойдет дальше по потоку.
По этому, чтобы небыло проблем из-за того, что я использую элементы формы в потоке, я делаю все в один поток.

Перенес код в поток и все равно ничего:

Код:
procedure POTOK.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
  var
    Doc:IHTMLDocument2;
begin
  Doc:= WebBrowser1.Document as IHTMLDocument2;
  Form1.Memo3.Text:=doc.body.innerHTML;
end;

procedure POTOK.Execute;
begin
  CoInitialize(nil);
  WebBrowser1:=TWebBrowser.Create(nil);
  WebBrowser1.Navigate('http://site.ru/');
  WebBrowser1.OnDocumentComplete:=WebBrowser1DocumentComplete;
  WebBrowser1.Free;
  CoUnInitialize;
end;
bilibian вне форума Ответить с цитированием
Старый 08.09.2014, 16:24   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
WebBrowser1.OnDocumentComplete:=Web Browser1DocumentComplete;
WebBrowser1.Free;
Так нельзя )
Ты думаешь что браузер заставить поток ждать пока он догрузится, а на самом деле сразу после попытки загрузки ты браузер убиваешь.
Тогда уж сделай переменку OnOk:Boolean; и
Код:
procedure POTOK.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
  var
    Doc:IHTMLDocument2;
begin
  Doc:= WebBrowser1.Document as IHTMLDocument2;
  Form1.Memo3.Text:=doc.body.innerHTML;
  OnOk:=true;
end;

procedure POTOK.Execute;
begin
  OnOk:=false;
  CoInitialize(nil);
  WebBrowser1:=TWebBrowser.Create(nil);
  WebBrowser1.Navigate('http://site.ru/');
  WebBrowser1.OnDocumentComplete:=WebBrowser1DocumentComplete;
  while not OnOk do sleep(10); // Чтоб поток ждал когда брявзерь загрузит свои делишки окончательно
// И только потом помахать ему ручкой
  WebBrowser1.Free;
  CoUnInitialize;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HTML из Webbrowser в Memo Nikk[UA] Работа с сетью в Delphi 6 12.05.2012 16:42
html webbrowser Котеночек Общие вопросы Delphi 6 07.04.2011 03:50
отображение HTML в webbrowser igabenu Помощь студентам 0 29.11.2010 21:51
в WebBrowser html T_I_T_A_N Общие вопросы Delphi 2 07.07.2010 07:28
WebBrowser HTML в файл. Witold Компоненты Delphi 14 23.06.2009 15:00