Nein, niemals Objekt-Referenzen und Interfaces mischen.
Gib deinen Klassen zusätzlich ein "eigenes" Interface, und speichere dir davon die Referenz in einer Variable.
Delphi-Quellcode:
type
IMyIDENotifier = interface
function GetXYZ: Integer;
procedure SetXYZ(Value: Integer);
procedure ProcABC;
property XYZ: Integer read GetXYZ write SetXYZ;
end;
TMyIDENotifier = class(TNotifierObject, IOTANotifier, IOTAIDENotifier, IMyIDENotifier)
Timer1 : TTimer;
procedure Timer1Timer(Sender: TObject);
private
FXYZ : integer;
function GetXYZ: Integer;
procedure SetXYZ(Value: Integer);
protected
// IOTAIDENotifier
procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: string; var Cancel: Boolean);
procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); overload;
procedure AfterCompile(Succeeded: Boolean); overload;
public
constructor Create;
destructor Destroy; override;
// IMyIDENotifier
procedure ProcABC;
property XYZ: Integer read GetXYZ write SetXYZ;
end; { of "TIDENotifier = class() }
var
MyIDENotifier: IMyIDENotifier;
NotifierIndex: Integer = -1;
procedure Register;
implementation
procedure Register;
var
Services: IOTAServices;
begin
if not Supports(BorlandIDEServices, IOTAServices, Services) then Exit;
MyIDENotifier := TIDENotifier.Create;
NotifierIndex := Services.AddNotifier(MyIDENotifier as IOTANotifier);
Im Interface ist alles Public,
aber was wo in der Klasse ist, ist dem Objekt egal. Hauptsache die Methoden existieren irgendwo und sind von der Position aus zugreifbar,
was auch in einem Vorfahren sein kann, wie z.B. die Methoden für IOTANotifier und IInterface.
Und nicht zu vergessen:
Delphi-Quellcode:
finalization // oder "class destructor TMyIDENotifier.Destroy;"
...
MyIDENotifier := nil;
Services.RemoveNotifier(NotifierIndex);