1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

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

    95 Гость

    Репутация:
    0
    Сутки добрые, Уважаемые Знатоки!

    Помогите с проблемой в 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

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Выж не дали "парню" времени загрузить документ...
    Применительно к Вашему варианту должно быть приблизительно так:
    Код:
    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'));
     
Загрузка...
Статус темы:
Закрыта.

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