Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - OnClick bei zur Laufzeit erzeugtem Button funktioniert nicht
Bruce - Fr 02.01.04 17:17
Titel: OnClick bei zur Laufzeit erzeugtem Button funktioniert nicht
Hallo, bin am verzweifeln.
Ich erzeuge einen Button zur Laufzeit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure ZielPunktErstellen; begin GetCursorPos(mouseposition); mouseposition := Form1.ScreenToClient(mouseposition); If (Mouseposition.x > 630) OR (Mouseposition.y < 64) then exit; BZiel := TFlatButton.Create(Form1); BZiel.Parent := Form1; BZiel.Left := mouseposition.x-12; BZiel.Top := mouseposition.y-12; BZiel.Color := clred; BZiel.ColorBorder := $FFFFFFFF; BZiel.ColorDown := clred; BZiel.ColorFocused := clred; BZiel.ColorHighLight := $FFFFFFFF; BZiel.ColorShadow := $FFFFFFFF; BZiel.OnClick := ZielPunktClick; end; |
Die aufgerufene Prozedur ZielPunktClick :
Delphi-Quelltext
1: 2: 3: 4:
| procedure ZielPunktClick(Sender: TObject); begin Form2.Show; end. |
Die Zeile die das OnClick zuweist erzeugt den Fehler "Inkompatible Typen: Methodenzeiger und reguläre Prozedur".
Was ist da falsch, alle Beispiele die ich dazu gefunden habe funktionieren doch so simple, oder überseh ich das dauernd was?
Danke, Gruß, Stephan
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Christian S. - Fr 02.01.04 17:26
Hallo!
Die Prozedur für das OnClick-Ereignis muss ein Member von einer Form sein.
Mfg
Peter
Bruce - Fr 02.01.04 17:36
Hmm... Was heisst das genau?
Die Prozedur die den Button erstellt ist in eine eigene Unit ausgelagert.
Der Button wird auf Form1 angezeigt. Was muss ich jetzt tun? Hab OnClick-Prozedur mal in Unit1 reingeschrieben aber das funktioniert auch nicht. Die Syntax Form1.ZielPunktClick im Prozedur-Header nimmt er auch nicht. Blicke noch nicht ganz durch...??
Christian S. - Fr 02.01.04 17:48
Hallo!
Sieh Dir doch mal an, wie Delphi die OnClick-Prozedur generiert, wenn Du einen Doppelklick auf einen Button ausführst. Deine Prozedur muss irgendwie so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TForm1 = class(TForm) procedure ZielPunktClick(Sender: TObject); private public end;
procedure TForm1.ZielPunktClick(Sender : TObject); begin end; |
MfG
Peter
Motzi - Fr 02.01.04 18:10
Peter Lustig hat dir ja eh schon einen sehr brauchbaren Tipp gegeben... parallel dazu kannst du noch hier im Forum suchen, zu diesem Problem gibt es schon jede Menge Topics...
Bruce - Fr 02.01.04 18:11
Vielen Dank Peter, jetzt gehts!
Ich musste zwar die Prozedur zur Erzeugung des Buttons in die Unit von Form1 schreiben, sonst kam wieder ein Fehler. Aber ich muss die auch nicht unbedingt auslagern. Hauptsache es funktioniert jetzt.
Nochmal Danke für die schnelle Hilfe.
Gruß, Stephan
Lotoreo - Sa 03.01.04 19:26
Wenn ich nun einen Array von Timages habe, und bei allen die selbe On-Klick-Funktion benötige, so funktioniert das zu Beginn normal. Doch wie finde ich heraus, welches Objekt die Funktion ausgelößt hat? Gibt es da eine Möglichkeit?
Motzi - Sa 03.01.04 19:31
Jedes Ereignis hat einen Parameter "Sender" der eine Referenz auf das Objekt enthält, das das Ereignis ausgelöst hat...
Christian S. - Sa 03.01.04 19:31
Hallo!
Komponenten haben die Property "Tag". Diese ist für den Programmierer zur freien Verfügung. Dort kannst Du beim Erstellen zum Beispiel speichern, welchen Index im Array das Image hat.
Diesen Tag kannst Du über den Sender-Parameter des OnClick-Ereignissen wieder abfragen. Irgendwie so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.klick(Sender : TObject); VAR i : Integer; begin if Sender is TComponent then i := TComponent(Sender).Tag; end; |
MfG
Peter
Lotoreo - Sa 03.01.04 20:21
Hmm, das müste gehen! Werd ich gleich mal probieren... Danke für die Hilfe!
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!