Итерация объектов на форме - PullRequest
0 голосов
/ 05 ноября 2018

Я новичок в Embarcadero C ++ Builder. Мой вопрос: можно ли повторить свойства более одного объекта с циклом?

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

 for(int i=1; i<4; i++){
    Label[i]->Caption = "xxxxx";
 }

вместо написания этого:

Labe1->Caption  = "xxxxx"; 
Labe2->Caption  = "xxxxx"; 
Labe3->Caption  = "xxxxx";

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Если вы использовали IDE для создания TLabels, вам нужно вручную создать контейнер с указателями на них.

В вашем заголовочном файле формы:

#include <vector>

И добавьте это к защищенной части вашей формы:

std::vector<TLabel*> myLabels;

И добавьте это в конструктор:

myLabels.push_back(Label1);
myLabels.push_back(Label2);
myLabels.push_back(Label3);

Или, может быть, даже это:

for(int c=0; c<ComponentCount; ++c) {
    TLabel* tmp = dynamic_cast<TLabel*>(Components[c]);
    if(tmp) myLabels.push_back(tmp);
}

Теперь вы можете перебирать ярлыки, используя цикл C ++ 11 на основе цикла:

for(auto l : myLabels) {
    l->Caption = "xxxxx";
}
0 голосов
/ 05 ноября 2018

Для этого вам нужно создать свой собственный массив.

В заголовке формы определите массив:

private:
    TLabel* labels[4];

Затем заполните массив в конструкторе формы:

labels[0] = Label1;
labels[1] = Label2;
labels[2] = Label3;
labels[3] = Label4;

Или:

for(int i = 0; i < 4; i++){
    labels[i] = static_cast<TLabel*>(FindComponent("Label"+IntToStr(i+1)));
}

Затем вы можете перебирать массив при необходимости:

for(int i = 0; i < 4; i++){
    labels[i]->Caption = "xxxxx";
}
...