Entwickler-Ecke
Windows API - Buttons aus array procedure zuweisen
*Knust* - Mo 28.07.08 20:57
Moderiert von
Narses: Abgetrennt von hier: http://www.delphi-forum.de/viewtopic.php?t=84576
Ich hätte da auch ma ne Frage zu:
kann man einem button aus nem array ne procedure zuweisen, die passsiert, wenn man ihn klickt?
also sowas wie
buttons[x].onclick:=myprocedure;
?
Das geht so ja nich weil das iwie n notifyevent sein soll... was muss ich machen, damit das geht?
mfg
Knust
Tilman - Mo 28.07.08 21:06
*Knust* hat folgendes geschrieben: |
Ich hätte da auch ma ne Frage zu:
kann man einem button aus nem array ne procedure zuweisen, die passsiert, wenn man ihn klickt?
also sowas wie
buttons[x].onclick:=myprocedure;
?
Das geht so ja nich weil das iwie n notifyevent sein soll... was muss ich machen, damit das geht?
mfg
Knust |
Um den Mods mal die Arbeit abzunehmen: neue Fragen in neuen Threads ;)
Aber zur Frage: das geht schon, allerdings muss myprocedure eine Methode sein. Am einfachsten geht das wenn du einfach einen Button auf deine Form ziehst, drauf doppelklickst. Es erscheint eine automatsich generierte Methode, in die du // bla schreibst (Der Kommentar ist wichtig damit Delphi die Methode nicht wieder entfernt). Dann löscht du den Button wieder, und kannst due neu generierte Methode (wie du oben richtig beschrieben hast) zuweisen.
Yogu - Mo 28.07.08 21:13
Tilman: Das geht schon, allerdings ist die Methode dann im DFM-Teil der Unit deklariert. Und warum so eine Eselsbrücke, normal ist doch auch nicht so schwer.
Du brauchst einen besonderen Parameter für deine
OnClick-Prozedur:
Sender.
Delphi-Quelltext
1:
| procedure MyOwnClick(Sender: TObject); |
So einfach ist das. Nicht mal einen Button hab ich gebraucht ;)
*Knust* - Mo 28.07.08 21:18
Titel: Buttons aus array procedure zuweisen
Moderiert von
Narses: Durch das Zusammenführen der Beiträge (s.o.) taucht die Frage hier nochmal auf
Hi!
Ich würde gerne mal wissen, ob bzw. WIE es geht, einem button aus nem array procedures zuzuweisen also bsp:
buttons[x].onclick:=myprocedure;
so in der art...
ich muss ja iwie n notifyevent machen oder so
aber ich habe keine ahnung wie das geht.
das problem ist auch, dass ich der procedure irgendwie übergeben muss, welcher button aus dem array sie geöffnet hat und ich deswegen nicht einfach n anderen buttonj erstellen kann und dessen onklickprocedure benutzen kann...
Wie kann ich die position im array übergeben und onklick eine procedure zuweisen????
mfg
Knust
Tilman - Mo 28.07.08 21:21
Yogu hat folgendes geschrieben: |
Delphi-Quelltext 1:
| procedure MyOwnClick(Sender: TObject); |
So einfach ist das. Nicht mal einen Button hab ich gebraucht ;) |
Hi Yogu :)
1. Bei mir geht das nicht. Dann kommt genau die oben angesprochene Fehlermeldung. Meine Erklärung: Prozeduren != Methoden (so stehts auch in der Delphi-Hilfe). Ich benutze D7, möglicherweiße ist das in neueren Delphis geändert.
2. Taugt es als Eselsbrücke, grade für Anfänger, schon ganz gut, denn: nicht jede Methode ist ja gleich. Mancha haben nur sender als Parameter, mache auch ganz andere "Dinge".
LG,
tilman
jakobwenzel - Mo 28.07.08 21:25
Das zuweisen der Prozedur geht genau so, wie du es geschrieben hast.
Die OnClick-Prozedur bekommt den geklickten Button im Parameter Sender übergeben. Du könntest die Eigenschaft Tag der Buttons auf den Index im Array setzen und ihn dann mit (Sender as TButton).Tag auslesen. Falls Tag schon anderweitig verwendet wird, wirst du wohl den Button im Array suchen müssen und so den Index herausfinden.
*Knust* - Mo 28.07.08 21:28
Hmmm...
ich hab jetzt das:
Delphi-Quelltext
1:
| buttons[x][y].onclick:=btnclick; |
btnklick ist eine prozedur.
aber es kommt der fehler:
Unit2.pas(51): Inkompatible Typen: 'TObject' und 'Integer'
Also geht das ja so direkt nicht...
Tilman - Mo 28.07.08 21:30
Hier können wir nur raten. Poste deinen ganzen Code, vor allem die Stelle an der btnClick definiert ist, dann können wir helfen ;)
*Knust* - Mo 28.07.08 21:58
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure btnclick(x,y:integer); buttons[x][y].onclick:=btnclick(x,y);
procedure tform2.btnclick(x,y:integer); begin /... end; |
so sieht das aus... ich glaube den inhalt von btnclick braucht man nicht... da wird nur mit integern gerechnet
Tilman - Mo 28.07.08 22:01
Doch, das erklärt einiges. Die Methode muss genauso deklariert sein wie Die Klasse es erwartet. Zitat Delphi-Hilfe:
Zitat: |
type TNotifyEvent = procedure (Sender: TObject) of object; |
Du aber hast zusätzliche Parameter - und das funzt eben nicht.
// Edit: habe mich mal rangesetzt und ein Beispielprogramm geschrieben, das dir vielleicht hilft. Habe aber das Array weggelassen, und dafür in x und y die Position des Knopfs gespeichert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private procedure myButton(Sender: TObject); public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.myButton(Sender: TObject); var welches: tPoint; begin welches := pPoint((sender as TComponent).Tag)^; ShowMessage(IntToStr(welches.X)+','+IntToStr(welches.Y)); end;
procedure TForm1.Button1Click(Sender: TObject); var knopf : TButton; pos: pPoint; begin knopf := TButton.Create(self); knopf.Caption := 'Hallo'; knopf.Left := random(width-100); knopf.Top := random(height-100); knopf.OnClick := myButton; knopf.Parent := self; new(pos); pos^.X := knopf.Left; pos^.Y := knopf.Top; knopf.Tag := integer(pos); end;
end. |
@ Yogu: wenn dein Quelltext oben nur die Deklaration in der Klasse TForm darstellte, dann hast du dcoh recht. Hatte es aber falsch verstanden ;)
Yogu - Mo 28.07.08 22:10
Tilman hat folgendes geschrieben: |
Bei mir geht das nicht. Dann kommt genau die oben angesprochene Fehlermeldung. Meine Erklärung: Prozeduren != Methoden (so stehts auch in der Delphi-Hilfe). Ich benutze D7, möglicherweiße ist das in neueren Delphis geändert. |
Du musst Ereignismethoden immer in einer Klasse deklarieren, sonst kommt so eine Fehlermeldung. Da ist von einer regulären Prozedur und Methodenzeigern die Rede, oder? Eine eigenständige Methode ist nicht das gleiche wie die einer Klasse. (Ich benutze auch D7)
Tilman hat folgendes geschrieben: |
Taugt es als Eselsbrücke, grade für Anfänger, schon ganz gut |
Ok, ganz so schlimm wie Memos als Stringlisten ist deine Variante ja nicht, aber vielleicht wäre es sinnvoll, mal zu verstehen, was man denn machen muss ;)
Tilman hat folgendes geschrieben: |
nicht jede Methode ist ja gleich. Manchal haben nur sender als Parameter, mache auch ganz andere "Dinge" |
Die zusätzlichen Parameter bekommst du mit deinem Button aber auch nicht mehr hin. Außerdem kannst du doch über die Codeverfollständigung die erwarteten Parameter auslesen.
*Knust* hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure btnclick(x,y:integer); buttons[x][y].onclick:=btnclick(x,y);
procedure tform2.btnclick(x,y:integer); begin /... end; | |
Das sieht so aus, als ob du
OnMouseDown bräuchtest - da werden auch noch die Mauskoordinaten übergeben:
Delphi-Quelltext
1:
| OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); |
(oder so ähnlich ;))
Tilman - Mo 28.07.08 22:13
Ja Yogu, habe dich jetzt verstanden. Dacht vorhin dein Quelltext hätte die prozedur darstellen sollen, und nicht nur die Deklaration in der Klasse TForm. Dann wäre es falsch gewesen (weil ja TForm. gefehlt hätte).
Das mit dem Klicken ist trotzdem ne tolle Eselsbrücke: wenn man z.B. auf "onMouseMove" klickt hat man schwupps die richgtige Methode für dieses Eregnis ;) so war das gemeint ^^
Yogu - Mo 28.07.08 22:16
Tilman hat folgendes geschrieben: |
Das mit dem Klicken ist trotzdem ne tolle Eselsbrücke: wenn man z.B. auf "onMouseMove" klickt hat man schwupps die richgtige Methode für dieses Eregnis ;) so war das gemeint ^^ |
Ok, ich seh's ein. Aber verschiebe doch bitte die Deklaration aus dem DFM-Teil in
private. :D
Tilman - Mo 28.07.08 22:19
Yogu hat folgendes geschrieben: |
Tilman hat folgendes geschrieben: | Das mit dem Klicken ist trotzdem ne tolle Eselsbrücke: wenn man z.B. auf "onMouseMove" klickt hat man schwupps die richgtige Methode für dieses Eregnis ;) so war das gemeint ^^ |
Ok, ich seh's ein. Aber verschiebe doch bitte die Deklaration aus dem DFM-Teil in private. :D |
Öhm... wieso denn... Delphi schmiert die auch immer in public, warum soll ich das anders machen... müsste ich ja die dinger von Delphi auch immer rüberschieben? Wenn ich selbst Klassen schreibe leg ich da natürlich Wert drauf, aber hier?
Tilman - Mo 28.07.08 22:21
Achso jetzt check ichs... der Teil über den Schutzklassen ist also für die Delphi-Eigenen Forms reserviert doer was? Naja gut okay...
Yogu - Mo 28.07.08 22:21
Tilman hat folgendes geschrieben: |
Delphi schmiert die auch immer in public |
Bei mir sind die über jedem anderen Schlüsselwort, direkt nach der Klasseneinleitung, bei dir etwa nicht? Die dort deklarierten und definierten Methoden und Variablen werden von Delphi verwaltet, also auch gelöscht etc. Eigene Symbole sollten immer in die entsprechende Sichtbarkeitskategroie eingeordnet werden.
Edit:: Du hast es verstanden. ;)
Tilman - Mo 28.07.08 22:23
Jo, man lernt nie aus. Programmiere jetzt seit 10 Jahren Delphi... Aber das es da noch so ne art "Meta-Schutzklasse" gitb wusst ich net ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!