C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TComboBox
Любитель
Отправлено: 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


Не зарегистрирован







Всем огромное спасибо за очень быстрый ответ! smile.gif

Вернуться в Вопросы программирования в C++Builder