Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.64
prosto_lynx
49 / 24 / 1
Регистрация: 09.06.2008
Сообщений: 226
#1

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

21.02.2011, 16:38. Просмотров 5020. Ответов 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 16:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос События динамически созданных компонентов... (C++ Builder):

События динамически созданных компонентов - C++ Builder
В проекте динамически создаются компоненты TShape нажатием мыши на форме. Для компоненты необходимо обработать событие OnMouseDown,в...

Удаление динамически-созданных компонентов - C++ Builder
Использую класс, компонентами которого кроме всего прочего, являются StaticText и Edit, графическое изображение. Создаю экземпляр класса...

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

События динамически созданных объектов - C++ Builder
Доброго всем времени суток! Суть вопроса такова: я динамически в пользовательском классе создаю объект класса TTimer. Мне необходимо...

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

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

9
FaB0SS
67 / 67 / 2
Регистрация: 10.02.2011
Сообщений: 131
21.02.2011, 16:39 #2
Вот тут есть код Добавить любой элемент на форму
0
NiTan
Покинул форум
3152 / 1335 / 50
Регистрация: 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 / 1
Регистрация: 09.06.2008
Сообщений: 226
19.09.2011, 23:17  [ТС] #4
Вот теперь такой вопрос возник:
Создаю я, значит, компоненты TEdit в цикле, и даю им названия MyEdit[0] ... MyEdit[15] (т.е. делаю массив компонентов).
При нажатии кнопки с клавиатуры в этих Edit-ах прога идет на их общий обработчик OnPressKey().
Как мне в этом обработчике узнать, в каком именно Edit-е (из массива) была нажата кнопка?..
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
19.09.2011, 23:57 #5
Цитата Сообщение от prosto_lynx Посмотреть сообщение
Как мне в этом обработчике узнать, в каком именно Edit-е (из массива) была нажата кнопка?..
внутри твоей функции проверяй Sender (типа TObject* ) на соответствие некоторым данным(как сам решишь)
1
NiTan
Покинул форум
3152 / 1335 / 50
Регистрация: 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 / 1
Регистрация: 09.06.2008
Сообщений: 226
21.09.2011, 21:32  [ТС] #7
А можно ли как-нибудь попроще получить доступ, например, к текстовому полю?
(А то сначала вычислять имя компонента, а потом обращаться - как-то громоздко...)
0
NiTan
Покинул форум
3152 / 1335 / 50
Регистрация: 29.01.2010
Сообщений: 2,887
21.09.2011, 21:35 #8
prosto_lynx, а подробнее можно, а что-то не понял я...
0
prosto_lynx
49 / 24 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Удаление динамически созданных объектов - C++ Builder
Помогите плз. Пишу курсач по МИО. Вот ща работаю над интерфейсом. Я по нажатию кнопку создаю динамически объект edit. Хочу теперь при...

Поиск динамически созданных TabSheet - C++ Builder
Помогите пожалуйста. Есть TPageControl, на нем динамически созданы вкладки (количество может быть разное). На форме динамически...

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


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

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

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