string to QRLabel

6 отговора 0 прегледа
#1

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;

Отговор
в отговор на az #2

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 съдържа всички компоненти, не само тези които те интересуват.

Отговор
в отговор на az #3

И да и не

Няма начин да направиш това по начина по който се опитваш. Но за смисъла, който влагаш в питането си - да, донякъде може да се направи. TComponent има метод FindComponent, който ти връща компонент по името му, но само ако той е негово притежавание. Вариант за решение на проблема е да си направиш една рекурсивна функция, която да претърсва дървото в дълбочина. Между другото същият проблем стои и при решението, което ти предложи 9-главата ламя, само че там ще трябва да навлизаш рекурсивно в дълбочина ако срещнеш контрол, който е наследник на TWinControl.
Обикновено обаче, когато компонентите са поставени във формата по време на дизайна, те са нейно притежание. Така че би трябвало FindComponent да ти свърши работа. Или можеш да използваш аналогично решение на това с Form1.Controls, но използвайки Form1.Components.

Отговор
в отговор на andrew_nikoloff #4

Re: И да и не

да, това с FindComponent го пробвах, но Tcomponent, който връща няма достъп до кепшъна

Отговор
в отговор на az #5

Re: И да и не

А защо не пробваш да го каст-неш към типа/класа който ти трябва.
Примерно:

TLabel(<Component>).<property>

ПП: Само трябва да си сигурен че такъв каст е възможен, за да не гръмне

Отговор
в отговор на az #6

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);

Отговор
в отговор на пий и пeй #7

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);


Отговор