Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi MounseOver mit TWebbrowser und Frames... (https://www.delphipraxis.net/66393-mounseover-mit-twebbrowser-und-frames.html)

Mavarik 29. Mär 2006 08:00


MounseOver mit TWebbrowser und Frames...
 
Hallo Zusammen!

Ich habe das Problem, dass ich in einem FrameSet das Element unter der Maus
finden möchte...

Ohne Frames geht es bekanntlich so:

Delphi-Quellcode:
procedure TMainform.WebBrowser1DownloadComplete(Sender: TObject);
begin
  if Assigned(WebBrowser1.Document) then
  begin
    htmlDoc := WebBrowser1.Document as IHTMLDocument2;

    htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch);
  end;
end;

procedure TMainForm.Document_OnMouseOver;

var
  element : IHTMLElement;
begin
  if htmlDoc = nil then Exit;

  element := htmlDoc.parentWindow.event.srcElement;

  if LowerCase(element.tagName) = 'a' then
  begin
    Statusbar1.Simpletext := Format('Link : %s',[element.getAttribute('href',0)]);
  end
  else if LowerCase(element.tagName) = 'img' then
  begin
    Statusbar1.Simpletext := Format('Bild : %s',[element.getAttribute('src',0)]);
  end
  else
  begin
    Statusbar1.Simpletext := Format('TAG : %s',[element.tagName]);
  end;
end;
Wenn es sich dabei aber um eine Frameseite handelt, erhalte ich immer nur den Tag "Frame".

Ich kann Zwar mit:

Delphi-Quellcode:
htmlDoc.parentWindow.frames.length
und
Delphi-Quellcode:
htmlDoc.parentWindow.frames.item(x).Name;
auf den Namen zugreifen, aber wie erhalte ich vom Unterframe die Mausover events und Elemente?


Frank :coder:

toms 29. Mär 2006 08:11

Re: MounseOver mit TWebbrowser und Frames...
 
Hallo

Musstest du dann nicht fuer jedes Frame-Dokument ein onmouseover Ereignis setzen?

Mavarik 29. Mär 2006 08:20

Re: MounseOver mit TWebbrowser und Frames...
 
Zitat:

Zitat von toms
Hallo

Musstest du dann nicht fuer jedes Frame-Dokument ein onmouseover Ereignis setzen?

Nehme ich an, aber wie?

Das htmldoc.patentWindows.frames ist zwar noch ein IHTMLFramesCollection2 Object,
aber dann läuft es für mich ins "schwarze", den htmldoc.patentWindows.frames.item(0) ist
"nur" noch ein OLEVariant...

Um einen MouseOver event zu setzen müsste es schon ein IHTMLDocument2 typ sein!

Ideen?

Frank :coder:

toms 29. Mär 2006 08:31

Re: MounseOver mit TWebbrowser und Frames...
 
Zitat:

Zitat von Mavarik
[
Um einen MouseOver event zu setzen müsste es schon ein IHTMLDocument2 typ sein!

Ideen?

Schau mal hier.

Mavarik 29. Mär 2006 09:34

Re: MounseOver mit TWebbrowser und Frames...
 
OK Danke könnte der richtige Weg zu sein, leider erhalte ich dann eine AV.

Habe es wie folgt gelösst:

Delphi-Quellcode:
procedure TMainform.WebBrowser1DownloadComplete(Sender: TObject);
var
  W : IHTMLWindow2;
  u : IUnknown;
  S : String;
begin
  if Assigned(WebBrowser1.Document) then
  begin
    htmlDoc := WebBrowser1.Document as IHTMLDocument2;
    if htmldoc.parentWindow.frames.length > 0 then
      begin
        u := htmldoc.frames.item(0);
        if Succeeded(u.QueryInterface(IHTMLWindow2,w))
          then begin
                 S := w.name; // Stimmt
                 Caption := S;
                 htmlDoc := W.document as IHTMLDocument2;
               end
          else begin
                 htmlDoc := NIL;
               end;
      end;

    htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver) as IDispatch);
  end;
end;
Leider dann eine AV bei

Delphi-Quellcode:
  element := htmlDoc.parentWindow.event.srcElement;
Frank :coder:

marabu 29. Mär 2006 10:30

Re: MounseOver mit TWebbrowser und Frames...
 
Hallo Frank,

ich würde das Ereignis OnDocumentComplete() von TWebBrowser verwenden - es wird für jeden Frame gefeuert und du brauchst einfach nur dein EventObj anhängen.

Delphi-Quellcode:
procedure TWebForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  doc: IHTMLDocument2;
begin
  if Succeeded(pDisp.QueryInterface(IID_IHTMLDocument2, doc)) then
    doc.onmousemove := TEventObject.Create(Document_OnMouseOver) as IDispatch;
end;
Grüße vom marabu

Mavarik 29. Mär 2006 13:06

Re: MounseOver mit TWebbrowser und Frames...
 
Zitat:

Zitat von marabu
Hallo Frank,

ich würde das Ereignis OnDocumentComplete() von TWebBrowser verwenden - es wird für jeden Frame gefeuert und du brauchst einfach nur dein EventObj anhängen.

Delphi-Quellcode:
procedure TWebForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  doc: IHTMLDocument2;
begin
  if Succeeded(pDisp.QueryInterface(IID_IHTMLDocument2, doc)) then
    doc.onmousemove := TEventObject.Create(Document_OnMouseOver) as IDispatch;
end;
Grüße vom marabu

Leider funktioniert das nicht.. Succeeded ist immer false! Warum auch immer...

Frank :coder:

marabu 29. Mär 2006 13:26

Re: MounseOver mit TWebbrowser und Frames...
 
Vielleicht besser so:

Delphi-Quellcode:
procedure TWebForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  wb2: IWebBrowser2;
begin
  if Succeeded(pDisp.QueryInterface(IID_IWebBrowser2, wb2)) then
    with wb2 as IHTMLDocument2 do
      onMouseMove := TEventObject.Create(Document_OnMouseOver) as IDispatch;
end;
marabu

Mavarik 29. Mär 2006 13:41

Re: MounseOver mit TWebbrowser und Frames...
 
Das war es leider auch nicht!

Hier gibt es eine AV mit "EIntfCastError" Interface nicht unterstützt!

bei
Delphi-Quellcode:
with wb2 as IHTMLDocument2 do
Frank :coder:

toms 29. Mär 2006 14:18

Re: MounseOver mit TWebbrowser und Frames...
 
hallo,

Probiere's mal so:

Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  wb2: IWebBrowser2;
begin
  if Succeeded(pDisp.QueryInterface(IID_IWebBrowser2, wb2)) then
  begin
    htmlDoc := wb2.document as iHTMLDocument2;
    with htmlDoc do
      onMouseMove := TEventObject.Create(Document_OnMouseOver) as IDispatch;
  end;
end;
Nachtrag: Funktioniert so, aber falls mehrere Frames vorhanden sind, gibt's eine AV bei

Delphi-Quellcode:
element := htmlDoc.parentWindow.event.srcElement;
da event = nil ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz