Динамическое создание компонентов
Обработка Button1Click
TButton *bb[100];
for(i = 0; i < 100; i++){
bb = new TButton(this);
...
Form1->InsertControl(bb);
}
...Нарисовал еще 100 "кнопок".
Как написать ОДИН обработчик собатий
нажатий этих кнопок, чтоб он понимал
какая именно "кнопка" нажата?
On 2002-02-05 1608, V_italik wrote
Помещаю на форму Button1.
Обработка Button1Click
TButton *bb[100];
for(i = 0; i < 100; i++){
bb = new TButton(this);
...
Form1->InsertControl(bb);
}
...Нарисовал еще 100 "кнопок".
Как написать ОДИН обработчик собатий
нажатий этих кнопок, чтоб он понимал
какая именно "кнопка" нажата?
Хм...можно action list наворотить на сто событий, а можно различать кнопки присваивая, например, значение i свойству tag кнопки и замутить жуткий switch на сотню вариантов
...
Button1->OnClick = MyButtonClick;
...
}
void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
...
}
On 2002-02-05 1608, V_italik wrote
Помещаю на форму Button1.
Обработка Button1Click
TButton *bb[100];
for(i = 0; i < 100; i++){
bb = new TButton(this);
...
Form1->InsertControl(bb);
}
...Нарисовал еще 100 "кнопок".
Как написать ОДИН обработчик собатий
нажатий этих кнопок, чтоб он понимал
какая именно "кнопка" нажата?
Есть такой параметр Sender,так вот он в точности равен тому что возвращает new TButton, так что при вызове одного и того же OnBtnClick для каждой из 100 кнопок он будет уникальным и Tag'и в ручную ставить не надо и список мутить тоже
Я всего лишь хотел менять Капшены на программно созданных кнопках, но немного поразмыслив ты модернезируешь ниже представленную программку
TList *MyList = new TList;
for(int i=0; i<3; i++)
{
pButton = new TButton(Form1);
pButton->Parent=Form1;
pButton->Top=i*25;
MyList->Add(pButton);
}
TButton *MyButton=new TButton(Form1);
MyButton=(TButton*)MyList->Items[2];
MyButton->Caption="третья кнопка";
MyButton=(TButton*)MyList->Items[1];
MyButton->Caption="вторая кнопка";
MyButton=(TButton*)MyList->Items[0];
MyButton->Caption="первая кнопка";
delete MyList;
Я всего лишь хотел менять Капшены на программно созданных кнопках, но немного поразмыслив ты модернезируешь ниже представленную программку
TList *MyList = new TList;
for(int i=0; i<3; i++)
{
pButton = new TButton(Form1);
pButton->Parent=Form1;
pButton->Top=i*25;
MyList->Add(pButton);
}
TButton *MyButton=new TButton(Form1);
MyButton=(TButton*)MyList->Items[2];
MyButton->Caption="третья кнопка";
MyButton=(TButton*)MyList->Items[1];
MyButton->Caption="вторая кнопка";
MyButton=(TButton*)MyList->Items[0];
MyButton->Caption="первая кнопка";
delete MyList;
// что может быть четыре основных метода определения нажатой кнопки
// По Имени, по Tag, по Caption, и по Left & Top
// В Unit1.h в описании класса формы например в раделе public уже должно быть
// void __fastcall ButtonKeyClick(TObject *Sender);
// TButton *bb[100];
// Размещать список указателей на создаваемые кнопки
// в текущей функции как-то не вижу смысла
// так как в этом случае этот список не будет доступен
// из других функций хотя область видимости к этому вопросу
// (почти) не имеет отношения
// Где-то в Unit1.cpp создаем наши 100 кнопок
for(int i = 0; i < 100; i++)
{
bb = new TButton(this);
bb->Left=i*60-(i/10)*60*10;
bb->Top=(i/10)*30;
bb->Width=54;
bb->Caption="Key"+String(i+1);
bb->Name="N"+String(i+1);
// Как предложил Посторонний можно использовать свойство Tag
// для указания номера кнопки
bb->Tag=i;
bb->onClick=ButtonKeyClick;
Form1->InsertControl(bb);
}
//---------------------------------------------------------------------------
void __fastcall TForm1ButtonKeyClick(TObject *Sender)
{
// Способ первый выявить какая из bb[] нажата при помощи содержимого свойства Name
// Читаем у сендер свойство Name в переменную strName типа String
String strName=((TButton*)Sender)->Name;
// Вырезаем первый символ "N"
strName.Delete(1,1);
// Преобразуем строку в число и получаем в целочисленной переменной iNumberButton
// номер нашей кнопки
int iNumberButton=strName.ToInt()-1;//((strName.Delete(1,1)));
// Для проверки верности работы функции выводим на экран
// содержимое Caption найденной кнопки
ShowMessage(bb[iNumberButton]->Caption);
// Способ второй у меня будет способом Постороннего
// Достаточно прочитать номер кнопки из Tag
// (хотя я бы предпочел зарезервировать это свойство под другие цели
// а то зачем нам вообще нужно свойство Name )
int iNumButton=((TButton*)Sender)->Tag;//((strName.Delete(1,1)));
// Для проверки верности работы функции выводим на экран
// содержимое Caption найденной кнопки
ShowMessage(bb[iNumButton]->Caption);
// Способ третий определить какая кнопка нажата через значение свойства Caption
// Допустим если мы создаем группу кнопок которые должны выдать список полей
// базы данных начинающихся на одну из букв алфавита то было бы логично
// просто на каждой кнопке прописать эту букву и потом узнать
// какая буква алфавита нужна проверив ((TButton*)Sender)->Caption
// Способ четвертый каждая кнопка расположена в определенных координатах
// и если есть какая то зависимость между расположением кнопки
// и тем что она должна делать то лучше искать не саму кнопку
// (хотя ее положение обычно будет напрямую зависеть от i в создающем
// кнопку цикле и значит можно по обратной функции найти ее номер)
// а сразу проверять какое действие должно быть выполнено
// по тому где находится нажатая кнопка
// ((TButton*)Sender)->Left и ((TButton*)Sender)->Top
}
On 2002-02-05 1608, V_italik wrote
Помещаю на форму Button1.
Обработка Button1Click
TButton *bb[100];
for(i = 0; i < 100; i++){
bb = new TButton(this);
...
Form1->InsertControl(bb);
}
...Нарисовал еще 100 "кнопок".
Как написать ОДИН обработчик собатий
нажатий этих кнопок, чтоб он понимал
какая именно "кнопка" нажата?
Просто наследуй класс TButton и переопредели события все которые тебе нужны, если интересует как добраться какой компонент активный на форме могу кинуть исходник [EMAIL]stepun@mail.ru[/EMAIL]
On 2002-02-05 1608, V_italik wrote
Помещаю на форму Button1.
Обработка Button1Click
TButton *bb[100];
for(i = 0; i < 100; i++){
bb = new TButton(this);
...
Form1->InsertControl(bb);
}
...Нарисовал еще 100 "кнопок".
Как написать ОДИН обработчик собатий
нажатий этих кнопок, чтоб он понимал
какая именно "кнопка" нажата?
Просто наследуй класс TButton и переопредели события все которые тебе нужны, если интересует как добраться какой компонент активный на форме могу кинуть исходник [EMAIL]stepun@mail.ru[/EMAIL]