Hallo Christian,
du benutzt bestimmt TXMLDocument aus der Palettenseite "Internet".
Dein
XML-Dokument ist nicht optimal aufgebaut, aber ich nehme an, dass es vorgegeben ist.
Die Item-Elemente sind nicht geschlossen, wohl ein Fehler beim abtippen?
Hier mein Ansatz unter Verwendung deines korrigierten
XML-Dokument:
Delphi-Quellcode:
procedure SetProperty(comp: TComponent; const propName: string; value: Variant);
var
ppi: TypInfo.PPropInfo;
begin
ppi := GetPropInfo(comp, propName);
if Assigned(ppi) then
SetPropValue(comp, propName, value);
end;
procedure Localize(comp: TComponent; doc: IXMLDocument);
var
i: Integer;
attr, elem, group: IXMLNode;
groupName: string;
begin
groupName := Copy(comp.ClassName, 2, Maxint);
group := doc.DocumentElement.ChildNodes[groupName];
if Assigned(group) then
begin
elem := group.ChildNodes[comp.Name];
if Assigned(elem) then
for i := 0 to Pred(elem.AttributeNodes.Count) do
begin
attr := elem.AttributeNodes[i];
SetProperty(comp, attr.NodeName, attr.NodeValue);
end;
end;
end;
procedure TDemoForm.FormCreate(Sender: TObject);
var
doc: IXMLDocument;
nl: IXMLNode;
i: Integer;
begin
doc := LoadXMLData(Memo.Text);
doc.Active := True;
Localize(Button1, doc);
// ...
end;
Besser wäre die Abbildung der Container-Hierarchie des Formulars, denn durch Gruppierung nach Klassen kannst du mit deinem
XML-Dokument nur eindeutige Komponentennamen auflösen. Wäre die Abbildung vorhanden, dann könnte man Localize() zu einer rekursiven Funktion umgestalten und die ganze Form mit einem Aufruf lokalisieren.
Grüße vom marabu