![]() |
Re: Objektereignisse bearbeiten
Es ist sinnvoll, sich an den Standard (bezüglich der Namensgebung) der VCL zu halten.
Hier erst mal die Vorlage:
Delphi-Quellcode:
Das Property für das Event greift üblicherweise direkt auf die Eventvariable zu; Set- oder Getfunktionen werden nicht gebraucht.
TMyClass = class(TPersistent)
private FOnChange: TNotifyEvent; protected procedure DoChange;dynamic; public property OnChange: TNotifyEvent read FOnChange write FOnChange; end; procedure TMyClass.DoChange; begin if Assigned(FOnChange) then FOnChange(self); end; Soll heissen: hinter read und write steht eine Variable, keine Methode. Das Event soll nicht direkt aufgerufen werden, sondern wird indirekt über die Do-Procedure aufgerufen. Die Do-Procedure ist die einzige Stelle in der ganzen Klasse, an der auf die Eventvariable FOnChange zugegriffen wird!! Jetzt kommt der Trick: Die Procedure DoChange ist virtuell. Damit kann man in abgeleiteten Klassen den Zeitpunkt, wann der Event aufgerufen wird verändern. In 95% aller Fälle wird man die Procedure DoChange nicht überschreiben wollen; das Standardverhalten reicht meisten aus. Deshalb ist die Procedure mit dem Schlüsselwort dynamic versehen; dies spart Speicherplatz. |
Re: Objektereignisse bearbeiten
danke, das versteh' ich! Aber wie schreibe ich jetzt die entsprechende Ereignisbehandlungsroutine für das Objektproperty "OnChange" in der Haupt-Unit (habe für's Objekt eine extra Unit)? Wie verbinde ich dieses Property OnChange jetzt mit meinem Ereignis-Bearbeitungs-Prozedurnamen in der Haupt-Unit (was ich sonst ja komfortabel im Objektinspektorfenster machen kann)?
Z.B.: ich habe in meinem Objekt 2 Buttons erzeugt, bei Klick darauf soll dieses o.g. OnChange ausgelöst + in der Hauptunit bearbeitet werden. 1. Wie mache ich das? 2. Wie werte ich dann aus, welcher von beiden geklickt wurde? :| |
Re: Objektereignisse bearbeiten
Auch wenn das Thema schon drei Monate alt ist, möchte ich dennoch hier posten, denn meine Frage passt thematisch gut in diesen Thread.
Ich arbeite noch an meiner Komponente TWechselButton und versuche nun, die Events hinzubekommen. Dazu habe ich hier in der DP diesen Thread gefunden, und auch versucht meine Events nach diesem Schema hier zu programmieren. Leider tut sich überhauptnichts. :( Wenn ich in einem fertigen Test-Programm auf meine Komponente klicke, wird weder die Aktion ausgeführt, die ich zur Entwicklungszeit in die Ereignisbehandlungsroutine "OnMouseDown" geschreiben habe, noch die automatische Wertzuweisung, die ich versucht habe in die Komponente zu implementieren. Aber vieleicht sollte ich das an ein wenig Code deutlich machen:
Delphi-Quellcode:
Mein Ziel ist nun folgendes: Wenn auf die Komponente geklickt wird, soll OnMouseDown die Variable "b_MouseDown" auf True gesetzt, und die Komponente neu gezeichnet werden. OnMouseUp soll es dann umgekehrt gemacht werden.
type
Wechselbutton = class(TCustomControl) private FOnMouseDown :TNotifyEvent; protected Procedure DoChange; dynamic; public published Property OnMouseDown: TNotifyEvent read FOnMouseDown write FOnMouseDown; end; implementation Procedure Wechselbutton.DoChange; begin if Assigned(FOnMouseDown) then Begin FOnMouseDown(self); b_MouseDown := True; //Bei jedem OnMouseDown soll b_MouseDown auf TRUE gesetzt werden! End; end; An beiden Methoden soll der Entwickler aber nicht mehr dran rumfummeln müssen (muss er bei TButton ja auch nicht), das heisst, die Methoden sollten in der Komponente aufgerufen werden. Zusätzlich soll der Entwickler, natürlich wie gewohnt über den Objektinspektor, Ereignisse meiner Komponente behandeln können. Ich denke mal, in der Prozedur DoChange steckt irgendwo der Wurm drin. :gruebel: Könnt ihr mir sagen, wo? :stupid: MfG, hanselmansel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 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