|
Antwort |
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:
damit wir später auch wissen, welcher Button des Arrays gedrückt wurde,
private
{ Private declarations } BTN1 : array[1..6] of TButton; // Array für bereits vorhandene Buttons BTN1Sender : TObject; // Sender der Buttons im array BTN1 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:
jetzt markieren wir alle 6 Buttons und erzeugen per Doppel-Click im Object-Inspector
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; das Ereignis ... Button1MouseDown. In diese Ereignis schreiben wir eine einzige Zeile :
Delphi-Quellcode:
damit ist der Sender beim Ereignis Mouse-Down festgelegt.
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin BTN1Sender := Sender; end; Wieder mit allen 6 markierten Buttons erzeugen wir jetzt das Ereignis OnClick:
Delphi-Quellcode:
hier wird per Schleife geprüft, welcher Button gedrückt wurde, das Ergebnis wird im
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; 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:
es werden wieder ein Array und eine "Sender"-Variable deklariert. Zusätzlich benötigen wir noch
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); 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:
als erstes muss die Länge des Arrays zugewiesen werden, hier durch die Variable BTN2Num,
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; 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:
Die Auswertung der Prozeduren für BTN2[i] gleichen den Prozeduren für die vorhandenen Buttons BTN1[i].
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; 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. |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |