Announcement

Collapse
No announcement yet.

HTML JavaScript events in WebBrowser Komponente abfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HTML JavaScript events in WebBrowser Komponente abfangen

    Hallo,

    ich verwende die TWebBrowser Komponente. Ich möchte hierbei bei jedem Objekt (oder wenigstens einem Anchor) einen Event zuweisen. Nun habe ich die MSHTML Typelibrary schon importiert. Nun ist aber das Problem dass jedes Objekt z.b. beim OnClick einen Event hat der vom Typ OleVariant ist. Meine Frage nun: Was muss ich tun um möglichst unaufwendig dem Objekt einen Event zu übergeben.

    Danke, Martin

  • #2
    Hallo,

    wenn sich das eigene mit Delphi geschriebene Programm an die Events des WebBrowsers anhängen will, muss es ein eigenes Benachrichtigungs-Objekt (in meinem Beispiel <i>THTMLEvent</i>) schreiben und den Interface-Zeiger auf dessen IDispatch-Interface dem Event zuordnen. Das könnte zum Beispiel so aussehen:
    <pre>
    uses OSHTMLEventObj;

    procedure TForm1.FormShow(Sender: TObject);
    var
    aHTMLDoc : IHTMLDocument2;
    aClickHandler: THTMLEvent;
    begin
    WebBrowser1.Navigate('http://www.entwickler-forum.de');
    repeat
    Application.ProcessMessages;
    until WebBrowser1.ReadyState >= READYSTATE_COMPLETE;
    aHTMLDoc:= WebBrowser1.Document as IHTMLDocument2;
    aClickHandler := THTMLEvent.Create(aHTMLDoc);
    aClickHandler.OnEvent:= HTMLDocClickEvents;
    aHTMLDoc.onclick:= aClickHandler as IDispatch;
    end;
    </pre>
    Das eigene COM-Objekt, das den Event-Handler implementiert, muss die IDispatch-Methode <b>Invoke</b> implementieren, um das Event in einen Aufruf der Ereignisbehandlungsmethode umzusetzen:
    <pre>
    function THTMLEvent.Invoke(DispID: Integer; const IID: TGUID;
    LocaleID: Integer; Flags: Word; var Params; VarResult,
    ExcepInfo, ArgErr: Pointer): HResult;
    var
    aHTMLEventObj: IHTMLEventObj;
    begin
    try
    if Assigned(FOnEvent) then
    begin
    aHTMLEventObj:= nil;
    if Assigned(FDocument) and Assigned(FDocument.parentWindow) then
    begin
    aHTMLEventObj:= FDocument.parentWindow.event;
    FOnEvent(aHTMLEventObj);
    end;
    end;
    finally
    Result := S_OK;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Hallo,

      herzlichen Dank für die prompte Antwort. Ich werd's gleich ausprobieren. Ich habe die Message nur zweimal in diese Newsgroup getan, weil bei mir nie angezeigt wird, dass die Message neu ist, was normalerweise ja getan wird indem hinter dem Message-Head eine blaue Statusmeldung angezeigt wird. Dies passiert bei mir oft nie.

      Danke,
      Marti

      Comment

      Working...
      X