Einzelnen Beitrag anzeigen

MatthiasR

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

Re: Eigene VCL-Komponenten, die ein Interface implementieren

  Alt 18. Nov 2009, 08:02
Zitat von Bernhard Geyer:
Zitat von NamenLozer:
Funktioniert der Operator "is" nicht bei Interfaces?
AFAIK nur wenn du für das Interface eine GUID vergibst.
Das hatte ich zu aller erst ausprobiert. Zumindest bei mir beschwert sich der Compiler, wenn ich
if (Components[i] is ILoadAndSaveToXml) then mit folgender Fehlermeldung:
Zitat:
[Fehler] Unit1.pas(39): Operator ist auf diesen Operandentyp nicht anwendbar
Obwohl ich dem Interface eine GUID verpasst habe. Wenn es direkt mit "is" geklappt hätte, hätte ich die Frage hier nicht gestellt
Zitat von Hawkeye219:
Hallo Matthias,

alle von TComponent abgeleiteten Komponenten implementieren (in TComponent) das Interface IInterface - also auch deine speziellen Controls, ohne dass du die entsprechenden Funktionen selbst programmieren musst. Zusätzlich ist in TComponent die Referenzzählung ausgeschaltet, falls du nicht gerade mit COM hantierst und Controls ableitest, die das Interface IVCLComObject implementieren.

Die einfache Abfrage lautet daher

Delphi-Quellcode:
var
  intf: ILoadAndSaveToXml;
begin
  if Supports(Component, ILoadAndSaveToXml, intf) then
    intf.SaveToXML (...);
end;
Für alle nicht von TComponent abgeleiteten Klassen gelten natürlich die von Bernhard gemachten Aussagen bezüglich der gemischten Verwendung von Interface- und Objektreferenzen.

Gruß Hawkeye
Hallo Hawkeye,

danke für die Hintergrundinfos bezüglich TComponent und der "Supports"-Funktion. Genau die haben mir gefehlt. Klar, wenn TComponent bereits IInterface implementiert, dann tun das auch alle WinControls. So muss ich mich dann doch nicht selbst drum kümmern. Außerdem bin ich dann beim Implementieren zusätzlicher Interfaces in meinen eigenen Controls immer auf der sicheren Seite, ohne dass mir die Referenzzählung dabei in die Quere kommt (solange ich die IInterface-Methoden nicht überschreibe). Habs auch schon ausgetestet, funktioniert astrein =) . Womit ich soeben mein erstes eigenes Interface definiert hätte, das noch dazu nen richtig sinnvollen Zweck erfüllt
  Mit Zitat antworten Zitat