Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ein Array aus Steuerelementen


Paranoid - Di 03.09.02 21:47
Titel: Ein Array aus Steuerelementen
Hi,
also folgendes, ich hab nirgenswo was dazu gefunden, aber ist es möglich mehrere Steuerelement beispielsweise einen Buttons, unter dem selben Namen zu erstellen, die sich dann nur anhand eines Indexes unterscheiden würde, so wie das bei VB mit der Index-Eigenschaft mögl. ist?
thx
Para


MrSpock - Di 03.09.02 22:08

Hallo Paranoid,

du kannst ein Array z.B. deklarieren als:


Quelltext
1:
MyControlsArray : Array[0..10] of TControl;                    


Dann kannst du entsprechende Controls erzeugen und dem Array zuordnen:

Quelltext
1:
2:
MyControlsArray[0] := TButton.Create(Self);
...


Alternativ kannst du den Namen entsprechend setzen. Heißen deine Buttons z.B. Button1, Button2, ... Buttonx, dann kannst du über die Eigenschaft Components oder über die Eigenschaft Controls auf diese Buttons zugreifen.


Paranoid - Di 03.09.02 22:13

vielen Dank erstmal, geht das auch irgendwie, mit Hilfe der IDE, mit Streuerelement auf Form ziehen usw. oder geht das nur so?
wenn nicht ist auch net so schlimm :-)
thx
Para


MrSpock - Di 03.09.02 22:20

Hallo Paranoid,

naja, das einzige was unterstützt wird, ist der o.g. Alternativvorschlag. Die Komponenten Namen werden nämlich automatisch durchnummeriert. Aber wenn du ein echtes Array willst, musst du in irgendeiner Art die Komponenten (bzw. Controls) dem Array zuweisen. Das muss natürlich nicht unbedingt bei der Erzeugung sein. Du kannst z.B. alle Buttons erzeugen und dann im Programm wieder über die Eigenschaft Controls alle Controls der Form durchlaufen und die Buttons an den Array zuweisen.


Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to ControlCount-1 do
  if Controls[i] is TButton then
  begin
     Inc(j);
     MyArray[j] := Controls[i];
  end;


Paranoid - Di 03.09.02 22:31

hm...danke werde mal ein bissl rumprobieren ;-)
noob bedankt sich mal für hilfe


Paranoid - Di 03.09.02 22:46

ach nochwas, es klappt, nur ich seh denn Button net. auch net mit visible:=true oder so...
?!?


Paranoid - Di 03.09.02 23:08

hab irgendwie alles versucht:

Quelltext
1:
2:
3:
4:
5:
6:
MyControlsArray[0].Width:=300;
MyControlsArray[0].Height:=300;
MyControlsArray[0].Visible:=true;
MyControlsArray[0].Show;
MyControlsArray[0].Repaint;
MyControlsArray[0].Update;

nix half :-)


aogwaba - Di 03.09.02 23:32

Du hast parent vergessen.
zb:

Quelltext
1:
MyControlsArray[0].parent:= self;                    


cu
waba


Paranoid - Mi 04.09.02 19:37

OK jetzt sehe ich auch was, könnnt ihr mir ne kurze Erklärung zu parent geben?
Und wie weise ich einem Ereignis, eine prozedur zu?
thx
Para

PS: sorry, falls das blöde Fragen sind, aber normal ziehe ich steuerelente nur per Drag und Drop auf ne Form, bin halt noch nen Anfänger.


MrSpock - Do 05.09.02 07:21

Hallo Paranoid,

schau dir einmal die Online Hilfe zu TControl.Parent an. Da ist der Zweck von Parent ganz gut beschrieben.

Zur zweiten Frage: Die Ereignisse, auf die eine Komponente direkt Einfluss zu nehmen erlaubt, findest du im Objektinspektor unter "Ereignisse". Doppelklickst du hier in der rechten Spalte erstellt Delphi automatisch die Deklaration einer entsprechenden Ereignisbehandlungsroutine. Du kannst aber auch aus der Dropdownliste eine bereits definierte Methode auswählen, z.B. wenn viele Schalter dieselbe Methode für das OnClick - Ereignis verwenden sollen. Der Parameter Sender teilt dir dann mit, wer das Ereignis gemeldet hat.


Paranoid - Do 05.09.02 14:45

hihi Objektinspektor isch klar, nur sind da keine COntrols, die nur per Code erstellelt wurden :-) danke für die Antwort.


Paranoid - Do 05.09.02 17:20

noch was, hab mir das zu parent durchgelesen, aber wurde parent:=self machen und nicht parent:=frmMain oder so?


aogwaba - Do 05.09.02 17:22

Zur Laufzeit weist du den Ereignissen einfach deine Prozeduren zu.
Diese müssen nur die selbe Signatur besitzen.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure MyClick(Sender: tobject);
...
implementation


procedure ErzeugeArrayofControls;
begin
...
MyControlsArray[0].onClick:=MyClick;
end;

procedure MyClick(Sender: tobject);
begin
...
end;

cu
waba