Einzelnen Beitrag anzeigen

MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

Eigene VCL-Komponenten, die ein Interface implementieren

  Alt 17. Nov 2009, 16:32
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!
  Mit Zitat antworten Zitat