Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#16

AW: Eigenes Objekt welches TLabel, TImage nutzt

  Alt 3. Feb 2016, 10:20
Ich würde gerne ausserhalb des Objekts eine Prozedur definieren, welche ich innerhalb meines Objekts aufrufen kann. Sinn und Zweck soll sein, dass wenn jemand auf ein Image klickt und somit den Button betätigt, soll dies der Anwender aussehalb meines Objektes erfahren, indem seine zuvor definierte Prozedur aufgerufen wird.
Man kann schon was machen, um ein Ereignis in einer Klasse zu erzeugen und in einer aufrufenden Unit auf dieses Ereignis zu reagieren. Ich verwende als Beispiel immer gerne das, was ich ständig mache: Im Datenmodul, das die Datenbank-Zugriffskomponenten enthält, ein Ereignis erzeugen, wenn bestimmte Tabellen gesrcollt werden, um auf diese Weise in der Statusbar der Mainform gewisse Informationen über den ausgewählten Record anzeigen zu lassen.

Schritt 1: Du deklarierst in der Klassen-Unit außerhalb der Klassen-Deklaration einen Ereignis-Typ:
Delphi-Quellcode:
UNIT UnitData;

INTERFACE

USES
  SysUtils, StrUtils, Classes, DBAccess, IBC, DB, MemDS;

TYPE // Das wird außerhalb der Klasse deklariert
  TUpdateStatusbarEvent = Procedure of Object;
  ...
TYPE // ab hier beginnt dann die eigentliche Klasse
  TDatMod = CLASS(TDataModule)
  ...
end.
Schritt 2: Damit hast du nun einen neuen Typ namens TUpdateStatusbarEvent . Nun deklarierst du eine Variable von diesem Typ im Private-Abschnitt:
Delphi-Quellcode:
...
  PRIVATE { Private-Deklarationen }
    Var
      fUpdateStatusbar : TUpdateStatusbarEvent;
...
end.
Schritt 3: Danach erzeugst du ein Property im Public-Bereich:
Delphi-Quellcode:
...
  PUBLIC { Public-Deklarationen  }
...
    Property OnUpdateStatusbar : TUpdateStatusbarEvent read fUpdateStatusbar write fUpdateStatusbar;
...
end.
Schritt 4: In deiner aufrufenden Unit, in der etwas passieren soll, weist du nun dieses Ereignis deines Objekts (deiner Klasse) einer Methode deiner aufrufenden Unit zu, hier der Aktualisierung der Statusbar:
Delphi-Quellcode:
Procedure TFormMain.FormCreate(Sender: TObject);
begin
  ..
  DatMod.OnUpdateStatusbar := StatusBarAktuell; // DatMod ist hier die Variable für die Instanz des Datenmoduls
  ..
end;
Schritt 5: Um nun im Datenmodul ein Ereignis auszulösen, verwende ich folgenden Code genau dort, wo das Ereignis ausgelöst werden soll, z.B. in der AfterScroll-Ereignisbehandlung:
Delphi-Quellcode:
Procedure TDatMod.View_LogAccessAfterScroll(DataSet: TDataSet);
begin
  If Assigned(fUpdateStatusbar) Then fUpdateStatusbar;
end;
In meiner Hauptform wird nun immer dann, wenn sich in dieser Tabelle der Datensatzzeiger ändert (gescrollt wird), die private Methode StatusBarAktuell; aufgerufen.
  Mit Zitat antworten Zitat