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
Narses: Code- durch Delphi-Tags ersetztModeriert von
Narses: 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; 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.
jaenicke hat folgendes geschrieben : |
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:
energie hat folgendes geschrieben : |
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
Narses: 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!