AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Eigene Mausereignisse werden nicht ausgelöst! Warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Mausereignisse werden nicht ausgelöst! Warum?

Ein Thema von DualCoreCpu · begonnen am 14. Okt 2009 · letzter Beitrag vom 15. Okt 2009
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

Eigene Mausereignisse werden nicht ausgelöst! Warum?

  Alt 14. Okt 2009, 23:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 14. Okt 2009, 23:43
Lass mal bei der Zuweisung das @ weg, das sieht irgendwie komisch aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
IIIMADDINIII
(Gast)

n/a Beiträge
 
#3

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

  Alt 14. Okt 2009, 23:47
warum hast du den constructor 2 mal????
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

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

  Alt 15. Okt 2009, 00:07
@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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#5

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

  Alt 15. Okt 2009, 00:16
@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.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

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

  Alt 15. Okt 2009, 00:24
Setz doch mal mit F5 (weiß schon gar nicht mehr welche Taste das war ) 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!
constructor Create(AOwner: TComponent); // hier fehlt das: override; Nachdem du das hinzugefügt hast, kann es gehen. Bringt der Compiler keinerlei Warnungen?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 15. Okt 2009, 00:28
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
$2B or not $2B
  Mit Zitat antworten Zitat
IIIMADDINIII
(Gast)

n/a Beiträge
 
#8

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

  Alt 15. Okt 2009, 00:39
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.
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#9

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

  Alt 15. Okt 2009, 10:28
Danke Euch allen!

Mit override hinter den eigenen Create Konstruktor klappt es. Die Ereignisse werden ausgelöst. Problem geklärt.

@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.

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

Danke noch mal Euch allen
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#10

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

  Alt 15. Okt 2009, 12:02
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? ). Über den Grund lässt sich noch streiten...
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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