Folgende Situation: ich möchte mir eine Sammlung einiger Standard-WinControls (Edits, Checkbox, Listbox...) erstellen, die allesamt folgendes von mir definiertes Interface implementieren sollen:
Delphi-Quellcode:
ILoadAndSaveToXml = interface(IInterface)
['{C565EF46-47C1-482D-9C71-4570B555BBA4}']
function GetAutoLoadAndSaveToXml: Boolean;
procedure SetAutoLoadAndSaveToXml(const Value: Boolean);
property AutoLoadAndSaveToXml: Boolean read GetAutoLoadAndSaveToXml write SetAutoLoadAndSaveToXml;
procedure LoadFromXml(const XmlElement: IXMLDOMElement);
procedure SaveToXml(const XmlElement: IXMLDOMElement);
end;
Es sollen also alle Controls über die Methoden LoadFromXml, SaveToXml und die property AutoLoadAndSaveToXml verfügen.
Anschließend möchte ich in einer Anwendung mittels ComponentCount alle vorhandenen Controls durchlaufen, schauen ob sie das besagte Interface ILoadAndSaveToXml unterstützen und falls ja, die besagten Methoden aufrufen.
Frage: wie mache ich das?
Das habe ich bisher versucht:
Ich habe mir z.B. ein eigenes Edit wie folgt deklariert:
Delphi-Quellcode:
TMyEdit = class(TEdit, ILoadAndSaveToXml)
private
FAutoLoadAndSaveToXml: Boolean;
function GetAutoLoadAndSaveToXml: Boolean;
procedure SetAutoLoadAndSaveToXml(const Value: Boolean);
published
property AutoLoadAndSaveToXml: Boolean read GetAutoLoadAndSaveToXml write SetAutoLoadAndSaveToXml;
procedure LoadFromXml(const XmlElement: IXMLDOMElement);
procedure SaveToXml(const XmlElement: IXMLDOMElement);
end;
Die Methoden habe ich mit entsprechendem Leben gefüllt. Theoretisch müsste ich auch noch QueryInterface und _AddRef und _Release selbst implementieren, da meine ganzen Controls ja nicht von TInterfacedObject abgeleitet sind, aber das hab ich erstmal weg gelassen.
Alles schön und gut, nur wie finde ich nun zur Laufzeit heraus, ob eine Komponente auf dem Formular das Interface ILoadAndSaveToXml unterstützt, damit ich die Methoden aufrufen kann? Theoretisch ginge das ja über QueryInterface, aber das steht mir nur bei meinen eigenen Controls zu Verfügung, nicht bei allen anderen, die keine von IInterface abgeleitete Schnittstelle implementieren, oder? Oder ist das, was ich hier gerade versuche, ohnehin völliger Blödsinn
? Also Controls, die zusätzlich Interfaces implementieren?
Danke für eure Hilfe!