Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 1
Регистрация: 10.05.2018
Сообщений: 49

Обработка события OnMouseDown

18.12.2019, 14:56. Показов 1989. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Имеется, созданная динамически, TPanel. На ней несколько TLabel (тоже созданы динамически).
У панели обрабатываются события OnMouseDown и OnMouseUp. Проблема в том, что если "ткнуть" в TLabel,
то событие не долетит до панели. Оно останется на лейболе. Как обойти это? Я попробовал реализовать это, указав для TLabel тот же обработчик, что и для TPanel. Но проблема в том, что таких панелей много, а обработчик один и ему еще нужно понять от кого пришло это событие. Вообщем такой вариант не очень удобный и красивый. Чую можно это сделать гораздо проще. Подскажи, плз!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2019, 14:56
Ответы с готовыми решениями:

Некорректно работает обработчик события OnMouseDown
Здравствуйте! Хотелось бы узнать почему у меня не работает обработчик события OnMouseDown для DBGrid? Я что, както не так кликаю на дбгрид,...

Обработка события
Подскажите пожалуйста. Как правильно написать обработку события при нажатии кнопки. Нажимаем кнопку должна выходить справка о программе....

обработка события
:)Здравствуйте! Подскажите пожалуйста как можно описать обработчик события вне класса. Имеется класс, который выводит на форму некоторое...

6
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,392
18.12.2019, 21:08
Цитата Сообщение от VadimExp Посмотреть сообщение
Но проблема в том, что таких панелей много, а обработчик один и ему еще нужно понять от кого пришло это событие
Есть Sender->Name, где будет лежать имя контрола.

Другой вариант - у каждого контрола есть Tag, которому можно (хоть в дизайн-тайме, хоть при динамическом создании контрола) задать свой уникальный номер. А потом в обработчике сообщений - в зависимости от значения Sender->Tag делать разные действия.
0
Модератор
 Аватар для D1973
9922 / 6458 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
19.12.2019, 09:04
Цитата Сообщение от VadimExp Посмотреть сообщение
Имеется, созданная динамически, TPanel. На ней несколько TLabel (тоже созданы динамически).
Конкретно для такой ситуации можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//---------------------------------------------------------------------------
//Нажатие на кнопку для создания очередной панели...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   static int pt = 10;
   int lt = 10;
//создание панели
   TPanel *Pnl = new TPanel(this);
   Pnl->Parent = this;
   Pnl->Top = pt;
   Pnl->Width = 250;
   Pnl->Height = 80;
   pt += Pnl->Height + 5;
   Pnl->OnMouseDown = MyPanelMouseDown;
   Pnl->OnMouseUp = MyPanelMouseUp;
//создание 2-х меток на панели
   for(int i = 1; i < 3; i++)
     {
       TLabel *Lbl = new TLabel(Pnl);
       Lbl->Parent = Pnl;
       Lbl->Top = lt;
       Lbl->Left = 10;
       Lbl->Caption = "Label" + IntToStr(i);
       lt += Lbl->Height + 5;
       Lbl->OnMouseDown = Pnl->OnMouseDown;
       Lbl->OnMouseUp = Pnl->OnMouseUp;
     }
}
//---------------------------------------------------------------------------
//Функция получения указателя на конкретную панель по которой был произведен клик
TPanel *GetPanel(TObject *Sender)
{
   if(Sender->ClassNameIs("TLabel")) return dynamic_cast<TPanel *>(((TLabel *)Sender)->Parent);
   else return dynamic_cast<TPanel *>(Sender);
}
//---------------------------------------------------------------------------
//Эти методы описаны в секции private класса формы в заголовочном файле
//---------------------------------------------------------------------------
void __fastcall TForm1::MyPanelMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
   GetPanel(Sender)->Caption = "LMB is down";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyPanelMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
   GetPanel(Sender)->Caption = "LMB is up";
}
//---------------------------------------------------------------------------
0
2 / 2 / 1
Регистрация: 10.05.2018
Сообщений: 49
25.12.2019, 10:24  [ТС]
А зачем такие сложности? В таком случае достаточно сделать так:
C++
1
Label1->OnMouseDown = ((TPanel *)Label1->Parent)->OnMouseDown
В любом случае, спасибо.
В итоге, я решил вообще отказаться от Label и выводить надписи непосредственно на канву панели.
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
25.12.2019, 10:35
Цитата Сообщение от VadimExp Посмотреть сообщение
канву панели
Только у TPanel свойство Canvas имеет тип protected...
0
2 / 2 / 1
Регистрация: 10.05.2018
Сообщений: 49
25.12.2019, 10:44  [ТС]
И в чем проблема? Дотянуться до канвы легко.
А то, что изображение на ней не сохраняется? Так в моем случае это не важно, так как надписи переписываются постоянно.
0
Модератор
 Аватар для D1973
9922 / 6458 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
25.12.2019, 12:15
Цитата Сообщение от VadimExp Посмотреть сообщение
В таком случае достаточно сделать так:
А Вы пробовали? Именно с выводом текста в свойство Caption панели? И что получилось?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2019, 12:15
Помогаю со студенческими работами здесь

События и их обработка
Подскажите как можно реализовать обработку событий, чтобы можно было использовать примерно такой код: void test_handler(object*...

Обработчик события OnMouseDown
Здравствуйте, я столкнулся с такой проблемой. у меня в задании нужно создать 4 круга путём нажатия на форму. это я сделал с помощью...

Долгая Button (события OnMouseDown OnMouseUp)
Здравствуйте. У меня возникла проблема - никак не могу додуматься, как сделать, чтобы при клике на кнопке, сама кнопка начинала присваивать...

Свой класс - как определить для TPanel1 события OnMouseEnter, OnMouseLeave, OnMouseDown, OnMouseUp?
Такая проблема: я хочу создать свои кнопки для формы. Кнопки из компонента TPanel, с событиями OnMouseEnter, OnMouseLeave, OnMouseDown,...

Обработка события Click, вставка html после генерации и обработка этого кода
Подскажите пожалуйста как заставить работать эту часть кода 18 строка $(&quot;.image&quot;).click(function() { ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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 и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru