Delphi-PRAXiS

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...

Mavarik 29. Mär 2006 14:47

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

Zitat von toms

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...

Tja... Und wenn das so ist? Wie kann ich dann auf die Tags unter der Maus zugreifen?

Frank :wiejetzt:

marabu 29. Mär 2006 20:06

Re: MounseOver mit TWebbrowser und Frames...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Frank,

ich hänge mal eine Demo rein und hoffe dass du damit klar kommst. Habe den Code nicht exzessiv getestet und freue mich über jede Rückmeldung (hi toms) und auch Verbesserungsvorschläge.

marabu

Mavarik 30. Mär 2006 08:13

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

Zitat:

Zitat von marabu
Hallo Frank,

ich hänge mal eine Demo rein und hoffe dass du damit klar kommst. Habe den Code nicht exzessiv getestet und freue mich über jede Rückmeldung (hi toms) und auch Verbesserungsvorschläge.

marabu

:dancer: :witch: :dancer2:

Funktioniert super! Vielen Dank, genau das was ich brauche... :bounce1:

Auch wenn ich es nicht so ganz verstehe... Aber wenn ich sehe wie einfach es geht
könnte ich :kotz:

Wieso wird der event den über alle Fenster gesucht?
Delphi-Quellcode:
  for i := Low(wins) to High(wins) do
  begin
    evt := wins[i].event;
    Result := Assigned(evt);
    if Result then Exit;
  end;
Der event kann doch nur vom eigenen Fenster kommen, oder?

LG Frank :coder:

marabu 30. Mär 2006 08:35

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

wenn es einfach aussieht, dann ist das oft ein Qualitätsmerkmal - aber leider nicht immer.

Zitat:

Zitat von Mavarik
Wieso wird der event den über alle Fenster gesucht?

Ich habe immer noch keine Idee, wie ich aus dem event handler heraus das "aktive" Fenster ermitteln kann. Also iteriere ich solange über die Fenster der einzelnen Frames, bis mir ein gültiges event object signalisiert, dass ich das aktive Fenster gefunden habe. Eventuell gibt es ja einen eleganteren Ansatz, aber er fällt mir gerade nicht ein und ich habe auch nicht unbegrenzt Zeit für eine Suche.

Freundliche Grüße vom marabu

toms 30. Mär 2006 08:50

Re: MounseOver mit TWebbrowser und Frames...
 
Hallo marabu

Habe den Code kurz getestet und er scheint gut zu funktionieren. Danke für deine Mühe!

Mavarik 31. Mär 2006 16:50

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

Zitat von marabu
Hallo Frank,

Ich habe immer noch keine Idee, wie ich aus dem event handler heraus das "aktive" Fenster ermitteln kann.

Freundliche Grüße vom marabu

Habe eine Lösung dafür! Interesse? :thumb:

Frank :coder:

toms 31. Mär 2006 17:36

Re: MounseOver mit TWebbrowser und Frames...
 
Klar!

Mavarik 3. Apr 2006 09:04

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

Zitat von toms
Klar!

Also....

Da Du ja selbder den event "feuerst".
Einfach den Event erweitern. Zuerst die Procedure

Delphi-Quellcode:
TObjectProcedure = procedure(Win:byte) of object;
Und dann den Aufruf!

Delphi-Quellcode:
if Assigned(FOnEvent) then FOnEvent(FWin);
Und natürlich den Create:

Delphi-Quellcode:
TEventObject.Create(Document_OnMouseOver,High(htmldoc)) as IDispatch;
mfg Frank :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.

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