![]() |
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 |
AW: Komponente über Namensvarialble ansprechen?
Moin...8-)
Zitat:
|
AW: Komponente über Namensvarialble ansprechen?
Zitat:
|
AW: Komponente über Namensvarialble ansprechen?
Zitat:
|
AW: Komponente über Namensvarialble ansprechen?
Ach ja, das Dictionary müsste natürlich ebenso gepflegt werden und bei Änderungen in der Komponentenliste sowie Umbenennung einzelner Komponenten aktualisiert werden. Ich glaube kaum, daß der Aufwand durch den geringen Geschwindigkeitsvorteil gerechtfertigt ist.
Ein solches Dictionary wäre eventuell dann von Vorteil, wenn es Komponenten mit unterschiedlichen Ownern enthält. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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