Любитель |
Отправлено: 15.04.2005, 09:53 |
|
Не зарегистрирован
|
Компоненты TComboBox создаются программно:
CODE | TComboBox *cb;
int kol_vo=CSpinEdit1->Value;
for(int i=0;i<kol_vo;i++)
{
cb=new TComboBox(this);
cb->Parent=this;
cb->Top=50;
cb->Width=125;
cb->Left=i*125;
cb->OnChange = cbChange;
cb->Name = "cb" + IntToStr(i);
}
void __fastcall TForm1::cbChange(TObject *Sender)
{
// код
} |
В описание класса формы в раздел public ввожу объявление:CODE | void __fastcall cbChange(TObject *Sender); |
И все работает, но в этом случае всем компонентам cb присваивается обработчик события cbChange независимо от имени. Мне надо, чтобы каждому компоненты cb присваивался свой обработчик OnChange.
Пишу следующее:
CODE | TComboBox *cb;
int kol_vo=CSpinEdit1->Value;
for(int i=0;i<kol_vo;i++)
{
cb=new TComboBox(this);
cb->Parent=this;
cb->Top=50;
cb->Width=125;
cb->Left=i*125;
cb->OnChange = cb+IntToStr(i)+Change;//здесь ошибка. Если бы можно было присваивать так как написано, тогда бы работало. Помогите исправить эту ошибку
cb->Name = "cb" + IntToStr(i);
}
void __fastcall TForm1::cb1Change(TObject *Sender)
{
// код
}
void __fastcall TForm1::cb2Change(TObject *Sender)
{
// код
}
|
В описание класса формы в раздел public ввожу объявление:
CODE | void __fastcall cb1Change(TObject *Sender);
void __fastcall cb2Change(TObject *Sender); |
Так-то должно работать, только мешает cb->OnChange = cb+IntToStr(i)+Change; Как быть? Спасибо. |
|
Guest |
Отправлено: 15.04.2005, 10:08 |
|
Не зарегистрирован
|
по моему ссылка происходит на один и тотже объект TComboBox.
Не проверял, но наверное TComboBox *cb;
нодо вставить в цикл for(). |
|
Gedeon |
Отправлено: 15.04.2005, 10:17 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
А зачем Вам разные обработчики, сделайте одну функцию на всех и определяйте от какого бокса прищло изменение, а там тот код к-рый был бы в разных.
Что-то типа этого
н
CODE |
void __fastcall cbChange(TObject *Sender); |
срр
CODE |
void __fastcall TForm1::cbChange(TObject *Sender)
{
TComboBox *CB;
if((CB = dynamic_cast<TComboBox*>(Sender)) != 0){
int cbNumber = StrToInt(CB->Name.Delete(1,2));
switch (cbNumber)
{
case 1:{
ShowMessage("BoxNumber 1");
}
break;
case 2:{
ShowMessage("BoxNumber 2");
}
break;
}
}
}
//--------------------------------------------------------------------------- |
Отредактировано Gedeon — 15/04/2005, 10:33
|
|
AVC |
Отправлено: 15.04.2005, 10:39 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
cb->OnChange = cb+IntToStr(i)+Change;//здесь ошибка. Если бы можно было присваивать так как написано, тогда бы работало. Помогите исправить эту ошибку
|
Вы пытаетесь вместо адреса функции записать в ячейку символическое имя функции, да еще и в runtime.
Вам может помочь
swhitch(i)
{ case1: cb->OnChange = cb1Change; break;
case2: cb->OnChange = cb2Change; break;
и т.д.
Но лучше сделать как советовал Gedeon
Если лениво разбирать имя бокса — используйте Tag.
В цикле создания cb->Tag = i;
В OnChange — анализ
TComdoBox *cb = dynamic_cast(Sender);
if (!cb) return;
switch (cb->Tag)
А что бы работать так как вы хотите — нужно сначала найти адрес метода класса вашей формы по имени cb+IntToStr(i)+Change и затем подставить его в обработчик.
|
|
fish |
Отправлено: 15.04.2005, 11:41 |
|
Не зарегистрирован
|
А еще можно создать массив с адресами обработчиков события OnChange и писать в цикле cb->OnChange = handlers[i]. Т.е. handlers — это как раз и есть тот самый массив с адресами функций cb1Change, cb2Change... Попробуй... |
|
Любитель |
Отправлено: 15.04.2005, 12:34 |
|
Не зарегистрирован
|
Всем огромное спасибо за очень быстрый ответ! |
|