C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамические создание кнопок  (Прочитано 1996 раз)
excellion44
Участник


Сказали спасибо: +10/-9
Offline

Сообщений: 275


Динамические создание кнопок
« : 22 Июнь 2016, 16:52:29 »

Доброго времени суток! К примеру в цикле формирую кучу кнопок, мне надо чтобы каждая выполняла свою задачу.
И так подробнее:

к примеру одна кнопка

               
Код
TPNGButton *pngButton[10];
               pngButton[1] = new TPNGButton(this);
               pngButton[1]->Top = 290;
               pngButton[1]->Left = 10;
               pngButton[1]->Visible = true;
               pngButton[1]->Parent = this;
               pngButton[1]->OnClick = MyKeyPress;
               pngButton[1]->Name = "name";
[/color]
Код
void __fastcall TForm1::MyKeyPress(TObject *Sender)
{
       ShowMessage("Привет");
}

Все кнопка появляется  и выполняет то что надо, но если мне надо много кнопок и у них постоянно будут меняться их задачи т.е. как в примере выше, нужно что бы кнопки писали разные слова которые у меня формируются в цикле ну это не суть

делаю так:

 
Код
                String text = "Вася"
               TPNGButton *pngButton[10];
               pngButton[1] = new TPNGButton(this);
               pngButton[1]->Top = 290;
               pngButton[1]->Left = 10;
               pngButton[1]->Visible = true;
               pngButton[1]->Parent = this;
               pngButton[1]->OnClick = MyKeyPress(this,text);
               pngButton[1]->Name = "name";
[/color]
Код
void __fastcall TForm1::MyKeyPress(TObject *Sender, String name)
{
       ShowMessage(name);
}

Проект не компилится, выдает ошибку [C++ Error] Unit1.cpp(93): E2109 Not an allowed type

как сделать что бы один кусок кода
Код
void __fastcall TForm1::MyKeyPress(TObject *Sender, String name)
{
       ShowMessage(name);
}
работал на все кнопки, только изменял свои действия в зависимости от того что пришлет та или иная кнопка. Блин трудно то как объяснить что у меня в голове лежит =)
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Динамические создание кнопок
« Ответ #1 : 23 Июнь 2016, 08:22:19 »

Ну так тип обработчика не соответствует. Так как хочется - не сделать.
« Последнее редактирование: 23 Июнь 2016, 08:40:21 от POV » Записан
Valdemar
Давний друг


Сказали спасибо: +60/-4
Offline

Сообщений: 285


Re: Динамические создание кнопок
« Ответ #2 : 23 Июнь 2016, 08:29:22 »

Обработчик события OnClick кнопки имеет только один параметр TObject *Sender, который является указателем на объект, породивший событие. Поэтому нельзя в качестве обработчика назначить метод с другой сигнатурой.
Когда пишите "pngButton[1]->OnClick = ", то надо указывать только имя метода без передаваемых параметров.
Если требуется, чтобы один обработчик использовался для нескольких кнопок и при этом результат его действия отличался для разных кнопок, то надо как-то отличать кнопки внутри обработчика. Например, приводите Sender к типу TButton, а потом смотрите его Caption или, что на мой взгляд лучше, свойство Tag, в которое можно при создании кнопки записать какую-то дополнительную информацию.
Записан
excellion44
Участник


Сказали спасибо: +10/-9
Offline

Сообщений: 275


Re: Динамические создание кнопок
« Ответ #3 : 26 Июнь 2016, 10:13:33 »

Цитата: Valdemar от 23 Июнь 2016, 08:29:22
Обработчик события OnClick кнопки имеет только один параметр TObject *Sender, который является указателем на объект, породивший событие. Поэтому нельзя в качестве обработчика назначить метод с другой сигнатурой.
Когда пишите "pngButton[1]->OnClick = ", то надо указывать только имя метода без передаваемых параметров.
Если требуется, чтобы один обработчик использовался для нескольких кнопок и при этом результат его действия отличался для разных кнопок, то надо как-то отличать кнопки внутри обработчика. Например, приводите Sender к типу TButton, а потом смотрите его Caption или, что на мой взгляд лучше, свойство Tag, в которое можно при создании кнопки записать какую-то дополнительную информацию.

Свойство  Tag  решило проблему!

Код
void __fastcall TForm1::MyKeyPress(TObject *Sender)
{
       ShowMessage(*reinterpret_castString*>(static_castTPNGButton*>(Sender)->Tag)); // Получаем из Tag указатель, и печатаем содержимое памяти...
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String text = "Вася";
   pngButton[1] = new TPNGButton(this);
   pngButton[1]->Top = 290;
   pngButton[1]->Left = 10;
   pngButton[1]->Visible = true;
   pngButton[1]->Parent = this;
   pngButton[1]->OnClick = MyKeyPress;
   pngButton[1]->Name = "name";
   pngButton[1]->Tag = reinterpret_castint>(new String(text)); // пишем строку в память, указатель присваиваем в Tag
}
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #4 : 17 Сентябрь 2016, 11:15:06 »

Зачем все эти ужасные приведения, эти танцы с бубном? К тому же в твоем решении утечка памяти, ты в Tag заталкиваешь динамически выделяемую строку String, приводя ее к int! 

Если конкретно эту задачу надо решить, не проще второй параметр (строковая переменная) держать отдельно в виду глобальной переменной или члена класса формы? И менять значение непосредственно перед вызовом. Напр.
Код
//...
pngButton[1]->OnClick = MyKeyPress;
//...
 
void __fastcall TForm1::MyKeyPress(TObject *Sender)
{
  ShowMessage(my_string); // my_string - член Form1
}
 
//...
 
my_string = L"foobar";
pngButton[1]->Click();
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.063 секунд. Запросов: 21.