![]() |
Eigene Komponente Event veröffentlichen
Hallo
Ich bin gerade dabei meine erste Komponente für ein FMX Projekt zu erstellen & habe folgenden Code geschrieben:
Delphi-Quellcode:
Ich kann die Komponente soweit auf eine neue Form legen. Sehe aber im Ereignis-Reiter mein Ereignis nicht & kann somit nicht darauf ragieren...
unit TTextBoxDelay;
interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects, FMX.Edit; type TTimerHandlerEvent = procedure(const aSearchText:string) of object; TTextExtension = class(TEdit) private procedure TimerHandler(Sender: TObject); protected public OnTimerDelayed: TTimerHandlerEvent; constructor Create(AOwner: TComponent); override; published procedure TimerDelayed(const SearchText:string); end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TTextExtension]); end; constructor TTextExtension.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TTextExtension.TimerHandler(Sender: TObject); begin end; procedure TTextExtension.TimerDelayed(const searchText:String); begin if Assigned(OnTimerDelayed) then begin OnTimerDelayed(searchText); end; end; end. Ich gehe davon aus, dass das Problem bei "OnTimerDelayed: TTimerHandlerEvent;" liegt, da das nur als Public deklariert ist, wenn ich es aber in published schiebe, bekomme ich eine Fehlermeldung... Bitte um Hilfe, wie ich das richtig mache. DANKE im Voraus |
AW: Eigene Komponente Event veröffentlichen
Im Prinzip geht das so:
Delphi-Quellcode:
type
TTimerHandlerEvent = procedure(const aSearchText:string) of object; TDeineKompo = class(TVorfahr) private FTimerHandlerEvent: TTimerHandlerEvent; procedure Tuwas; published property TimerHandlerEvent: TTimerHandlerEvent read FTimerHandlerEvent write FTimerHandlerEvent; end; ... procedure TDeineKompo.TuWas; begin if Assigned(FTimerHandlerEvent) then FTimerHandlerEvent('Wuppdi'); end; |
AW: Eigene Komponente Event veröffentlichen
Das Event musst du auch als Property definieren. Die Variable im Public muss da weg ins Private und dafür im Published ein Property OnTimerDelayed einfügen:
Delphi-Quellcode:
unit TTextBoxDelay;
interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects, FMX.Edit; type TTimerHandlerEvent = procedure(const aSearchText:string) of object; TTextExtension = class(TEdit) private FOnTimerDelayed: TTimerHandlerEvent; procedure TimerHandler(Sender: TObject); public constructor Create(AOwner: TComponent); override; published property OnTimerDelayed: TTimerHandlerEvent read FOnTimerDelayed write FOnTimerDelayed; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TTextExtension]); end; constructor TTextExtension.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TTextExtension.TimerHandler(Sender: TObject); begin if Assigned(FOnTimerDelayed) then begin FOnTimerDelayed(searchText); end; end; end. |
AW: Eigene Komponente Event veröffentlichen
Wow!
DANKE ! - So schnell & einfach erklärt! |
AW: Eigene Komponente Event veröffentlichen
Ich mach das immer so.
- Den Eventnamen (TTimerDelayed), die private Variable (FTimerDelayed), die private Methode (DoTimerDelayed) und die Property (OnTimerDelayed) immer gleich halten (nur T, F, Do und On davor). So sind die Zugehörigkeiten auch bei größeren Klassen und Kompoenten besser im Überblick zu behalten - Der Event übergibt auch immer den Sender. Gerade bei Kompoenten macht das viel sinn. Und irgendwann wird man es auch so brauchen. Außerdem ist man dann vom Design konform zu anderen Komponenten. - Es reicht, wenn man self erst in der Privaten Methode hinzufügt. Weißt du wahrscheinlich alles schon, aber ich finde so ist die Lesbarkeit und es ist verständlich für die, die sich neu damit beschäftigen.
Delphi-Quellcode:
unit TTextBoxDelay;
interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects, FMX.Edit; type TTimerDelayed = procedure(Sender: TObject; const aSearchText: string) of object; TTextExtension = class(TEdit) private FTimerDelayed: TTimerDelayed ; procedure DoTimerDelayed(aSearchText: string); public constructor Create(AOwner: TComponent); override; published property OnTimerDelayed: TTimerDelayed read FTimerDelayed write FTimerDelayed; end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TTextExtension]); end; constructor TTextExtension.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TTextExtension.DoTimerDelayed(aSearchText: string); begin if Assigned(FTimerDelayed) then begin FTimerDelayed(self, aSearchText); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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