Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.64
prosto_lynx
49 / 24 / 2
Регистрация: 09.06.2008
Сообщений: 226
#1

События динамически созданных компонентов... - C++ Builder

21.02.2011, 16:38. Просмотров 5367. Ответов 9
Метки нет (Все метки)

Как создать обработчик события для динамически созданного визуального компонента?
C++
1
2
3
4
5
6
7
8
9
10
11
TForm *mF;
mF = new TForm(Form1);
mF->Parent=Form1;
mF->Show();
mF->Width = 240;
mF->Height = 74;
mF->Caption = "Созданная форма";
TButton *B1;
B1 = new  TButton(mF);
B1->Parent=mF;
B1->Caption = "Моя кнопка";
По нажатию на одну кнопку на форме выполняется вышеуказанный код.
Вопрос: как теперь создать код для события (например OnClick) для кнопки B1?
http://www.cyberforum.ru/cpp-builder/thread742521.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 16:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос События динамически созданных компонентов... (C++ Builder):

Удаление динамически-созданных компонентов
Использую класс, компонентами которого кроме всего прочего, являются StaticText...

Обработка событий динамически созданных компонентов
По нажатию на кнопку я создаю новый компонент на форме. ...

События динамически созданных объектов
Доброго всем времени суток! Суть вопроса такова: я динамически в...

События динамически созданных объектов
Всем привет :) Вопрос в том, как сделать отдельные события для каждой...

Работа с большим количеством динамически созданных компонентов.
На форме динамически создается GroupBox, а на нём множество других компонентов...

9
FaB0SS
67 / 67 / 9
Регистрация: 10.02.2011
Сообщений: 131
21.02.2011, 16:39 #2
Вот тут есть код http://www.cyberforum.ru/cpp-builder/thread226088.html
0
NiTan
Покинул форум
3161 / 1345 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
21.02.2011, 17:53 #3
prosto_lynx, очень просто. Можно, к примеру, вот так:
Для начала, обьявим наше событие в Unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
 
        void _fastcall BClick(TObject* Sender);//Обьявили событие и обозвали его как захотели (BClick)
 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Теперь опишем наше событие и присвоим его динамически созданной кнопке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 void __fastcall TForm1::BClick(TObject *Sender)
 {
 ShowMessage("Amazing!"); //Просто для проверки
 }
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm *mF;
mF = new TForm(Form1);
mF->Parent=Form1;
mF->Show();
mF->Width = 240;
mF->Height = 74;
mF->Caption = "ÑîçäГ*Г*Г*Г*Гї ôîðìГ*";
TButton *B1;
B1 = new  TButton(mF);
B1->Parent=mF;
B1->Caption = "Мое кнопище!";
B1->OnClick=BClick;  //Вот, здесь мы присвоили динамически-созданной кнопке созданное нами ранее событие
}
//---------------------------------------------------------------------------
3
prosto_lynx
49 / 24 / 2
Регистрация: 09.06.2008
Сообщений: 226
19.09.2011, 23:17  [ТС] #4
Вот теперь такой вопрос возник:
Создаю я, значит, компоненты TEdit в цикле, и даю им названия MyEdit[0] ... MyEdit[15] (т.е. делаю массив компонентов).
При нажатии кнопки с клавиатуры в этих Edit-ах прога идет на их общий обработчик OnPressKey().
Как мне в этом обработчике узнать, в каком именно Edit-е (из массива) была нажата кнопка?..
0
SalterOk
116 / 113 / 10
Регистрация: 02.06.2011
Сообщений: 280
19.09.2011, 23:57 #5
Цитата Сообщение от prosto_lynx Посмотреть сообщение
Как мне в этом обработчике узнать, в каком именно Edit-е (из массива) была нажата кнопка?..
внутри твоей функции проверяй Sender (типа TObject* ) на соответствие некоторым данным(как сам решишь)
1
NiTan
Покинул форум
3161 / 1345 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
20.09.2011, 14:12 #6
Цитата Сообщение от prosto_lynx Посмотреть сообщение
Создаю я, значит, компоненты TEdit в цикле, и даю им названия MyEdit[0] ... MyEdit[15] (т.е. делаю массив компонентов).
При нажатии кнопки с клавиатуры в этих Edit-ах прога идет на их общий обработчик OnPressKey().
Как мне в этом обработчике узнать, в каком именно Edit-е (из массива) была нажата кнопка?.
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::EditKeyPress(TObject *Sender, char &Key)  //Общий обработчик события OnKeyPress для всех Ваших Edit'ов
{
 if( ((TEdit*)Sender)->Name=="Edit1") //Если имя обьекта, в котором нажали кнопку, равно Edit1
 {
 ShowMessage("Yeah!");  //Радуемся
 }
 
}
//---------------------------------------------------------------------------
2
prosto_lynx
49 / 24 / 2
Регистрация: 09.06.2008
Сообщений: 226
21.09.2011, 21:32  [ТС] #7
А можно ли как-нибудь попроще получить доступ, например, к текстовому полю?
(А то сначала вычислять имя компонента, а потом обращаться - как-то громоздко...)
0
NiTan
Покинул форум
3161 / 1345 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
21.09.2011, 21:35 #8
prosto_lynx, а подробнее можно, а что-то не понял я...
0
prosto_lynx
49 / 24 / 2
Регистрация: 09.06.2008
Сообщений: 226
21.09.2011, 21:59  [ТС] #9
Создавая компоненты в цикле, я их называю: MyEdit0, MyEdit2... MyEdit15.

В обработчике события я
1) получаю строковую переменную, содержащую название элемента, в котором произошло событие
2) вычисляю номер этого компонента
3) обращаюсь к его текстовому полю
C++
1
2
3
        AnsiString as = ((TControl *)Sender)->Name;
        int i = StrToInt(as.SubString(7, as.Length()-6));
        AnsiString txt = ETM[i]->Text;
Уж как-то очень некультяписто получается... интуитивно кажется, что это можно проще сделать...)))
0
LK
Заблокирован
21.09.2011, 22:21 #10
можно в цикле
C++
1
2
3
//...
AnsiString mEdit = MyEdit+IntToStr(i);
// ...
- кликнули - пробежался по компонентам
если количество алиментов известно, можно в массив и обращаться так же

Добавлено через 7 минут
или присвоить им теги - тот же номер, что и в имени, хотя называть тогда стоит MyEdit10+IntToStr(i), например при создании, что будет проще, и потом обращаться:
C++
1
2
for(int i = 0; i < ComponentCount; i++) {
  if ((Components[i]->Tag >= 101)  {фа-фа->ля-ля();}
0
21.09.2011, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 22:21
Привет! Вот еще темы с решениями:

События для динамически созданных кнопок
Доброе время суток! Я создал свой класс objekt (); //конструктор...

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

Удаление динамически созданных TSpeedButton
Имеется такой вот код, оптимизации 0, но сейчас не об этом. При попытке...

Покраска динамически созданных StringGrid
Всем доброго времени суток. Кто может подсказать как можно покрасить занятые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru