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