Events bei dynamisch erzeugten Objekten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Events bei dynamisch erzeugten Objekten

Beitrag von klausi1305 »

Hallo,

ich weiß das Thema ist ausgelutscht und ich suche auch schon den ganzen Tag nach ner Lösung im Netz etc.
Ich will bei nen dynamisch erzeugten Image nen OnMouseDown Event festlegen.

ich habe in meiner Klasse TSpielfeld
folgendes im Interface

Code: Alles auswählen

Protected
       procedure   MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);                 
die Procedure in der Unit sieht sehr leer aus

Code: Alles auswählen

 
procedure TSpielfeld.MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  showmessage('Klick');
end;                        
und hier kommt der Fehler wenn ich das OnMouseDown Event an ein dyn. Image einbinden will

Code: Alles auswählen

MyGitternetz :=TImage.Create(NIL);//Gitternetz Image erzeugen
         MyGitternetz.Parent:= MyScrollbox;
         MyGitternetz.Top:=0;
         MyGitternetz.Left:=0;
         MyGitternetz.OnMouseDown:=MouseDown;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);    
 
es kommt jedesmal "wrong numbers of parameters to call onmousedown....

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2815
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Events bei dynamisch erzeugten Objekten

Beitrag von m.fuchs »

[quote="klausi1305"]

Code: Alles auswählen

MyGitternetz.OnMouseDown:=MouseDown; 
In dieser Zeile versuchst du MouseDown aufzurufen und sein Ergebnis MyGitternetz.OnMouseDown zuzuweisen. Das scheitert aus zwei Gründen:
1.) MouseDown ist eine Prozedur, hat also keinen Rückgabewert.
2.) Die notwendigen parameter für MouseDown lieferst du nicht mit. Das bemängelt der Compiler.

Was du aber möchtest ist einen Zeiger auf die Prozedur an MyGitternetz.OnMouseDown zuzuweisen. Das geht so:

Code: Alles auswählen

MyGitternetz.OnMouseDown:=@MouseDown; 
Und die nächste Zeile...
[quote="klausi1305"]

Code: Alles auswählen

  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
... ist einfach nur Grütze. :wink:
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Re: Events bei dynamisch erzeugten Objekten

Beitrag von klausi1305 »

:shock: das @ war es??

Die Zeile "Grütze" ist natürlich schwerer Mist....die sollte da auch nie hin..die kam durch das rumfingern um den Compilerfehler zubeheben...

was bedeutet das @??

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2815
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Events bei dynamisch erzeugten Objekten

Beitrag von m.fuchs »

Das @ ist der Adress-Operator. Er liefert in deinem Fall die Adresse deiner Prozedur zurück. Somit "weiß" dein Objekt MyGitternetz welche Prozedu es aufrufen muss, wenn OnMouseDown gerufen weden soll.

Näheres: http://www.freepascal.org/docs-html/ref ... 13700012.7
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

klausi1305
Beiträge: 35
Registriert: Mo 1. Jul 2013, 21:30
OS, Lazarus, FPC: Win 7 Laz 1.0.10
CPU-Target: 32 Bit
Wohnort: Leipzig

Re: Events bei dynamisch erzeugten Objekten

Beitrag von klausi1305 »

aahh nen Pointer?!

ich hatte bisher immer versucht diese zu umgehen da ich bisher nicht dahinter steige wie diese funktionieren und ich diese effektiv nutzen kann!

Gibt es für die anderen Events ne Art Codevervollständigung....sprich, ich will im Interface Teil nen OnKeyDown einbinden und mir die notwendigen Variablen eingefügt werden in der Klammer....Bsp.: MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

oder muss ich besser den Weg gehen, in nen Test Form die Sache per Objektinspektor auszuprobieren und mir entsprechende Snippets zu kopiern?

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Events bei dynamisch erzeugten Objekten

Beitrag von wp_xyz »

Angenommen, du möchtest den Handler zum Ereignis OnMouseWheel dynamisch deinem Gitternetz zuweisen. Dann schreibe an die betreffende Stelle schon mal die entsprechende Anweisung, z.B.

Code: Alles auswählen

 
  MyGitterNetz.OnMouseWheel := @MyGitterNetzMouseWheel;
 
und klicke auf das "OnMouseWheel" mit gedrückter Ctrl-Taste. Dann springt die IDE an die entsprechende Stelle im Quellcode, wo das OnMouseWheel Ereignis deklariert ist. Falls das Event geerbt ist, erhältst du nur

Code: Alles auswählen

 
  property OnMouseWheel;
 
In diesem Fall nochmals mit diesem "OnMouseWheel" wiederholen, bis du zu einer Stelle kommst wie

Code: Alles auswählen

 
  property OnMouseWheel: TMouseWheelEvent ...
 
Jetzt noch ein Ctrl-Klick auf "TMouseWheelEvent", und bis bei der Deklaration des TMouseWheelEvent-Typs, der du die Parameter entnehmen kannst.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2815
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Events bei dynamisch erzeugten Objekten

Beitrag von m.fuchs »

klausi1305 hat geschrieben:aahh nen Pointer?!
ich hatte bisher immer versucht diese zu umgehen da ich bisher nicht dahinter steige wie diese funktionieren und ich diese effektiv nutzen kann!
Im Grund nutzt du die ganze Zeit schon welche. Auch Referenzen auf Objekte sind im Grund Pointer, allerdings ist der Umgang mit ihnen simpler (keine Dereferenzierung zum Beispiel).
Und wenn du wie in diesem Fall mit dem @-Operator arbeitest, musst du auch kein tiefergehende Wissen über Zeigerarithmetik haben.

Aber so ein wenig Grundlagenwissen wäre schon nicht schlecht. Bestimmte Sachverhalte hinter Objekten und ihren Referenzen versteht man dann.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten