2013-09-15 1 views
1

Я пытаюсь изменить заголовок многих labels используя обычный способ:Использовать переменные для имени объекта в Delphi

form1.label1.caption := '1'; 
form1.label2.caption := '2'; 
form1.label3.caption := '3'; 
form1.label4.caption := '4'; 
form1.label5.caption := '5'; 
form1.label6.caption := '6'; 
form1.label7.caption := '7'; 
form1.label8.caption := '8'; 
... 

Как я могу использовать For и назначить i маркировать имя как Label[i]? Что-то вроде этого:

for i := 1 to 50 do 
    begin 
    form1.label[i].caption := Inttostr(i); 
    end; 

И что это лучший способ, чтобы изменить слишком много параметров объекта (в данном случае caption)?

+3

Посмотрите здесь http://stackoverflow.com/questions/16710189/forming-a-variable-name-with-string-integer-and-calling-functions. Или просто используйте Findcomponent для поиска на сайте. – bummi

+0

@bummi Почему вы предложили использовать 'Findcomponent'? – bummi

+2

Спасибо @bummi за вопрос, но я не предлагал * использовать * его, но использовать его для поиска, так как это часто задавалось часто в разных цветах, а вопросы, содержащие 'FindComponent', показывали разные решения помимо FindComponent. Поскольку я знаю, что иногда сложно найти ключевое слово для поиска существующих решений, я решил не искать точный дубликат для закрытия. – bummi

ответ

9

Создайте свои элементы управления динамически. Если вам нужно сохранить ссылки на них, удерживайте эти ссылки в массиве. Например, это общий шаблон.

var 
    FLabels: array of TLabel; 
.... 
SetLength(FLabels, Count); 
for i := 0 to Count-1 do 
begin 
    FLabels[i] := TLabel.Create(Self); 
    FLabels[i].Parent := Self; 
    FLabels[i].Caption := IntToStr(i+1); 
    FLabels[i].Left := 8; 
    FLabels[i].Top := 8 + i*20; 
end; 
+1

+1. Работает, и я * делаю * как этот стиль программирования! –

+0

Спасибо. Хороший код. Могу ли я использовать это в потоках? Я имею в виду, что этот потокобезопасный? – Sky

+5

Весь код GUI должен работать в основном потоке –

11

Если вы уверены, что у вас есть 50 этикетки label1, label2 .. label50
Решение может быть таким:

var lbl: TLabel; 
for i:=1 to 50 do 
begin 
    lbl := (FindComponent('Label'+IntToStr(i)) as TLabel; 
    lbl.Caption := IntToStr(i); 
end; 
+0

Конечно, работает, но мне не нравится этот стиль программирования. –

+0

@AndreasRejbrand Почему вам это не нравится? Что случилось с этим? – Sky

+4

Число вещей. Во-первых, «FindComponent» занимает некоторое время, чтобы вычислить; вам нужно сравнить много строк. Это вам не нужно делать, если вы используете массивы. Во-вторых, используя массивы, вы получаете 100% контроль над временем жизни элементов управления. Вы можете создавать их динамически, динамически изменять и удалять их динамически. –

3

Если вы хотите изменить все метки на форме, вы можете использовать что-то вроде этого:

for i := 0 to Form1.ComponentCount do 
    if Form1.Components[i] is TLabel then 
    TLabel(Form1.Components[i]).Caption := IntToStr(i + 1); 

Если метки на панели или какой-либо другой контейнер, вы можете ограничить это, заменив Form1, например, путем «Form1.Panel1». Вы также можете использовать, например. свойство тега компонентов легко выбрать, какие метки вы хотите изменить.

Смежные вопросы