Autor |
Beitrag |
*Knust*
      
Beiträge: 95
|
Verfasst: Mo 28.07.08 20:57
Moderiert von Narses: Abgetrennt von hier: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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* 
      
Beiträge: 95
|
Verfasst: Mo 28.07.08 21:18
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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Zuletzt bearbeitet von jakobwenzel am Mo 28.07.08 21:29, insgesamt 1-mal bearbeitet
|
|
*Knust* 
      
Beiträge: 95
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
*Knust* 
      
Beiträge: 95
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
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 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Zuletzt bearbeitet von Tilman am Mo 28.07.08 22:22, insgesamt 2-mal bearbeitet
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 ^^
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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. 
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mo 28.07.08 22:19
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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...
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|