Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: IOTA-Frage zur Callbarkeit von Procs unterschiedlicher Notifier untereinander

  Alt 26. Mai 2021, 09:37
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Mai 2021 um 09:54 Uhr)
  Mit Zitat antworten Zitat