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.