Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Controls per arrays verwalten und / oder erstellen (https://www.delphipraxis.net/147151-controls-per-arrays-verwalten-und-oder-erstellen.html)

markus5766h 2. Feb 2010 20:01


Controls per arrays verwalten und / oder erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz