Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Webbrowser.OleObject mittels Vorfahren erreichen

  Alt 14. Dez 2010, 15:10
Da ich nur einmal kurz mit der TEmbeddedWb-Komponente gearbeitet hatte, bin ich dafür sicher kein Experte.

Ich habe allerdings das Beispiel aus Interesse einmal getestet: Und bei mir war schon nach Document Schluß. Also liefert OleObject schon keinen Zeiger auf Document. Da OleObject eine Variante als Ergebnis liefert, wird anschießend versucht, über _DispInvoke in der Unit Variants einen Zeiger auf Document zu erhalten. Das geschieht durch den Aufruf von VarDispInvoke in der Unit ComObj. Innerhalb dieser Prozedur wird mit GetIDsOfNames die DispatchID von Document innerhalb des Objektes OleObject ermittelt (203). Das funktioniert auch - deshalb wird im Anschluß DispatchInvoke aufgerufen. Hier treten die Probleme auf: Mein Delphi-Compiler (Delphi2010) interpretiert meinen Untersuchungen zufolge den Aufruf von Document aus den RTTI als Methode (DISPATCH_METHOD). Dabei hatte ich mein Formular mit dem Schalter {$METHODINFO ON} compiliert. Document ist aber eine Eigenschaft des übergeordneten Objektes (genauer gesagt: Es ist selbst wieder ein COM-Objekt). Und hier scheint der Fehler aufzutreten: Document wird aufgerufen, statt einen Zeiger auf dieses Objekt zu ermitteln. Dieser wäre nämlich notwendig, um sich zum nächsten Objekt (All) "durchzufragen".

Lange Rede, kurzer Sinn: So scheint das leider nicht zu funktionieren.

Da ich bei meinem aktuellen Projekt ebenfalls auf einige Bugs innerhalb der Ole-Umsetzung gestoßen bin, habe ich das anders gelöst:
Delphi-Quellcode:
procedure SetProperty(WebBrowser: TWebBrowser; NodeName, PropertyName: String; Value: OleVariant);
var
  All, Node: OleVariant;
begin
  //"All"-Objekt des Dokumentes ermitteln:
  All:=GetProp(WebBrowser.Document,'all');
  //HTML-Element aus dem "All"-Objekt ermitteln:
  Node:=GetProp(All,NodeName);
  //Eigenschaft des HTML-Elementes setzen:
  SetProp(Node,PropertyName,Value);
end;
Habe ich gerade getestet - funktioniert.
Die notwendigen Funktionen GetProp und SetProp habe ich aus der Unit BrowserTools im Downloadbereich der aktuellen Toolbox-Ausgabe. Dort die Source zum Beitrag Delphi und Google Maps.
Thomas Nitzschke
  Mit Zitat antworten Zitat