2016-04-06 11 views
1

OnBeforeNavigate2 Ereignis tritt mehrmals für ein einzelnes Dokument auf. Das Dokument, das ich lade, enthält iframe, so dass das Ereignis OnBeforeNavigate2 mehrmals ausgelöst wird.Ermitteln der OnBeforeNavigate2-Quelle

Was ich tun möchte, ist herauszufinden, welcher Rahmen es ausgelöst hat und die Navigation abbrechen, wenn Rahmen ausgelöst, und nicht ein Benutzer klicken.

Ich bin etwas sicher, dass ich pDisp Parameter behandeln muß die Rahmenquelle zu bestimmen, und wenn es mit NULL Elternteil oder mit Browser Elternteil - Code würde so etwas tun:

void __fastcall TForm1::EmbeddedWBBeforeNavigate2(TObject *ASender, const IDispatch *pDisp, 
      OleVariant &URL, OleVariant &Flags, OleVariant &TargetFrameName, OleVariant &PostData, 
      OleVariant &Headers, WordBool &Cancel) 
{ 
// This code is supposed to do that... (not in C++) 
//var thisBrowser = pDisp as SHDocVw.WebBrowser; 
//var parent = thisBrowser.Parent as SHDocVw.WebBrowser; 
//bool isFrame = (parent == thisBrowser || parent == null); 
... 
} 

Ich brauche Hilfe in das obige herausfinden und in C++ Builder übersetzen. Wenn das obige die Lösung ist. Oder wenn dies nicht der Fall ist - der Weg, herauszufinden, ob Frame oder Iframe dieses Ereignis oder den Benutzer ausgelöst hat, klicken Sie auf.

Update: (für zukünftige Googler)

fand ich einige andere Lösungen für diese:

bool IsFrame = (EmbeddedWB->ControlInterface != pDisp); 

Original-Beitrag - How do I avoid the OnDocumentComplete event for embedded iframe elements?

Antwort

1

Try this:

void __fastcall TForm1::EmbeddedWBBeforeNavigate2(TObject *ASender, const IDispatch *pDisp, 
      OleVariant &URL, OleVariant &Flags, OleVariant &TargetFrameName, OleVariant &PostData, 
      OleVariant &Headers, WordBool &Cancel) 
{ 
    _di_IWebBrowser thisBrowser = pDisp; 
    _di_IWebBrowser parent = thisBrowser->Parent; 
    bool isFrame = ((!parent) || (parent == thisBrowser)); 
    ... 
} 
+0

Thank Sie für Ihre Antwort - es hat nicht für mich funktioniert, aber es könnte für jemand anderen, ich fand eine andere Lösung und aktualisiert die Frage. Ich denke auch, dass dies die '_di_IWebBrowser2' Schnittstelle benutzen sollte. – Coder12345