string to QRLabel
6 отговора
0 прегледа
string to QRLabel
има ли начин да кажа на делфито че определен стринг е име на компонент.
опитвам се да намеря определен брой компоненти, които са номерирани
и да им променям кепшъна динамично.
s:string;
for i:=1 to 100 do begin
s:='QRLabel'+strtoint(i);
// s triabva da stane suotveten komponent ???
Form1.s.caption:='proba';
end;
опитвам се да намеря определен брой компоненти, които са номерирани
и да им променям кепшъна динамично.
s:string;
for i:=1 to 100 do begin
s:='QRLabel'+strtoint(i);
// s triabva da stane suotveten komponent ???
Form1.s.caption:='proba';
end;
Re: string to QRLabel
Естествено че няма как. Все пак делфито не е динамичен език.
Това което можеш да направиш е един масив от кепшъни като индексите на масива са номерата на компонентите. В същото време номера на всеки компонент ще го сложиш в Tag пропъртито.
И накрая:
for i:=0 to Form.ControlCount-1 do
Form1.Controls{i}.Caption := a[Form1.Controls{i}.Tag];
където "a" ти е масива с кепшъните. Естествено ще трябва да си сложиш разни проверки щото Form.Controls съдържа всички компоненти, не само тези които те интересуват.
Това което можеш да направиш е един масив от кепшъни като индексите на масива са номерата на компонентите. В същото време номера на всеки компонент ще го сложиш в Tag пропъртито.
И накрая:
for i:=0 to Form.ControlCount-1 do
Form1.Controls{i}.Caption := a[Form1.Controls{i}.Tag];
където "a" ти е масива с кепшъните. Естествено ще трябва да си сложиш разни проверки щото Form.Controls съдържа всички компоненти, не само тези които те интересуват.
И да и не
Няма начин да направиш това по начина по който се опитваш. Но за смисъла, който влагаш в питането си - да, донякъде може да се направи. TComponent има метод FindComponent, който ти връща компонент по името му, но само ако той е негово притежавание. Вариант за решение на проблема е да си направиш една рекурсивна функция, която да претърсва дървото в дълбочина. Между другото същият проблем стои и при решението, което ти предложи 9-главата ламя, само че там ще трябва да навлизаш рекурсивно в дълбочина ако срещнеш контрол, който е наследник на TWinControl.
Обикновено обаче, когато компонентите са поставени във формата по време на дизайна, те са нейно притежание. Така че би трябвало FindComponent да ти свърши работа. Или можеш да използваш аналогично решение на това с Form1.Controls, но използвайки Form1.Components.
Обикновено обаче, когато компонентите са поставени във формата по време на дизайна, те са нейно притежание. Така че би трябвало FindComponent да ти свърши работа. Или можеш да използваш аналогично решение на това с Form1.Controls, но използвайки Form1.Components.
Re: И да и не
да, това с FindComponent го пробвах, но Tcomponent, който връща няма достъп до кепшъна
Re: И да и не
А защо не пробваш да го каст-неш към типа/класа който ти трябва.
Примерно:
TLabel(<Component>).<property>
ПП: Само трябва да си сигурен че такъв каст е възможен, за да не гръмне
Примерно:
TLabel(<Component>).<property>
ПП: Само трябва да си сигурен че такъв каст е възможен, за да не гръмне
Re: string to QRLabel
for i:=0 to Form.Componentcount-1 do
if (Form.Components is TLabel )
and((Form.Components as TLabel ).Caption='Label'+IntToStr(i))
then (Form.Components as TLabel).Caption:='Proba'+IntToStr(i);
if (Form.Components is TLabel )
and((Form.Components as TLabel ).Caption='Label'+IntToStr(i))
then (Form.Components as TLabel).Caption:='Proba'+IntToStr(i);
Re: string to QRLabel
Малка корекция:
for i:=0 to Form.Componentcount-1 do
if (Form.Components is TLabel )
and((Form.Components as TLabel ).Caption='Label'+IntToStr(i))
then (Form.Components as TLabel).Caption:='Proba'+IntToStr(i);

for i:=0 to Form.Componentcount-1 do
if (Form.Components is TLabel )
and((Form.Components as TLabel ).Caption='Label'+IntToStr(i))
then (Form.Components as TLabel).Caption:='Proba'+IntToStr(i);