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

Тема в разделе "Delphi - Компоненты", создана пользователем 95, 22 май 2010.

Статус темы:
Закрыта.
  1. 95

    95 Гость

    Сутки добрые, Уважаемые Знатоки!

    Помогите с проблемой в 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 кнопки: сначала переход на страницу, и только потом отображение кода... А нужно всетаки все за один раз... Помогите?
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Выж не дали "парню" времени загрузить документ...
    Применительно к Вашему варианту должно быть приблизительно так:
    Код (Delphi):
    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
    Код (Delphi):
    procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
    begin
    if ((WebBrowser1.Document as IHTMLDocument2).readyState = 'complete') then
    ShowMessage(GetHTMLSource(WebBrowser1));
    end;
    Ну а если Вас интересует мое мнение... WebBrowser не надо использовать... он штука "капризная" (при переносе программу с компа на комп)
    Если требуется просто получить HTML, то лучше используйте NMHTTP или IdHTTP

    Код (Delphi):
     ShowMessage(IdHTTP1.Get('http://www.google.com'));
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей