![]() |
Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Guten Morgen, ich finde mit meinen Suchanfragen leider keine guten Treffer.
Ich würde gerne ein eigenes OnEvent erschaffen für eine selbsterstellte Komponente. Kann mir jemand vielleicht mit einem minimal-Beispiel oder Link auf die Sprünge helfen? Das wäre echt nett! Was ich vorhabe: In meiner Komponente gibt es eine "Aborted" Eigenschaft (Boolean) die auch zielführend gesetzt wird, nun hätte ich gerne ein "OnAborted" Event um sowie als auch darauf reagieren zu können, nur fehlt mir Wissen wie man so etwas macht. Ich habe gestern in vielen Delphi Komponenten krampfhaft versucht herauszufinden wie die Entwickler das vollbringen, leider ohne ans Ziel zu kommen. Für Hinweise "How-To" bin ich sehr dankbar! |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Delphi-Quellcode:
type
TDeineKomponente = class(TComponent) private FOnAborted: TNotifyEvent; ... public procedure Abort; ... published property OnAborted: TNotifyEvent read FOnAborted write FOnAborted; ... end; ... procedure TDeineKomponente.Abort; begin // Abbrechen if Assigned(FOnAborted) then FOnAborted(self); end; |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Du bist mein :angel:
Vielen Dank!!!! |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Zusatz: Du kannst auch statt TNotifyEvent eine eigene Procedure verwenden mit
Delphi-Quellcode:
Dann kannst im Eventhandler die Variable setzen und in deinem Code drauf reagieren
FOnAborted : procedure(var DoAbort : Boolean) of object
Delphi-Quellcode:
Ist manchmal ganz praktisch. Habe auch ewig gebraucht um die Events zu kapieren, aber irgendwann hat es „Click“ gemacht.
Procedure Komponente.Abort
var FAbort : Boolean; Begin FAbort := True if Assigned(FOnAborted) then FOnAborted(FAbort); // Hier kannst dann die Rückgabe von FAbort auswerten und reagieren end; |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Das werde ich beides am Wochenende mal durchtesten, mir fehlte halt absolut ein Anfang, die Delphi Komponenten sind so dermaßen verschachtelt das ich's nicht nachvollziehen konnte.
Vielen lieben Dank für den Zusatz! |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Also ich mach das, gerade in eigenen Componenten, immer so:
Delphi-Quellcode:
So habe ich auch mit self den Sender zur weiteren Verarbeitung und den Event im OI
Type
TOnAbort=proceudre(Sender: TObject; Aborted: Boolean) of object; TMyComponent=class(TComponent) private FOnAbort: TObAbort; procedure DoAbort(Aborted: Boolean); published property OnAbort: TOnAbort read FOnAbort write FOnAbort; end; . . . proceudre DoAbort(Aborted: Boolean); begin if Assigned(FOnAbort) then FOnAbort(self, Aborted); end; . . . procedure Execute; begin . . . . DoAborted(True); end; |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Nur mal so: muss ich in einem "Abbrechen"-Ereignis wirklich mitgeben, ob abgebrochen wurde? Mich persönlich würde das verwirren, wenn nicht abgebrochen wird, wird auch das Event nicht gefeuert.
|
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Zur Klarstellung:
Momentan hat meine Komponente eine read-only property Aborted. Diese wird von meiner Komponente gesetzt/verwaltet. So das man code-seitig abfragen kann "if komponente.Aborted then". Genau das wollte ich mit einem Ereignis (OnEvent) verschönern, so dass der Nutzer der Komponente einfach im Objekt-Inspektor einen Doppelklick auf "OnAborted" macht und dort seinen Code reinschreiben kann der sonst bei "if komponente.Aborted then" zu tragen gekommen wäre. (bis jetzt fand ich noch keine zeit irgendeine Variante auszuprobieren, aber am Wochenende dann) Ist das ein falscher Ansatz? Danke fürs Lesen und Input input input!!! Das hilft mir als Neuling von Komponenten ungemein weiter!! (ich schreib meist nur klassen oder methoden) |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Ich finde den Ansatz sinnvoll. Man kann somit an jeder weiteren Stelle prüfen, ob Aborted gesetzt ist, sich aber zusätzlich auch benachrichtigen lassen, wenn und sobald abgebrochen wird. Denkbar wäre auch noch ein weiteres Event, das gefeuert wird, wenn (bzw. unmittelbar bevor) abgebrochen wird, das einen Boolean-Var-Parameter hat, mit dem man quasi das letzte Wort hat, ähnlich dem OnClose-Event von TCustomForm mit seinem CanClose-Parameter.
|
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
DeddyH Danke, mit dem "zuvor" Nachtrag, an so etwas dachte ich nicht mal ansatzweise.
Es ist toll zu einem Thema verschiedenste Ansichten mitzubekommen, davon lerne ich viel! Ich habe mir erstmal alle Codevorschläge notiert und mal sehen wie ich mit was am besten klarkomme. |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Nochn ein Hinweis: typischerweise gibt mal als ersten Parameter in so einem Event auch den Sender als TObject mit.
Der Aufrufer des Events übergibt dazu einfach Self als dieser Parameter. Vorteil: im Eventhandler hat man bei Bedarf Zugriff auf das auslösende Objekt. |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Es muß nicht immer TSender sein ... falls man seine eigenen Events definiert, dann darf man dort auch direkt die richtige Klasse verwenden.
Aber für so Standard-Events, welche immer die selben Parameter haben, spart man sich einen eigenen Typen oft und verwendet einen der Vordefinierten ala TNotifyEvent. Zitat:
oder wenn man einen allgemeinen Code schreiben will -> Der geht dann auf Sender und man kann den Code auch z.B. in eine andere Form/Programm kopieren, wo die Komponente nicht gleich heißen muß. Und auch wenn man die Komponente umbenennt, knallt es nicht gleich, da ja nicht auf den Namen gegangen wird. |
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Danke Euch beiden :thumb:, ich werde es berücksichtigen!
|
AW: Eigene Komponente -> Wie ein eigenes OnEvent erstellen?
Gibt zu Zeiger auf Funktionen auch Video auf mein Kanal:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz