Perform и Webbrowser

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 12 дек 2007.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Люди, помогите начинающему программисту, который умеет только делать программы "A+B" и "Hello World!". И который наконец-то нашёл вроде нормальный форум. У меня стоит делфи 7, что бы не было разногласий. Объясните, что надо добавить в программу, что бы она пошла? Я думаю, вы поняли, мне надо кликнуть в окне WebBrowser по ссылке Яндекса через посылание клавиш методом Perform. Посмотреть вложение problem.rar
     
  2. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Если можешь и по-другому, то напиши. Я знаю ещё только SendMessage. Нужен сам факт того, что приложение посылает клавишу в веббраузер.
     
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Да, он реализован, только почёму не открывается страница Яндекса? Или тогда другой вопрос: какие клавиши я должен послать в WebBrowser1, чтобы со страницы C:\index.html я перешёл по ссылке на Яндекс? Я пробовал посылать только VK_TAB и VK_RETURN.
     
  4. zubr

    zubr Гость

    Для: Vadik®
    Непонятно что ты хочешь получить передавая окну WebBrowser сообщение WM_CHAR. Стоит почитать инфу по WebBrowser, гугл еще никто не отменял.
    Тебе надо сделать примерно следующее:
    Код (Text):
    procedure TForm1.Button1Click(Sender: TObject);
    var
    doc:IHTMLDocument2;
    alltags:IHTMLElementCollection;
    links:IHTMLElementCollection;
    link:IHTMLElement;
    begin
    doc:=WebBrowser1.Document as IHTMLDocument2;
    If doc=nil then
    exit;
    alltags:=doc.all as IHTMLElementCollection;
    If alltags=nil then
    exit;
    links:=alltags.tags('a') as IHTMLElementCollection;
    If links=nil then
    exit;
    If links.length=0 then
    exit;
    link:=links.item(0, 0) as IHTMLElement;
    If link=nil then
    exit;
    link.click;
    end;
    Чтобы это работало надо импортировать библиотеку типов Microsoft HTML Object Library, а полученный unit MSHTML_TLB.pas подключить к твоему модулю.
     
  5. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Спасибо, всё работает! Ты даже ответил больше, я собирался задать ещё один вопрос, теперь не придётся ))
     
  6. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Люди, а вот ещё последний вопрос по этой теме. Я знаю, что вы посылали меня искать справочнике в гугле, но думаю изучать делфи не стоит начиная с компонента WebBrowser. Просто хочу сделать одну программку, вот и всё. Поэтому, вот вопрос: как представить загруженный хтмл документ в виде текста? Конечно, я знаю что можно просто кликнуть "Просмотр HTML-кода", но мне надо программным способом, то есть в виде строки. И сразу хочу сказать, чего я хочу этим добиться. При загрузке документа я хочу проверить действительно ли он загрузился или вышла ошибка 404? Буду очень благодарен, если вы напишите сразу готовый код по поводу как узнать есть ли ошибка или нет, но всё же хочу сам поэксперементировать своей идеей со строкой, поэтому больше жду ответа на первый вопрос в этом сообщении.
     
  7. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    преждевременно извиняюсь за свою невнимательность... :eek: но я не нашёл ни onError404 или чего-то подобного, ни метода как представить документ в виде строки ...
     
  8. zubr

    zubr Гость

    Для: sax_ol
    События OnNavigateError нет в WebBrowser.
    Для: Vadik®
    Обрабатывай событие OnStatusTextChange. Что то типа:
    Код (Text):
    procedure TForm1.WebBrowser1StatusTextChange(Sender: TObject;
    const Text: WideString);
    begin
    Memo1.Lines.Add(string(Text));
    end;
    А вот тебе один из нескольких вариантов получения контекста документа:
    Код (Text):
    function TForm1.GetContext:string;
    var
    PersistStream:IPersistStreamInit;
    MemStream:TMemoryStream;
    Stream: IStream;
    SaveResult: HRESULT;
    str:TStringList;
    s:string;
    begin
    Result:='';
    PersistStream:=WebBrowser1.Document as IPersistStreamInit;
    MemStream:=TMemoryStream.Create;
    try
    Stream:=TStreamAdapter.Create(MemStream, soReference) as IStream;
    SaveResult:=PersistStream.Save(Stream, System.True);
    if FAILED(SaveResult) then
    exit;
    str:=TStringList.Create;
    try
    MemStream.Position:=0;
    str.LoadFromStream(MemStream);
    s:=str.Text;
    finally
    str.Free;
    end;
    finally
    MemStream.Free;
    end;
    Result:=s;
    end;
     
  9. zubr

    zubr Гость

    Для: sax_ol
    Не знаю откуда этот дядька взял событие OnNavigateError, в Delphi5-7 такого события нет. Или есть такое событие в TWebBrowser более поздних версий (хотя: These notes are believed to be correct for Delphi 6 and Delphi 7 with Internet Explorer 6, and may apply to other versions as well.), или дядька какую то травку покуривает. :eek:
     
  10. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Спасибо большое! Хотя я ещё и не разбираюсь в таких штуках как стрим, мне это пока и не надо, скоро и так научусь понимать их. Самое главное - мне доступен хтмл код документа в виде строки! :) :(
     
  11. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Люди, а вот ещё вопрос по этой теме. zubr предложил вариант как кликать по ссылке. А если потребуеться, например заполнить автоматически какое-нибудь поле в веббраузере, то как быть?
    например, имеется хтмл-ка:
    Код (Text):
    <HTML>
    <HEAD>
    <TITLE>codeby.net</TITLE>
    </HEAD>
    <BODY>
    <FORM ACTION="xxx">
    <INPUT TYPE="TEXT" VALUE="" SIZE=20>
    <INPUT TYPE="SUBMIT" VALUE="Отправить"><INPUT TYPE="RESET" VALUE="Очистить">
    </FORM>
    </BODY>
    </HTML>
    Как мне можно программно написать в поле "Вадим" и щёлкнуть по кнопке "Отправить"?
     
  12. zubr

    zubr Гость

    Вот тебе пример из DRKB:
    Код (Text):
    procedure TForm1.SubmitPostForm;
    var
    strPostData: string;
    Data: Pointer;
    URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
    begin
    {

    < !-- submit this html form: -->

    < form method=" post" action=" http://127.0.0.1/cgi-bin/register.pl" >

    < input type=" text" name=" FIRSTNAME" value=" Hans" >

    < input type=" text" name=" LASTNAME" value=" Gulo" >

    < input type=" text" name=" NOTE" value=" thats it" >

    < input type=" submit" >

    < /form>

    }

    strPostData := 'FIRSTNAME=Hans& LASTNAME=Gulo& NOTE=thats+it';

    PostData := VarArrayCreate([0, Length(strPostData) - 1], varByte);

    Data := VarArrayLock(PostData);

    try

    Move(strPostData[1], Data^, Length(strPostData));

    finally

    VarArrayUnlock(PostData);

    end;

    URL := 'http://127.0.0.1/cgi-bin/register.pl';

    Flags := EmptyParam;

    TargetFrameName := EmptyParam;

    Headers := EmptyParam; // TWebBrowse

    // эти заголовки соответствующими зна?ениями

    WebBrowser1.Navigate2(URL, Flags, TargetFrameName, PostData, Headers);


    end;
     
  13. Barmutik

    Barmutik Гость

    Для: Vadik&reg;
    Или используя пример zubr пройтись по объектной модели и заполнить нужные поля и нажать на кнопку с помощью её метода Click
     
  14. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Спасибо! Теперь я знаю как правильно использовать Navigate2 :angry:
     
Загрузка...

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