AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE IOTA-Frage zur Callbarkeit von Procs unterschiedlicher Notifier untereinander
Thema durchsuchen
Ansicht
Themen-Optionen

IOTA-Frage zur Callbarkeit von Procs unterschiedlicher Notifier untereinander

Ein Thema von r29d43 · begonnen am 25. Mai 2021 · letzter Beitrag vom 26. Mai 2021
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 25. Mai 2021, 21:12
Was aber aufgrund der in IOTA-Packages fehlenden <IdeNotifer : TIDENotifer> -Zeile da jetzt leider nicht geht.
Würde es das geben, wie sollte man dann mit mehreren Notifier-Instanzen des gleichen Typs umgehen?

(Das gilt übrigens analog auch für mehrere Form-Instanzen, weshalb diese globalen Variablen für viele Entwickler sogar tabu sind und gezielt gelöscht werden.)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 25. Mai 2021, 22:14
@himitsu. Kannst du das vllt. noch etwas genauer erklären? Thx.


@Uwe Raabe. Genauso wie ich auch mit mehreren Form-Instanzen eines gleichen Form-Typs umgehen würde? Die ich dann nämlich gleich dynamisch erzeugen würde. Und dann wäre auch der Rest meines Progs schon darauf eingestellt und könnte damit auch umgehen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 25. Mai 2021, 22:41
Genauso wie ich auch mit mehreren Form-Instanzen eines gleichen Form-Typs umgehen würde? Die ich dann nämlich gleich dynamisch erzeugen würde. Und dann wäre auch der Rest meines Progs schon darauf eingestellt und könnte damit auch umgehen.
Aber erzeugst du die Notifier nicht auch dynamisch?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 26. Mai 2021, 08:22
Aber erzeugst du die Notifier nicht auch dynamisch?

Besten Dank für den Tipp, hat funktioniert.

Ich habe das obige Beispiel jetzt in der Register-Proc dementsprechend umgebaut, so dass ich nun faktisch die gleichen Bedingungen habe, wie in einem normalen Delphi-Prog bzgl. der dort jeweils deklarierten Formularen:

Delphi-Quellcode:
unit readEditorCode_Unit;

interface

uses ToolsAPI, Winapi.Windows, Winapi.Messages, Registry, vcl.ExtCtrls, vcl.Controls, system.Rtti,

TIDENotifier = class(TNotifierObject, IOTANotifier, IOTAIDENotifier)
    Timer1 : TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    ...
  public
    // IOTAIDENotifier
    VarXYZ : integer; // <--------
    procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: string; var Cancel: Boolean);
    procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); overload;
    procedure AfterCompile(Succeeded: Boolean); overload;
    constructor Create;
    destructor Destroy; override;
    procedure ProcABC; // <--------
  end; { of "TIDENotifier = class() }

var
  IDENotifier1 : TIDENotifier;
  NotifierIndex: Integer = -1;

procedure Register;

implementation

uses vcl.Dialogs, system.SysUtils, shellapi, EditServiceNotifer;

procedure Register;
var
  Services: IOTAServices;
begin
  if not Supports(BorlandIDEServices, IOTAServices, Services) then Exit;
  IDENotifier1 := TIDENotifier.Create;
  NotifierIndex := Services.AddNotifier(IDENotifier1);
end;

usw. usf..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Mai 2021, 08: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);
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 26. Mai 2021, 10:47
Dank auch dafür.
Nein, niemals Objekt-Referenzen und Interfaces mischen.

Gib deinen Klassen zusätzlich ein "eigenes" Interface, und speichere dir davon die Referenz in einer Variable.
Allerdings solltest du jetzt event. auch noch genau erklären warum. (Weil meine Lösung sieht dagegen ja eigentlich viel naheliegender und einfacher aus).
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 26. Mai 2021, 11:26
Wenn die Interfaces das automatische Reference Counting nutzen kannst Du sonst nicht sicher sein, dass das Objekt nicht bereits freigegeben wurde während Du die Objektvariable noch benutzt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 26. Mai 2021, 11:33
Dank auch dafür.
Nein, niemals Objekt-Referenzen und Interfaces mischen.

Gib deinen Klassen zusätzlich ein "eigenes" Interface, und speichere dir davon die Referenz in einer Variable.
Allerdings solltest du jetzt event. auch noch genau erklären warum. (Weil meine Lösung sieht dagegen ja eigentlich viel naheliegender und einfacher aus).
Du bist seit 14 Jahren hier im Forum und wirst doch schonmal mitbekommen haben warum man das nicht macht.
Bei Google suchenObjekt-Referenzen und Interfaces mischen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz