Da hier ab und zu mal die Frage nach Handling von Buttons (o.ä.) per array auftaucht,
hier 'mal eine kleine Anleitung :
Im folgenden Beispiel werden 6 Buttons per array angesprochen und 6 weitere Buttons
zur Laufzeit erstellt.
1) auf der Form befinden sich die 6 Buttons, die per array angesprochen werden sollen.
Wir gehen davon aus, dass es Buttons mit den Bezeichnung : Button1, Button2, . . . Button6 sind.
Als erstes müssen wir das Array definieren:
Delphi-Quellcode:
private
{ Private declarations }
BTN1 : array[1..6] of TButton; // Array für bereits vorhandene Buttons
BTN1Sender : TObject; // Sender der Buttons im array BTN1
damit wir später auch wissen, welcher Button des Arrays gedrückt wurde,
benötigen wir noch eine Variable vom Typ TObject (hier BTN1Sender)
Im OnCreate-Ereignis der Form weisen wir dem Array die Buttons zu:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
begin
for i := 1 to 6 do
BTN1[i] := FindComponent(Format('Button%d', [i])) as TButton;
// die Buttons sind bereits zur Laufzeit auf der Form platziert
end;
jetzt markieren wir alle 6 Buttons und erzeugen per Doppel-Click im Object-Inspector
das Ereignis ... Button1MouseDown. In diese Ereignis schreiben wir eine einzige Zeile :
Delphi-Quellcode:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
BTN1Sender := Sender;
end;
damit ist der Sender beim Ereignis Mouse-Down festgelegt.
Wieder mit allen 6 markierten Buttons erzeugen wir jetzt das Ereignis OnClick:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
begin
for i := 1 to 6 do
if BTN1Sender = BTN1[i] then Edit1.Text := 'Button'+IntToStr(i);
// über die Schleife wird jetzt der gedrückte Button gefunden
// und im TEdit1 ausgegeben
end;
hier wird per Schleife geprüft, welcher Button gedrückt wurde, das Ergebnis wird im
Beispiel (siehe Anhang) in einem TEdit ausgegeben. Die Verarbeitung kann z.B. über
eine Case-Of-Anweisung umgesetzt werden, da ja jedem OnClick-Ereignis eine Behandlung
zugewiesen werden soll.
Im Beispiel ist den Buttons noch das PopUpMenue1 zugewiesen, auch hier kann im Ereignis
PopUpMenu1Popup auf die Variable BTN1Sender zugegriffen werden, um das PopUp-Menü in
Abhängigkeit des gedrückten Buttons zu gestalten - die Schleifenauswertung ist die gleiche.
2) Buttons zur Laufzeit erstellen :
wir wollen jetzt 6 weitere Buttons erstellen, die rechts an den vorhandenen Buttons mit einem
Abstand von 32 Pixeln angeordnet werden.
es beginnt wieder mit der Deklaration der Variablen :
Delphi-Quellcode:
private
{ Private declarations }
BTN2 : array of TButton; // Array für zu erstellende Buttons
BTN2Sender : TObject; // Sender der zu erstellenden Buttons
BTN2Num : Integer; // Anzahl der zu erstellenden Buttons
procedure BTN2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure BTN2Click(Sender : TObject);
es werden wieder ein Array und eine "Sender"-Variable deklariert. Zusätzlich benötigen wir noch
eine Variable (BTN2Num) vom Typ Integer für die Anzahl der zu erzeugenden Buttons und zwei Prozeduren :
BTN2MouseDown : Prozedur beim Ereignis OnMosuseDown
BTN2Click : Prozedur beim Ereignis OnClick
beide Prozeduren müssen beim Erstellen der Buttons zugewiesen werden.
Die Erstellung der Buttons :
(ich hab' im Beispiel das Ereignis OnClick eines Buttons verwendet)
Delphi-Quellcode:
procedure TForm1.btnCreateNewButtonsClick(Sender: TObject);
var
i : Integer;
begin
BTN2Num := 6; // Anzahl der buttons bestimmen
SetLength(BTN2, 6); // Länge des Arrays setzen
for i := 0 to BTN2Num -1 do
begin
BTN2[i] := TButton.Create(Self); // Button erzeugen
with BTN2[i] do
begin
// hier können alle Eigenschaften und
// Ereignisse verarbeitet werden
Parent := Form1; // Parent bestimmen
Width := 144; // Größe festlegen
Height := 25;
Top := BTN1[i+1].Top; // Positionieren
Left := BTN1[i+1].Left + BTN1[i+1].Width + 32;
Caption := 'neuer Button '+IntToStr(i); // beschriften
PopUpMenu := PopUpMenu2; // PopUp-Menü zuweisen
OnMouseDown := BTN2MouseDown; // OnMouseDown-Ereignis zuweisen
OnClick := BTN2Click; // OnClick-Ereignis zuweisen
end;
end;
btnCreateNewButtons.Enabled := False;
end;
als erstes muss die Länge des Arrays zugewiesen werden, hier durch die Variable BTN2Num,
danach wird der Button erzeugt ..Create(Self)
im
with BTN2[i] do begin .. end - Block werden dem erstellten Button
seine Eigenschaften und Ereignis-Behandlungsroutinen zugewiesen.
Da die ersten 6 Buttons Bezeichnungsindices von 1 bis 6 haben, und die neu
erstellten Buttons Indices von 0 bis 5, muss bei der Positionierung die
Variable i um eins erhöht werden : BTN1
[i+1].Left ....
Im Beispiel wird ein existierendes PopUpMenue (PopupMenu2) zugewiesen,
ebenso die Ereignis-Behandlungsroutinen OnMouseDown und OnClick.
Die Prozeduren hierfür sehen wie folgt aus :
Delphi-Quellcode:
procedure TForm1.BTN2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
BTN2Sender := Sender; // Zuweisung des Senders (Button)
end;
procedure TForm1.BTN2Click(Sender : TObject);
var
i : Integer;
begin
for i := 0 to BTN2Num -1 do
if BTN2[i] = BTN2Sender then Edit3.Text := 'Button'+IntToStr(i);
end;
procedure TForm1.PopupMenu2Popup(Sender: TObject);
var
i : Integer;
begin
for i := 0 to BTN2Num -1 do
if BTN2Sender = BTN2[i] then Edit4.Text := 'Button'+IntToStr(i);
end;
Die Auswertung der Prozeduren für BTN2[i] gleichen den Prozeduren für die vorhandenen Buttons BTN1[i].
Auf diese Weise lassen sich alle von TControl abgeleiteten Elemente per array
"verwalten" und auch zur Laufzeit erstellen. Die Buttons dienen hier nur als Beispiel.
Markus H.