![]() |
Komponente über Namensvarialble ansprechen?
Hi Experten!
Lassen sich Komponenten allgemein über eine Art Namesvariable ansprechen? Beispiel: ich hab eine Menge Buttons auf der Form (visuell erstellt).
Delphi-Quellcode:
var btn1, btn2 ... btn10 : TButton;
Nun sollen zur Runtime einige Eigenschaften gesetzt werden. Normalerweise also:
Delphi-Quellcode:
Nun suche ich aber nach einer Möglichkeit, das zu verallgemeinern.
btn1.caption := 'asdf';
btn1.hint := 'einHint'; btn1.enabled := false: ... btn2.caption := 'asdf'; btn2.hint := 'einHint'; btn2.enabled := false: ... Ok, es gibt arrays. Ich könnte alle Buttons per code erstellen.
Delphi-Quellcode:
Aber geht es auch anders?
var BtnAr : array of TButton;
for i := 1 to 10 do begin btnAr [i] := TButton.create (self); btnAr [i].caption := 'asdf'; ... end; Gibt es also eine Möglichkeit, die visuell erstellten Buttons allgemein mit dem 'btn' - Teil und dem Index anzusprechen? Mit Objekten ist ja viel möglich... Daniel |
AW: Komponente über Namensvarialble ansprechen?
Wenn Du die Referenzen (z.B. nach dem Erzeugen der Form) in einen Array ablegst oder mit der Form.FindComponent() Krücke
|
AW: Komponente über Namensvarialble ansprechen?
Zitat:
Zitat:
Delphi-Quellcode:
var
btn: TButton; I: Integer; begin for I := 1 to <anzahl button> do begin btn := FindComponent('btn' + I.ToString) as TButton; btn.caption := 'asdf'; btn.hint := 'einHint'; btn.enabled := false: end; end; |
AW: Komponente über Namensvarialble ansprechen?
Ich hätte auch noch eine Idee.
Alle Buttons die man später ansprechen möchte in eine TList<TButton> stecken. Damit vermeidet man dieses ständige FindComponent. |
AW: Komponente über Namensvarialble ansprechen?
whow - ihr seid schnell :-D
Vielen Dank |
AW: Komponente über Namensvarialble ansprechen?
Moin...8-)
...einen hätte ich noch. :stupid: TObjectDictionary<string, TButton> oder TDictionary<string, TButton> ...da kann man die Buttons auch nach dem Namen suchen. :thumb: PS: Um Längen schneller als FindComponent! |
AW: Komponente über Namensvarialble ansprechen?
Zitat:
Die Booleschen Werte aller Checkboxen in einem 'Optionen'-Dialog habe ich in einer 32-Bit Integervariablen gespeichert. Das Setzten der Checkboxen erfolgt folgendermaßen:
Delphi-Quellcode:
Das Auslesen der Checkboxen geht entsprechend:
Procedure SetCheckboxes(params: Cardinal);
var i,len: Integer; TC: TCheckbox; begin len:= (sizeof(params) * 8) - 1; // Anzahl der Bits -1 for i:= 0 to len do begin TC:= FindComponent('CheckBox' + IntToStr(i+1)) as TCheckbox; //checkbox1 ... checkbox32 IF TC <> NIL Then TC.checked:= params and (1 shl i) <> 0; end; end;
Delphi-Quellcode:
Die Performance ist dabei kein Problem, da das immer nur beim Öffnen bzw. Schließen des Dialogs ausgeführt wird. Wie sähe denn die Alternative z. B. hiermit aus:
Procedure ReadCheckboxes(var params: Cardinal);
var i,len: Integer; TC: TCheckbox; begin params:= 0; // Alle Bits löschen len:= (sizeof(params) * 8) - 1; // Anzahl der Bits -1 for i:= 0 to len do begin TC:= FindComponent('CheckBox' + IntToStr(i+1)) as TCheckbox; //checkbox1 ... checkbox32 If (TC <> NIL) and TC.checked Then Params:= Params or (1 shl i); end; end; Zitat:
Gruß LP |
AW: Komponente über Namensvarialble ansprechen?
Zitat:
|
AW: Komponente über Namensvarialble ansprechen?
Zitat:
|
AW: Komponente über Namensvarialble ansprechen?
Also ich hab jetzt erstmal FindComponent eingebaut.
Sinvoll eingesetzt konnte die Größe des gesamten Quelltextes meines Projektes prompt um 25 % verkleinert werden:-D Danke nochmal an alle - Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz