![]() |
Eigene Mausereignisse werden nicht ausgelöst! Warum?
Hallo,
mit dem folgenden Quelltext will ich meinem Formular eigene Mausereignisse zuweisen, die ich nicht im Objektinspektor erzeugt, sondern als Quelltext geschrieben habe. Leider werden diese Ereignisse nicht ausgelöst.
Delphi-Quellcode:
Wer kann mir die Ursache nennen?
unit MyMouseEvents;
interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs; type TForm1 = class(TForm) private public procedure DoMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); procedure DoMouseMove(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); procedure DoMouseUp(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); constructor Create(AOwner: TComponent); end; implementation constructor TForm.Create(AOwner: TComponent); begin inherited Create(AOwner); OnMouseDown := @DoMouseDown; OnMouseMove := @DoMouseMove; OnMouseUp := @DoMouseUp; end; procedure TForm1.DoMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint ); begin ShowMessage('Maus gedrückt!'); end; procedure TForm1.DoMouseMove(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint ); begin ShowMessage('Maus bewegt!'); end; procedure TForm1.DoMouseUp(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint); begin ShowMessage('Maus losgelassen!'); end; constructor TForm1.Create(AOwner: TComponent); begin inherited Create(AOwner); OnMouseDown := @DoMouseDown; OnMouseUp := @DoMouseUp; end; initialization {$I main.lrs} end. Ich will meiner TForm eigene Mausereignisse zur Laufzeit zuweiesen, also absichtlich nicht per Objektinspektor. Muss ja im Quelltext geanau so gehen. Leider weiß ich nicht was jetz falsch läuft und auch nicht, wie ich das Problem präziser beschreiben kann. |
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
Lass mal bei der Zuweisung das @ weg, das sieht irgendwie komisch aus.
|
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
warum hast du den constructor 2 mal????
|
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
@IIIMADDINIII: Der erste Konstruktor ist auch für TForm und nicht für TForm1. Geht das überhaupt? Ich kann doch nicht derart eine Methode überschreiben oO
|
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
@IIIMADDINIII:
Heißt das, das der Create Konstruktor nicht aufgerufen wird? Klar hätte ich auch FormCreate nehmen können. Aber sollte es nicht auch mit Create gehen? Geht dann natürlich auch nur, wenn Application.CreateForm den Create-Konstruktor intern aufruft. Ich will einfach meinen Quelltext wirklich selber schreiben. Die Unterstützung durch die IDE ist zwar schön bequem, aber ich will den Quellcode auch selber schreiben können. In Mathe kann ich mit dem Taschenrechener oder einem Matheprogramm rechnen. Verstehen werden ich die Materie aber erst, wenn ich das per Hand nachvollzogen habe. Habe aber soeben noch mal mit FormCreate experimentiert. Wenn ich die Zuweisung der Mausereignisse in FormCreate mache werden die Ereignisse auch ausgelöst. Wenn ich die Zuweisung dagegen im Create Konstruktor mache, klappt das nicht. Also wird wohl dieser Konstruktor auch nicht automatisch aufgerufen. |
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
Setz doch mal mit F5 (weiß schon gar nicht mehr welche Taste das war :gruebel: ) einen Breakpoint und führe dein Programm aus. Bleibt das Programm stehen und wird in die IDE gesprungen, so weißt du, dass diese Stelle angesprungen wird!
Den Tipp von Luckie hast du auch schon verfolgt? Zudem steht hinter der folgenden Zeile kein override. Somit überschreibst du die Methode von der Klasse TForm nicht!
Delphi-Quellcode:
Nachdem du das hinzugefügt hast, kann es gehen. Bringt der Compiler keinerlei Warnungen?
constructor Create(AOwner: TComponent); // hier fehlt das: override;
|
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
von der VCL wird der Constructor des Basis-Typs aufgerufen, denn nur diesen kennt die VCL, bzw. der Form-Loader der VCL
was du jetzt machen kannst, wäre z.B. eine dieser beiden Funktionen zu überschreiben
Delphi-Quellcode:
ich hoffe dir ist das Wort überschreiben (override) aufgefallen, denn der Constructor ist mit Absicht in der VCL als Viruell definiert :zwinker:
constructor Create(AOwner: TComponent); virtual;
procedure DoCreate; virtual; |
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
also hier noch einmal zusammengefasst (nicht getestet)
Delphi-Quellcode:
unit MyMouseEvents;
interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs; type TForm1 = class(TForm) private public procedure DoMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); procedure DoMouseMove(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); procedure DoMouseUp(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X,Y:Integer); constructor Create(AOwner: TComponent); override; end; implementation constructor TForm1.Create(AOwner: TComponent); begin inherited Create(AOwner); OnMouseDown := DoMouseDown; OnMouseMove := DoMouseMove; OnMouseUp := DoMouseUp; end; procedure TForm1.DoMouseDown(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint ); begin ShowMessage('Maus gedrückt!'); end; procedure TForm1.DoMouseMove(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint ); begin ShowMessage('Maus bewegt!'); end; procedure TForm1.DoMouseUp(Sender: TObject; Buttons: TMouseButton; Shift: TShiftState; X, Y: Longint); begin ShowMessage('Maus losgelassen!'); end; initialization {$I main.lrs} end. |
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
Danke Euch allen!
Mit override hinter den eigenen Create Konstruktor klappt es. Die Ereignisse werden ausgelöst. Problem geklärt. :hello: @himitsu: Ja, das override ist mir aufgefallen. Aber erst durch den letzten Quelltext. Das hab ich jetzt auch zuerst ergänzt und nun funktioniert es, wie ich wollte. Nun muss DoCreate nicht mehr überschrieben werden. @s.h.a.r.k: Doch, der Compiler hat mich gewarnt. Hab ich wohl wegen der anderen Hinweise übersehen, da im Meldungsfenster gescrollt wird. :gruebel: @Luckie: In Freepascal muss das @ hin, in Delphi dagegen nicht. Danke noch mal Euch allen :cheers: |
Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
Zitat:
Das @ wird in FPC nur im ObjFPC-Modus benötigt, nicht aber im Delphi-Modus. Der Compiler kann somit im ObjFPC-Modus leichter beurteilen, ob das Ergebnis einer Methode oder ein Zeiger auf die Methode gemeint ist (oder kann es der Programmierer leichter beurteilen... oder beide? :gruebel: ). Über den Grund lässt sich noch streiten... :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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