Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Inkompatible Typen 'TMouseEvent' und 'Procedure'


energie - Mo 08.12.08 18:05
Titel: Inkompatible Typen 'TMouseEvent' und 'Procedure'
Hallo Community!

Ich bin neu bei Delphi und habe gleich mal eine Frage zu den Mausereignissen.

Ich würde gerne eigene Mausereignisse für mein TForm festlegen, und zwar in einer extra Klasse CMouse.

Wenn diese Klasse geladen wird, soll sie die Mausereignisse belegen, dazu verwende ich im Konstruktor folgenden Code(wobei mw mein TForm ist):

Delphi-Quelltext
1:
2:
3:
mw.OnMouseDown := CMouse.OnMouseDown;
mw.OnMouseUp   := CMouse.OnMouseUp;
mw.OnMouseMove := CMouse.OnMouseMove;

Im Interface von CMouse steht folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
protected
procedure OnMouseDown(
  Sender: TObject;
  Button: TMouseButton;
  Shift:  TShiftState;
  X, Y:   Integer
);
procedure OnMouseUp(
  Sender: TObject;
  Button: TMouseButton;
  Shift:  TShiftState;
  X, Y:   Integer
);
procedure OnMouseMove(
  Sender: TObject;
  Shift:  TShiftState;
  X, Y:   Integer
);

Die einzelnen Methoden tun im Moment gar nichts, sie sind aber definiert.

Ich dachte eigentlich, dass es so funktionieren müsse, aber Delphi gibt mir bei der Zuweisung im Konstruktor folgende Fehlermeldung:

Delphi-Quelltext
1:
E2010 Inkompatible Typen: 'TMouseEvent' und 'Procedure'                    


Wie kann ich also die Mausereignisse neu belegen?

MfG

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 08.12.2008 um 21:21


Boldar - Mo 08.12.08 18:24

Du musst wahrscheinlich explizit casten:


Delphi-Quelltext
1:
2:
mw.OnMouseDown := Tmouseevent(CMouse.OnMouseDown);
...


jaenicke - Mo 08.12.08 18:31

Nein, das ist nicht nötig, aber du kannst die Events nicht mit der Methode einer Klasse verknüpfen sondern nur mit den Methoden einer Instanz einer Klasse.
Zum Beispiel im Kontruktor deiner Klasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor CMouse.Create;
begin
  mw.OnMouseDown := OnMouseDown;
    // oder Self.OnMouseDown
    // aber nicht CMouse.OnMouseDown
end;
Deine nicht gerade normale Typenbezeichnung fördert natürlich solche Fehler, eigentlich werden Typen und Klassen immer mit T am Anfang gekennzeichnet und Instanzen davon ohne dieses T. So bin ich bei CMouse zunächst davon ausgegangen, dass es eine Variable vom Typ TCMouse sei...

Deine abenteuerliche Codeformatierung ist ja nicht so wichtig solange der Code nicht veröffentlicht werden soll ;-).


energie - Mo 08.12.08 21:53

Sehr vielen Dank!
Hat super funktioniert.
Den selben Fehler hatte ich dann auch mit der Tastatur - ist jetzt auch behoben.
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Deine nicht gerade normale Typenbezeichnung fördert natürlich solche Fehler, eigentlich werden Typen und Klassen immer mit T am Anfang gekennzeichnet und Instanzen davon ohne dieses T. So bin ich bei CMouse zunächst davon ausgegangen, dass es eine Variable vom Typ TCMouse sei...

Deine abenteuerliche Codeformatierung ist ja nicht so wichtig solange der Code nicht veröffentlicht werden soll ;-).

:oops: Wie gesagt, habe gerade erst mit Delphi angefangen, der Coding-Style ist mir also noch neu.
Das C steht für Class, aber jetzt hab ichs umgeändert, aber was ist an meiner Codeformatierung abenteuerlich?
Gibt es da Standards, die ich nicht beachtet habe? Wenn ja, wo kann man sich denn mal einlesen?

Nochmals vielen Dank für die schnelle und vor allem gute Hilfe,
MfG


jaenicke - Mo 08.12.08 22:03

Naja, der Code, den Delphi selbst erzeugt, der sieht eigentlich ganz gut aus, zum Beispiel habe ich das noch nie gesehen:
user profile iconenergie hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
protected
procedure OnMouseDown(
  Sender: TObject;
  Button: TMouseButton;
  Shift:  TShiftState;
  X, Y:   Integer
);
procedure OnMouseUp(
  Sender: TObject;
  Button: TMouseButton;
  Shift:  TShiftState;
  X, Y:   Integer
);
procedure OnMouseMove(
  Sender: TObject;
  Shift:  TShiftState;
  X, Y:   Integer
);
Das bläht das ganze extrem auf, sobald du ein wenig mehr Code hast musst du ewig scrollen. ;-)
Normalerweise bricht man das bei ca. 80 Zeichen um, damit es auf den Bildschirm gut passt (mit den anderen Bestandteilen der IDE daneben).

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
protected
  procedure OnMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
  procedure OnMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer);
  procedure OnMouseMove(Sender: TObject; Shift: TShiftState; 
    X, Y: Integer);
So macht es Delphi selbst auch ;-).

Es gibt auch einen deutschen Styleguide dazu:
http://www.delphi-treff.de/delphi-styleguide/einfuehrung/
und einen auf englisch, der sich an den Regeln der Entwickler von Delphi orientiert:
http://dn.codegear.com/article/10280
und eine davon abgeleitete Version für das Projekt JEDI:
http://homepages.borland.com/jedi/jvcl/StyleGuide.htm

Das sind Vorschläge, grundsätzlich geht es darum den Code kompakt und dennoch übersichtlich zu halten. Und je einheitlicher der Code ist, desto besser lesbarer für andere. ;-)

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


energie - Mo 08.12.08 22:25

Danke für den Styleguide.
Dass es kompakt und lesbar sein soll, ist natürlich klar, ich bin schließlich auch faul und möchte nicht so viel tippen ;)
Dennoch finde ich vertikale Formatierung sehr hübsch und möchte der Lesbarkeit zu Liebe auch nicht alle Parameter so nah beieinander quetschen.

Außerdem finde ich es schöner wenn man bei Methodenaufrufen ein Leerzeichen nach der öffnenden und vor der schließenden Klammer setzt, und viel mehr Tipparbeit ist es auch nicht. Dafür erhöht es m.E. die Lesbarkeit enorm.

<iro>Und auf meinem kleinen Bildschirm kann ich in der großen IDE auch gar nicht bis zur 80. Spalte schreiben, dann sehe ich nur noch die Hälfte</iro>;)

MfG