Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Eigene Mausereignisse werden nicht ausgelöst! Warum? (https://www.delphipraxis.net/141719-eigene-mausereignisse-werden-nicht-ausgeloest-warum.html)

DualCoreCpu 14. Okt 2009 22:40


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:
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.
Wer kann mir die Ursache nennen?

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.

Luckie 14. Okt 2009 22:43

Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
 
Lass mal bei der Zuweisung das @ weg, das sieht irgendwie komisch aus.

IIIMADDINIII 14. Okt 2009 22:47

Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
 
warum hast du den constructor 2 mal????

s.h.a.r.k 14. Okt 2009 23:07

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

DualCoreCpu 14. Okt 2009 23:16

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.

s.h.a.r.k 14. Okt 2009 23:24

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:
constructor Create(AOwner: TComponent); // hier fehlt das: override;
Nachdem du das hinzugefügt hast, kann es gehen. Bringt der Compiler keinerlei Warnungen?

himitsu 14. Okt 2009 23:28

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:
constructor Create(AOwner: TComponent); virtual;
procedure DoCreate; virtual;
ich hoffe dir ist das Wort überschreiben (override) aufgefallen, denn der Constructor ist mit Absicht in der VCL als Viruell definiert :zwinker:

IIIMADDINIII 14. Okt 2009 23:39

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.

DualCoreCpu 15. Okt 2009 09:28

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:

JamesTKirk 15. Okt 2009 11:02

Re: Eigene Mausereignisse werden nicht ausgelöst! Warum?
 
Zitat:

Zitat von DualCoreCpu
@Luckie: In Freepascal muss das @ hin, in Delphi dagegen nicht.

Nur um keine Halbwahrheiten hier stehen zu lassen:
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 21:32 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