Einzelnen Beitrag anzeigen

Thom

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

AW: Webbrowser.OleObject mittels Vorfahren erreichen

  Alt 15. Dez 2010, 14:26
Hallo oki,
da hast Du natürlich Recht:
In deiner Funktion übergibst du einen Parameter vom Typ TWebBrowser. Ich denke mal, du gehst davon aus, dass ich dann sicher TEmbeddedWB benutzen muss und die beiden nicht "kompatibel" sind.
Da diese Prozedur aber nur das Interface von Document benötigt, könnte das einfach abgewandelt werden:
Delphi-Quellcode:
procedure SetProperty(Document: IDispatch; NodeName, PropertyName: String; Value: OleVariant);
var
  All, Node: OleVariant;
begin
  //"All"-Objekt des Dokumentes ermitteln:
  All:=GetProp(Document,'all');
  //HTML-Element aus dem "All"-Objekt ermitteln:
  Node:=GetProp(All,NodeName);
  //Eigenschaft des HTML-Elementes setzen:
  SetProp(Node,PropertyName,Value);
end;
Damit wäre es dann egal, ob das Dokument aus TWebBrowser.Document oder TEmbeddedWB.Document (bzw. TEmbeddedWB.OleObject.Document) stammt.

Ist aber unwichtig: Ich habe das Ganze heute noch einmal - im Gegensatz zu gestern - in einem neuen Projekt ausprobiert. Da hatte ich das einfach in mein aktuelles Projekt "integriert". Und siehe da: Es funktioniert! Das ist schon recht interessant, wie da der Compiler im Hintergrund "herumzaubert", so dass es - abhängig von den Randbedingungen - mal funktioniert und mal nicht...

Zu Deiner Frage: Du brauchst zum Zugriff auf das HTML-Element also nur - wie schon erwähnt - das Interface des Document-Objektes. Dabei ist es egal, ob es als IDispatch oder "verpackt" als (Ole-)Variant vorliegt. Damit der Compiler aber solchen Quelltext wie
Document.Irgendwas.NochWasAnderes akzeptiert, ist die Verwendung einer Variante besser. Schließlich generiert der Compiler hier den Code nur auf "gut Glück", da er noch nicht wissen kann, ob die Zeiger auch wirklich existieren. Erst zur Laufzeit "fragt" sich das Programm dann recht aufwändig (siehe mein erster Beitrag) von Objekt zu Objekt durch.

Praktisch bedeutet das: Du mußt von der Unit, die die Browser-Komponente beherbergt, das Document-Interface an die Unit, von der aus Du auf die Browser-Komponente zugreifen möchtes, weiterreichen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  EmbeddedWB1.LoadFromFile('Test.html');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Document:=EmbeddedWB1.Document;
end;
Von dort aus kannst Du dann ohne dem Wissen, aus welcher Browser-Komponente das Dokument stammt, darauf zugreifen:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  Element: Variant;
begin
  if VarIsType(Document,varDispatch) then
  begin
    Element:=Document.All.Item('Test');
    if not VarIsClear(Element)
      then Element.InnerText:=Edit1.Text
      else ShowMessage('Element nicht gefunden');
  end;
end;
Ich habe das Ganze mal als Zip-Datei angehängt.
Miniaturansicht angehängter Grafiken
bild1.jpg   bild2.jpg  
Angehängte Dateien
Dateityp: zip EmbeddedWB_Test.zip (580,4 KB, 14x aufgerufen)
Thomas Nitzschke

Geändert von Thom (15. Dez 2010 um 14:38 Uhr)
  Mit Zitat antworten Zitat