Entwickler-Ecke

Sonstiges (Delphi) - Problem mit Arrays und Prozeduren


Ich Bins - So 05.10.03 23:45
Titel: Problem mit Arrays und Prozeduren
Hallo! Habe da ein Problem und weis nicht wie ich es hinkriegen soll

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
implementation

var Speed:Array[1..10,1..10of TSpeedButton;


procedure Testprozedur;
begin
......
end;


procedure TForm1.FormCreate(Sender: TObject);
var x,y           : Integer;
begin
for x:=1 to 10 do
  for y:=1 to 10 do
    begin
      Speed[x,y]:=TSpeedButton.Create(Self);
      Speed[x,y].OnClick:=TestProzedur;
    end;
end;

Wie kriege ich es jetzt hin, dass ich in der 3. Zeile von unten jedem SpeedButton die Prozedur Testprozedur als OnClick-Ereignis zuweisen kann, ich kann sie ja nicht im Obejktinspektor zuweisen!

Danke schon mal im Vorraus für die Hilfe!

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Christian S. - So 05.10.03 23:58

Hallo und herzlich Willkommen im Forum!

Deine Prozedur muss erstens eine Methode sein, dass heißt zu einem Objekt gehören, beispielsweise TForm1. Außerdem muss sie zu einem TNotifyEvent passen, das heißt, es muss der Parameter Sender : TObject übergeben werden.

Bis dann
Peter

P.S.: Bitte verwende für Deinen Code im Forum demnächst Delphi-Tags, das erhöht die Lesbarkeit!


Ich Bins - Mo 06.10.03 20:27

Und wie müsste ich das machen wenn ich der Test-Prozedur noch die Werte x und y übergeben will? Ich hab nämlich schon probiert eine neuen Button zu machen, bei dem dann eine OnClick-Prozedur erstellet und im FormCreate diese Prozedur jedem SpeedButton zugeordnet.
Allerdings kann ich so keine Werte x und y übergeben.
Ich will also irgendwie eine Testprozedur haben, die erkennt, von welchem SpeedButton sie aufgerufen wurde, weis aber absolut nicht wie das geht, hab grade erst mit Delphi angefangen!


kasi - Mo 06.10.03 21:36

Dafür kannst Du die Eigenschaft Tag des TSpeedButton benutzen.


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:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  p: TSmallPoint;
begin
p := TSmallPoint(TSpeedButton(Sender).Tag);
ShowMessage('Das war SpeedButton: '+IntToStr(p.x)+'/'+IntToStr(p.y));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  x,y : Integer;
  p: TSmallPoint;
begin
for x:=1 to 10 do
  for y:=1 to 10 do
    begin
      Speed[x,y]:=TSpeedButton.Create(Self);
      Speed[x,y].OnClick:=SpeedButton1Click;
      Speed[x,y].Top := y*25;
      Speed[x,y].Left := x*25;
      Speed[x,y].Parent := Self;
      Speed[x,y].Caption := IntToStr(x)+'/'+IntToStr(y);
      p.x := x;
      p.y := y;
      Speed[x,y].Tag := integer(p);
    end;
end;


KASI

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt


Christian S. - Mo 06.10.03 21:39

Schicke Lösung! :)

//edit: was dagegen, wenn ich Dich mit der Lösung (irgendwann) in meinem Tutorial zu Arrays und Komponentenarrays zitiere?


MSCH - Mo 06.10.03 21:39

Gebe jedem button ein TAG (integer) mit, andem du erkennen kannst, welcher der Buttons gedrückt wurde.

bsp:


Delphi-Quelltext
1:
2:
3:
4:
MyForm = Class(TForm)
  procedure MyButtonClick(Sender:TObjekt);
...
end;


in deiner For-Schleife:


Delphi-Quelltext
1:
2:
Speed[][].OnClick := MyButtonClick;
Speed[][].Tag:= 1;
...

in der Methode Click;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure MyForm.MyButtonClick();
begin
  with  sender as TSpeedButton do
  case Tag of
    1// tue was;
    2://
  end;
end;


// sind nur Fragmente, so aus'm Schädel geschrieben
grez
msch

//EDIT Da war wohl jemand schneller :-)


kasi - Mo 06.10.03 21:52

Zitat:
was dagegen, wenn ich Dich mit der Lösung (irgendwann) in meinem Tutorial zu Arrays und Komponentenarrays zitiere?


kein Problem.

KASI


Ich Bins - Di 07.10.03 16:45

Thx very much, klappt jetzt wunderbar