Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OnChange in eigener Komponente implementieren (https://www.delphipraxis.net/119880-onchange-eigener-komponente-implementieren.html)

Poelser 2. Sep 2008 17:27


OnChange in eigener Komponente implementieren
 
Moin,

ich habe eine kleine Komponente (ein Datumscontrol)), die ich um ein OnChange erweitern möchte. So sieht ihre Deklaration aus:
Delphi-Quellcode:
type
  TDateEditPrevNext = Class(TPanel)
    DateEdit:  TDateEdit;
    Procedure DateEditExit(Sender: TObject);
    Procedure ButtonPrevClick(Sender: TObject);
    Procedure ButtonNextClick(Sender: TObject);
  private
    // Es gibt keinen optisch passenden Button, aber ein Panel tut's auch
    ButtonPrev: TPanel;
    ButtonNext: TPanel;
    function GetDate: TDate;
    procedure SetDate(Datum: TDate);
  public
    property Date: TDate read GetDate write SetDate;
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
  end;
Wenn ich den Weg über
Delphi-Quellcode:
  private
...
    FOnChange: TNotifyEvent;
...
  published
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
gehe, funktioniert das nicht. TPanel hat ja auch kein OnChange, dass hier durchgereicht werden könnte.

Aber wie implementiere ich das richtig?

DeddyH 2. Sep 2008 17:37

Re: OnChange in eigener Komponente implementieren
 
In dem Moment, wo OnChange ausgelöst werden soll, schreibst Du
Delphi-Quellcode:
if Assigned(FOnChange) then
  FOnChange(self);
FOnChange muss im Konstruktor natürlich mit nil belegt werden, sonst gibt es u.U. Probleme.

[edit] Rächtschraibfäller [/edit]

Poelser 2. Sep 2008 18:03

Re: OnChange in eigener Komponente implementieren
 
Danke, funktioniert jetzt mit

Delphi-Quellcode:
...
  private
...
    procedure DateChanged(Sender: TObject);
...

constructor TDateEditPrevNext.Create(AOwner: TComponent);
begin
  FOnChange := nil;
...
  DateEdit.OnChange := Self.DateChanged; // DAS hatte gefehlt!
...

procedure TDateEditPrevNext.DateChanged(Sender: TObject);
begin

  if Assigned(FOnChange) then
  begin
    FOnChange(Self);
  end;

end;
Ich hoffe, dass da nicht noch eine Falle versteckt ist...

sirius 2. Sep 2008 18:12

Re: OnChange in eigener Komponente implementieren
 
Zitat:

Zitat von DeddyH
FOnChange muss im Konstruktor natürlich mit nil belegt werden, sonst gibt es u.U. Probleme.

Beim erstellen einer neuen Instanz wird diese komplett mit 0-en gefüllt. Eine Initialisierung auf 0 oder nil ist daher nicht notwendig.

DeddyH 2. Sep 2008 18:14

Re: OnChange in eigener Komponente implementieren
 
Das hab ich auch immer gedacht, bis ich mal vor längerer Zeit eines Besseren belehrt wurde (D3 oder D4, weiß ich nicht mehr). Außerdem schadet es ja nicht, die Initialisierung selbst vorzunehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz