Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: eigenem Objekt Ereignisse hinzufügen

  Alt 13. Nov 2008, 22:06
Hi,

so muss das aussehen
Delphi-Quellcode:
unit Unit_Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure NameWurdeGeaendert1( Sender : TObject );
    procedure NameWurdeGeaendert2( Sender : TObject; VName, NName : string );
  public
    { Public-Deklarationen }
  end;
  
  TNotifyPersonEvent = procedure( Sender : TObject; VName, NName : string ) of object;

  TPerson = class
  private
    FNName:string;
    FVName:string;
    FOnNameChange1 : TNotifyEvent; // Definition für TNotifyEvent = procedure( Sender : TObject ) of object;
    FOnNameChange2 : TNotifyPersonEvent;
    procedure SetVName( Value : string );
    procedure SetNName( Value : string );
    procedure SetOnNameChange1( Value : TNotifyEvent );
    procedure SetOnNameChange2( Value : TNotifyPersonEvent );
  public
    // Mit property geht das viel schöner :-)
    // den private Bereich mal komplett leer lassen, dann
    // einfach nur diese Zeilen eintippen und dann
    // Shift-Ctrl-C drücken (Code-Completion) und staunen ;-)
    property VName : string read FVName write SetVName;
    property NName : string read FNName write SetNName;
    property OnNameChange1 : TNotifyEvent read FOnNameChange1 write SetOnNameChange1;
    property OnNameChange2 : TNotifyPersonEvent read FOnNameChange1 write SetOnNameChange1;
    constructor Create;
  end;

var
  Form1: TForm1;
  Person:TPerson;

implementation

{$R *.dfm}

constructor TPerson.Create;
begin
  inherited Create;
  FNName := '';
  FVName := '';
end;

procedure TPerson.SetVName( Value : string );
begin
  FVName := Value;
  if Assigned( FOnChangeName1 ) // ist das Gleiche wie: if FOnChangeName1 <> nil
  then
    FOnChangeName1( Self );
  if Assigned( FOnChangeName2 )
  then
    FOnChangeName2( Self, FVName, FNName );
end;

procedure TPerson.SetNName( Value : string );
begin
  FNName := Value;
  if Assigned( FOnChangeName1 )
  then
    FOnChangeName1( Self );
  if Assigned( FOnChangeName2 )
  then
    FOnChangeName2( Self, FVName, FNName );
end;

procedure TPerson.SetOnNameChange1( Value : TNotifyEvent );
begin
  FOnNameChange1 := Value;
end;

procedure TPerson.SetOnNameChange2( Value : TNotifyPersonEvent );
begin
  FOnNameChange2 := Value;
end;

procedure TForm1.NameWurdeGeaendert1( Sender : TObject );
begin
  ShowMessage( 'Der Name wurde geändert!' );
end;

procedure TForm1.NameWurdeGeaendert2( Sender : TObject; VName, NName : string );
begin
  ShowMessage( 'Der Name wurde auf ' + VName + ' ' + NName + ' geändert!' );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Person:=TPerson.Create;

  Person.OnNameChange1 := NameWurdeGeaendert1;
  Person.OnNameChange2 := NameWurdeGeaendert2;
  
  Person.setName('Test_Nachname');
  Person.setFirstName('Test_Vorname');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Listbox1.Clear;
  Listbox1.Items.add(Person.getName());
  Listbox1.Items.add(Person.getFirstName());
end;

end.
cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat