Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Организация цикла для компонентов


Автор: Abrek 1.4.2004, 13:20
Извините за потенциально ламерский вопрос, но обстоятельства вынуждают.
Пишу под Borland Builder5.
Допустим у меня на форме 10 компонентов TEdit: Edit1, Edit2,.....Edit10.
Можно ли совершать как-то преобразования с ними в цикле? Надеюсь будет понятно:
fot(i=1;i<10;i++)
{
Edit(i).Text="666";
}
Как это организовать по-настаящему?

Автор: Borisff2003 1.4.2004, 14:22
Код

int i,j;
  char t[33];
  AnsiString str;
//вместо 5 скока тебе надо
  for(j=1;j<5;j++)
  {
     //формируешь имя компанента
       str="Edit";
       str+=j;
    for(i=0;i<ComponentCount;i++)
    {
       if(Components[i]->Name==str)
          dynamic_cast<TEdit*>(Components[i])->Text="fg";
    }
  }


и надеемся что едиты это действительно эдиты

Автор: Abrek 1.4.2004, 15:22
Огромное пасибо!

Автор: DenDen 2.4.2004, 15:39
Вообще говоря, имеются еще 2 банальных пути, не требующие, однако, просмотра ысех компонентов и кастов(вообще, утверждается что cast'ы довольно длительная операция).
Путь 1) объявления массива ( void**) и вручную присваевание разным едитам разных указателей.
//
something
....
//
void** my_mas;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
my_mas=(void*)malloc(40);
my_mas[0]=(void*)Edit1;
my_mas[1]=(void*)Edit2;
my_mas[2]=(void*)Edit3;
my_mas[3]=(void*)Edit4;
my_mas[4]=(void*)Edit5;
my_mas[5]=(void*)Edit6;
my_mas[6]=(void*)Edit7;
my_mas[7]=(void*)Edit8;
my_mas[8]=(void*)Edit9;
my_mas[9]=(void*)Edit10;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i<10;i++)
((TEdit*)my_mas[i])->Text="Hello World";
}

////something

Способ 2) Применяется, когда Едиты(много) или другие компоненты(еще больше) располагаются в вполне определенном порядке(например в колонку). В этом случае их лучше создавать динамически:
//something
TEdit** Ed;


__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Ed=new TEdit*[10];
int Top=something_1;
int Height=something_2;
int Left=something_3;
for(int i=0;i<10;i++)
{
Ed[i]=new TEdit(this);
Ed[i]->Parent=this;
Ed[i]->Left=Left;
Ed[i]->Top=Top;
Ed[i]->Height=Height;
Top+=Height;
}


}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i<10;i++)
Ed[i]->Text="Hello Wrld";
}







Автор: Дрон 3.4.2004, 21:24
Цитата
Путь 1) объявления массива ( void**) и вручную присваевание разным едитам разных указателей

Только зачем тип void*?
Проще объявить массив типа TEdit* тогда никаких cast'ов вообще не надо smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)