Autor Beitrag
*Knust*
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Mo 28.07.08 20:57 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 28.07.08 21:06 
user profile icon*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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 28.07.08 21:13 
user profile iconTilman: 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.

ausblenden Delphi-Quelltext
1:
procedure MyOwnClick(Sender: TObject);					

So einfach ist das. Nicht mal einen Button hab ich gebraucht ;)
*Knust* Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Mo 28.07.08 21:18 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 28.07.08 21:21 
user profile iconYogu hat folgendes geschrieben:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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* Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Mo 28.07.08 21:28 
Hmmm...
ich hab jetzt das:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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* Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Mo 28.07.08 21:58 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 procedure btnclick(x,y:integer); //oben!
//...

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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.

ausblenden volle Höhe 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
    { Private-Deklarationen }
    procedure myButton(Sender: TObject);  // Auf besonderen Wunsch Yogus
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 28.07.08 22:10 
user profile iconTilman 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)

user profile iconTilman 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 ;)

user profile iconTilman 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.

user profile icon*Knust* hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 procedure btnclick(x,y:integer); //oben!
//...

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:

ausblenden Delphi-Quelltext
1:
OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);					

(oder so ähnlich ;))
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 28.07.08 22:16 
user profile iconTilman 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mo 28.07.08 22:19 
user profile iconYogu hat folgendes geschrieben:
user profile iconTilman 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?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 28.07.08 22:21 
user profile iconTilman 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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)