Vererbung von Click; und MouseDown; Fail bei MouseDown
Vererbung von Click; und MouseDown; Fail bei MouseDown
Hallo, liebe Gemeinde,
ich bin erst seit heute dabei, um eine Frage zu stellen. Bisher habe ich hier im Forum immer nur lesend teilgenommen und oft hilfreiche Hinweise erhalten. Ich selbst darf mich als erfahrenen Delphi-Programmierer bezeichnen bin seit Turbopascal Ver. 1.0 für DOS (80er Jahre) dabei und mit Pascal/Delphi und nun Lazarus alt (bin nun 63:-) geworden. Habe viel mit Datenbanken gearbeitet und will mich nun auf meine alten Tage in die Komponentenprogrammierung einarbeiten. Mit den Eigenheiten der IDE von Lazarus betr. Bibliothek, Packages etc. bin ich nicht wirklich vertraut.
Zum Problem:
type
TTest = class(TCustomControl)
private
protected
public
procedure click; override;
procedure MouseDown; override;
published
end;
Vorstehende (Rumpf-)Deklaration lässt sich bei mir nicht kompilieren: Während "Click" klaglos vom Compiler akzeptiert wird, lehnt er MouseDown mit der Meldung ab, dass es hierzu keine überschreibbare Vorgänger-Methode gäbe (Error: There is no method in an ancestor class to be overridden: "MouseDown;" ). Merkwürdig, zumal meine Nachforschungen erben haben, dass sowohl "Click" als auch "Mousedown" als virtual in TControl deklariert werden. Und TControl ist in der Ahnenreihe von TCustomControl. Was läuft da schief?
PS: Ich verwende Lararus 2.0.12, FPC 3.2.0 und habe einige vorgefertigte Komponenten mit eingebunden (z. B. EpicTimer)
ich bin erst seit heute dabei, um eine Frage zu stellen. Bisher habe ich hier im Forum immer nur lesend teilgenommen und oft hilfreiche Hinweise erhalten. Ich selbst darf mich als erfahrenen Delphi-Programmierer bezeichnen bin seit Turbopascal Ver. 1.0 für DOS (80er Jahre) dabei und mit Pascal/Delphi und nun Lazarus alt (bin nun 63:-) geworden. Habe viel mit Datenbanken gearbeitet und will mich nun auf meine alten Tage in die Komponentenprogrammierung einarbeiten. Mit den Eigenheiten der IDE von Lazarus betr. Bibliothek, Packages etc. bin ich nicht wirklich vertraut.
Zum Problem:
type
TTest = class(TCustomControl)
private
protected
public
procedure click; override;
procedure MouseDown; override;
published
end;
Vorstehende (Rumpf-)Deklaration lässt sich bei mir nicht kompilieren: Während "Click" klaglos vom Compiler akzeptiert wird, lehnt er MouseDown mit der Meldung ab, dass es hierzu keine überschreibbare Vorgänger-Methode gäbe (Error: There is no method in an ancestor class to be overridden: "MouseDown;" ). Merkwürdig, zumal meine Nachforschungen erben haben, dass sowohl "Click" als auch "Mousedown" als virtual in TControl deklariert werden. Und TControl ist in der Ahnenreihe von TCustomControl. Was läuft da schief?
PS: Ich verwende Lararus 2.0.12, FPC 3.2.0 und habe einige vorgefertigte Komponenten mit eingebunden (z. B. EpicTimer)
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Die Deklaration muss schon übereinstimmen.
So sollte es gehen:
So sollte es gehen:
Code: Alles auswählen
procedure MouseDown(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Tatsache, läuft! Vielen Dank!
Irgendwie komme ich damit noch nicht so gut klar, wann man die Parameter der Methode weglässt und wann nicht.
Nochmals Danke!
Irgendwie komme ich damit noch nicht so gut klar, wann man die Parameter der Methode weglässt und wann nicht.
Nochmals Danke!
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Du musst die gar nie weglassen.schuermr hat geschrieben: Mo 15. Aug 2022, 14:30 Irgendwie komme ich damit noch nicht so gut klar, wann man die Parameter der Methode weglässt und wann nicht.
procedure Click ist ohne Parameter deklariert in TControl (Controls.pas)
Code: Alles auswählen
protected
// key and mouse
procedure Click; virtual;
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Wenn du die Komponente so wie im 1. Beitrag deklariert hast, kannst du auf das Wort "MouseDown" mit gedrückter Ctrl-Taste klicken, und die IDE öffnet die Deklaration des Vorgängers. Dann siehst du genau, welche Argumente die Prozedur benötigt (geht übrigens auch bei Delphi).
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Genau.wp_xyz hat geschrieben: Mo 15. Aug 2022, 15:13 Wenn du die Komponente so wie im 1. Beitrag deklariert hast, kannst du auf das Wort "MouseDown" mit gedrückter Ctrl-Taste klicken, und die IDE öffnet die Deklaration des Vorgängers. Dann siehst du genau, welche Argumente die Prozedur benötigt (geht übrigens auch bei Delphi).
Ich mache meistens Rechtsklick -> "Finde Deklaration von MouseDown" Bzw. "Alt+Hoch". Das geht auch.
Gibt es eigentlich einen funktionalen Unterschied zw. "Alt+Hoch" und "Ctrl+Klick"?
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Ich denke nicht. Gewöhnungssache. Das "Alt+Hoch" scheidet bei mir z.B. aus, weil ich immer mit dem klassischen Tastatur-Layout arbeite, und so hat sich das "Ctrl+Klick" eingebrannt.theo hat geschrieben: Mo 15. Aug 2022, 15:25 Gibt es eigentlich einen funktionalen Unterschied zw. "Alt+Hoch" und "Ctrl+Klick"?
- af0815
- Lazarusforum e. V.
- Beiträge: 6797
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Vererbung von Click; und MouseDown; Fail bei MouseDown
Man muss sich auch daran gewöhnen, das bei Lazarus (und fpc) ALLE Sorcen dabei sind. Und man wirklich überall sich die Deklarationen ansehen kann. Es gibt hier nichts, was aus kommerziellen Gründen versteckt wurde. Das sollte auch mal gesagt werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).