Twebbrowser, Просмотр кода, Access Violation

  • Автор темы 95
  • Дата начала
Статус
Закрыто для дальнейших ответов.
9
#1
Сутки добрые, Уважаемые Знатоки!

Помогите с проблемой в TWebBrowser, загрузкой страницы и просмотром кода:

procedure TForm1.SpeedButton1Click(Sender: TObject);
var //StartN,EndN:integer;
i:integer;
s:string;
begin
//идем на страницу
try //обезопасим
WebBrowser1.Navigate('http://www.google.com');
except
ShowMessage('немогу, вруби инет');
end;

//выводим текст исходного кода страницы
ShowMessage(GetHTMLSource(WebBrowse r1));

............ на этом месте выскакивает Access Violation

Функция GetHTMLSource(WebBrowser1):

PersistStream:=WB.Document as IPersistStreamInit;
MStream:=TMemoryStream.Create;
SL:=TStringList.Create;
try
Stream:=TStreamAdapter.Create(MStre am,soReference) as IStream;
GResult:=PersistStream.Save(Stream, True); //тут и выскакивает AV
if FAILED(GResult) then
MessageDlg('Ошибочка при передачи HTML source',mtError,[mbOk],0);
finally
MStream.Position:=0;
SL.LoadFromStream(MStream);
Result:=SL.Text;
MStream.Free;
SL.Free;
end;

Если функцию GetHTMLSource навесить на отдельную кнопку - все, соответственно, работает нормально... только нажимать надо на 2 кнопки: сначала переход на страницу, и только потом отображение кода... А нужно всетаки все за один раз... Помогите?
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Выж не дали "парню" времени загрузить документ...
Применительно к Вашему варианту должно быть приблизительно так:
Код:
uses
ActiveX,MSHTML;

function GetHTMLSource(WebBrowser: TWebBrowser): string;
const
C: Char = #0;
var
ps: IPersistStreamInit;
ms: TMemoryStream;
sa: IStream;
begin
ps := WebBrowser.Document as IPersistStreamInit;
ms := TMemoryStream.Create;
try
sa := TStreamAdapter.Create(ms, soReference) as IStream;

if Succeeded(ps.Save(sa, True)) then
begin
ms.Seek(0,soFromEnd);
ms.WriteBuffer(C,SizeOf(char)); //вставляем завершающий #0 для строки
Result := PChar(ms.memory);
end
else
Result := 'Еще гружу пока... Заходите позже :-)';
finally
ms.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
oblom: Integer;
begin
WebBrowser1.Navigate('http://www.google.com');
oblom := 100; // кол-во попыток получить резульнат

while (oblom > 0) and (( not Assigned(WebBrowser1.Document)) or ((WebBrowser1.Document as IHTMLDocument2).readyState <> 'complete')) do
begin
Sleep(100);
Application.ProcessMessages;
Dec(oblom);
end;

if (oblom > 0) then
ShowMessage(GetHTMLSource(WebBrowser1))
else
ShowMessage('Обломадись... :( Чтото со связью?');

end;
Ну или присадить на событие OnDownloadComplete
Код:
procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
if ((WebBrowser1.Document as IHTMLDocument2).readyState = 'complete') then
ShowMessage(GetHTMLSource(WebBrowser1));
end;
Ну а если Вас интересует мое мнение... WebBrowser не надо использовать... он штука "капризная" (при переносе программу с компа на комп)
Если требуется просто получить HTML, то лучше используйте NMHTTP или IdHTTP

Код:
 ShowMessage(IdHTTP1.Get('http://www.google.com'));
 
Статус
Закрыто для дальнейших ответов.