Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Генерация события компонента

07.02.2012, 12:54. Показов 4556. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в программно сгенерировать(симулировать) событие на компоненте ?
Видимо, это должно быть не сложно, но при изучении VCL по книжкам я этот момент как-то пропустил
Что нибудь типа
C++
1
Button1->OnClick;
Можно конечно
C++
1
Button1->Perform(WM_..., ..., ...);
Но тогда приходится гадать, какой именно WM посылать
Я говорю не о конкретном клике на Батоне, меня интересует принцип ПРОГРАММНОЙ ГЕНЕРАЦИИ СОБЫТИЙ НА КМПОНЕНТАХ
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2012, 12:54
Ответы с готовыми решениями:

Возможно ли отследить выполнение события от компонента билдера ?
Такой вопрос: можно ли отследить выполнение события от компонента билдера ? Вот такого вида: if(asd()){} выполнять действия по...

Почему для компонента TOpenDialog не отрабатываются события
Здравствуйте. Подскажите пожалуйста почему для компонента TOpenDialog не отрабатываются события, (W-7, C++ Builder XE) и как можно решить...

Как переопределить методы компонента, обрабатывающие события OnMouseEnter, OnMouseLeave
У многих компонентов есть события OnMouseEnter, OnMouseLeave, но нет методов, которые эти события обрабатывают. По аналогии событие OnClick...

12
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
07.02.2012, 13:15
То ли я чего недопонял..., "событие на компоненте" обрабатывается некоей функцией (в простонародье - обработчиком), и как любую функцию ее можно вызвать из любого другого события, хоть по таймеру. Типа Edit1Change(0) или ..(this). Вот только если в функции используются передаваемые ей параметры, то их желательно включить в вызов корректно, иначе ... мало ли что.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2012, 14:29  [ТС]
nick42, Это немножко не то. Да, я могу вызвать обработчик OnClick своего батона, если Sender в обработчике не используется, могу передать хоть NULL. А если используется?
Или в VCL нет вообще такого механизма? Хотя он вполне естественен.
Пример использования. Заказчик хочет иметь возможность не тыкать мышью в батоны, а давать команды через клаву. Ну и если такой механизм есть, я на каждую буквочку симулирую OnClick соответствующего батона и все дела.
А если нет, приходится писать что-то вроде такого уродства
C++
1
2
 TButton Tmp = *Button1;
 Button1Click(&Tmp);
В корректности этого кода не уверен.
Беда еще в том, что у меня разные батоны обрабатываются одним обработчиком (по Tag их различающему)
У меня Бюльдер 6
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
07.02.2012, 14:37
не знаю; я уверен, что это возможно. Дайте конкретный пример и я покажу, как это сделать. А грамотно сформулировать ответ... у меня программистский лексикон небогатый, увы.
1
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
07.02.2012, 14:41
Цитата Сообщение от Байт Посмотреть сообщение
Заказчик хочет иметь возможность не тыкать мышью в батоны, а давать команды через клаву
В таком случае зачем вам вообще кнопки?
Реализуйте что-то вроде командной строки!
Хм..хотя представляя конечный вариант программы выходит интерпретатор какой-то..
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
07.02.2012, 14:56
ну, вот пример к Вашему случаю, мне кажется...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void __fastcall TForm1::Button2Click(TObject *Sender)
{
       if (((TButton *)Sender)->Tag == 12)
          ShowMessage("Äâåíàäöàòü");
       if (((TButton *)Sender)->Tag == 17)
          ShowMessage("Ñåìíàäöàòü");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit1Click(TObject *Sender)
{
      TButton *bu = new TButton(this);
      bu->Parent = Form1;
 
      if (Edit1->Text == "1")  { bu->Tag = 12; Button2Click(bu); } ;
      if (Edit1->Text == "2")  { bu->Tag = 17; Button2Click(bu); } ;
      delete bu;
}
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2012, 15:25  [ТС]
Ну, пример, что я привел - это так - для примера.
Попробую дать более содержательную задачу.
Вот у меня на форме есть несколько компонентов.
По событиям на них (OnClick, OnChange, OnSelect...) выполняются некие простые обработчики.
Теперь я хочу одним махом (по какому-то другому батону или из пункта меню) запустить последовательность этих обработчиков, может быть даже в цикле.
И если бы это было возможно, я бы написал что-то вроде
C++
1
2
3
4
 ListBox1->OnChange;
 Button2->OnClick;
 ListBox2->OnSelect;
 Button3->OnClick;
Код скорее всего неверен
Те. последовательный вызов обработчиков OnChange привязанного к ListBox1. OnClick, привязанного к Button2 итд. С передачей в обработчики в качестве Sender именно ListBox1, Button2...
Можно конечно скопировать в это место все эти обработчики. Но я очень не люблю дублировать код, и многие меня, наверное, поймут.
Можно еще вытащить всю содержательную часть обработчиков в отдельные методы и вызывать эти методы как в них, так и в моем "Большом обработчике" Те. выход есть.
Но интересно, есть ли возможность вызывать именно обработчик, привязанный к конкретному компоненту.

Добавлено через 9 минут
nick42, Спасибо, но опять не то. Это я видел. Громоздко как-то получается. Неоправдано громоздко.
Но пока писал я пост, идея в голову пришла.
C++
1
 Button1->OnClick(Button1);
Это, кажется корректно. Ведь Button1->OnClick = Button1Click по построению! И как Sender он же передается. Небольшая тавтология, но цель кажется достигается. Более того, при смене обработчика OnClick все работает инвариантно. (должно).
Попробую - доложу.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
07.02.2012, 15:35
- дальше - я пасс!
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
07.02.2012, 15:51
C++
1
Button->Click();
?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2012, 15:54  [ТС]
Урра! Все работает!
C++
1
Button1->OnClick(Button1);

Спасибо всем, кто принял участие
1
Day
 Аватар для Day
1180 / 990 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
07.02.2012, 20:30
Цитата Сообщение от Байт Посмотреть сообщение
Урра! Все работает!

Код C++
123 Button1->OnClick(Button1);
Ты просто никак не мог понять, что такое OnClick. А это просто - свойство. Такое же как Left или Top. Под ним скрывается поле данных - FOnClick, которое есть просто указатель на функцию. Если бы (не дай Бог!) FOnClick было не в привате, а в публике, можно было б спокойно писать
C++
1
Button1->FOnClick = B1Click;
И в итоге OnClick и B1Click - синонимы.
Тебе, видать, втемяшилось, что указатели на функцию - не такие же обычные указатели, как и на любые другие данные.
Разобрался? - Поздравляю!
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.02.2012, 00:10  [ТС]
Day, как говаривал мой любимый писатель Виктор Шкловский, "Я - глухарь. Я клепал котлы изнутри". Понимаете, опыт работы на Минске-22, Урал-14 и пр. зря не проходит. Пока не увижу, как это все хозяйство ложится в память, понять не могу.
1
 Аватар для Whatson2
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
17.04.2015, 10:43
Ув. тов., знатоки !
Подскажите, а можно ли в runtime-е назначать обработчики событий для __published-методов компонента (которые в коде программы не объявлены)?

Я подозреваю, что можно начать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    TComponent *Component = ... //тут подопытный компонент
    TPropList *pList;
    TPropInfo *pPropInfo;
    UnicodeString Event, TypeEvent;
    int count = GetPropList((TTypeInfo *)Component->ClassInfo(), tkMethods, NULL, false);  //получаем общее число методов
    try {
        pList = (TPropList *)new char[count*sizeof(void *)];
        GetPropList(PTypeInfo(Component->ClassInfo()), tkMethods, (Typinfo::PPropList)pList);
        for(int i = 0; i < count; ++i) {//Получаем описание конкретного метода
            pPropInfo = (TPropInfo *)pList->data[i];
            Event = pPropInfo->Name.operator AnsiString();
            TypeEvent = PTypeInfo(*pPropInfo->PropType)->Name.operator AnsiString();
            //TypeEvent = VarToStr(GetPropValue(Component, Event));
        }
    } __finally {
        delete [] pList;
    }
У pPropInfo есть поля GetProc и SetProc... Но что с ними делать (после чтения описания) я не знаю (в runtime-e они указывают куда-то далеко в :FF00xxx вне зависимости, есть ли установленный в программе обработчик события или нет)... Может копать в сторону RegisterPropertyEditor() или System::TMethod?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2015, 10:43
Помогаю со студенческими работами здесь

Генерация события при обработке другого события
Привет!!!! помогите пожалуйста. Как генерировать событие нажатия кнопки при обработки события нажатия на другую кнопку private:...

Программная генерация события
Добрый день! Возникла такая проблема. Использую пользовательскую компоненту, которая находится в сборке (Class Library), исходные коды...

Генерация нестандартного события
Задача: Необходимо выяснить, как можно сэмулировать нажатие клавиш Fn + ... на ноутбуке.Желательно выписать соответствующую функцию, хотя...

События активного и неактивного компонента
Доброго времени суток! Подскажите какие события возникают когда компонент(TextBox) активный и когда неактивный? К примеру я хочу сделать...

Программная генерация события btnShowClick
Как программно сгенерировать событие нажатие кнопки? На форме имеется кнопка. При нажатии на неё выполняется некоторый код. Из...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru