Урок 18 Как управлять компонентом на форме, зная его имя No title

April 4, 2006
в колонках играет Deep Purple-Fireball


Сегодня я расскажу как можно изменять св-ва компонента, зная его имя и тип.Допустим, мы создали пару компонентов на форме, способом, описанным в прошлых двух уроках, или же просто перекинули их с палитры компонентов.И тут нам приспичило поменять надписи на всех кнопках или ещё что-нить.Вот так незадача!Конечно, это можно сделать обычным способом, анпример Button1->Caption="Новая надпись"; Но это даже как-то неинтересно.А что делать, если мы создали кнопки или другие элементы интерфейса способом, описанным на прошлых занятиях?Вот тут то нам и пригодиться эта статья.

Создайте новый проект и киньте на форму ComboBox , Button, Panel со вкладки стандартные и два TrackBar со вкладки Win32
Для того чтобы один из TrackBar- ов был вертикальным, выделите его и в object inspector ищмените св-во Orientation на trVertical
После всего этого накидайте несколько кнопок на Panel1, если кнопки принадлежат Panel1, то в Инспекторе объектов у вас должно получиться , как показано на рисунке.В данном случае для любой кнопки Button2-Button6 , Panel1 является родителем(parent).Родителем Panel1 и всех компонентов, не принадлежащих Panel1, является Form1.Эта иерархия хорошо видна в Object Treeview.



Кнопки на Panel1 вы можете создать и способом, описанном в прошлом уроке, я не стал этого делать, дабы не перегружать код.
Теперь напишем действия для обработсика событий onClick для Button1(это кнопка, на которой написано "найти все компоненты") Данная функция ищет все компоненты, принадлежащие Panel1.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ComboBox1->Clear();//очищаем ComboBox1
int i=0
// вводим переменную целочисленного типа
//цикл, в результате которого имена всех компонентов панели выводяться в ComboBox1
while(i<Panel1->ControlCount)//пока i меньше чем число контролов, выполнять..
{
ComboBox1->Items->Add(Panel1->Controls[i]->Name);
//в ComboBox1 добавляет строку с именем компонента с порядковым номером i
i++;
}
ComboBox1->ItemIndex=0;
//выделяем первую строку в нашем выпадающем списке
}

С этим закончили,теперь в событии OnChange горизонтального TrackBar напишем(событие onChange возникает, когда мы двигаем ползунок):

void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
TButton* tmpedit1=dynamic_cast<TButton*>(Form1->FindComponent(ComboBox1->Items->Strings[ComboBox1->ItemIndex]));
if(tmpedit1!=NULL)
//
если найденный компонент кнопка, то выполняем следующие действия..
{
TrackBar1->Max=Panel1->Width-tmpedit1->Width;
//максимальное значение трекбара - это ширина панели минус ширина кнопки.Делается это для того чтобы при перемещении ползунка, кнопка не перемещалась за пределы панели1
tmpedit1->Left=TrackBar1->Position;//позиция ползунка=отступ слева у кнопки
}
}


Теперь поясню этот код:
ComboBox1->Items->Strings[ComboBox1->ItemIndex] -таким образом мы извлекаем надпись из ComboBox, которая отображается в данный момент
Form1->FindComponent("имя компонента"); - поиск компонента, возвращает TObject*
TButton* tmpedit1=dynamic_cast<TButton*>("указатель на объект") - с этой функцией мы уже знакомы

Аналогично, составляем код для вертикального трекбара, объянять не буду, думаю разберётесь.

void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
TButton* tmpedit1=dynamic_cast<TButton*>(Form1->FindComponent(ComboBox1->Items->Strings[ComboBox1->ItemIndex]));
if(tmpedit1!=NULL)
{
TrackBar2->Max=Panel1->Height-tmpedit1->Height;
tmpedit1->Top=TrackBar2->Position;
}


Вроде бы всё.Теперь нажмите на кнопку "найти вс компоненты " и в комбобоксе выберите имя любой понравившейся кнопки .Теперь пеемещайте ползунки.Правда здорово?

готовая программа


Если есть вопросы по этому материалу или вопросы в принципе, пишите на мыло, ответы постараюсь выложить в последующих уроках.


Author of article - MA F*CKA CREW 2006
www.builderhelper.3dn.ru
builder.helper@rambler.ru