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

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

18.12.2019, 14:56. Показов 1980. Ответов 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
2629 / 1641 / 266
Регистрация: 19.02.2010
Сообщений: 4,356
18.12.2019, 21:08
Цитата Сообщение от VadimExp Посмотреть сообщение
Но проблема в том, что таких панелей много, а обработчик один и ему еще нужно понять от кого пришло это событие
Есть Sender->Name, где будет лежать имя контрола.

Другой вариант - у каждого контрола есть Tag, которому можно (хоть в дизайн-тайме, хоть при динамическом создании контрола) задать свой уникальный номер. А потом в обработчике сообщений - в зависимости от значения Sender->Tag делать разные действия.
0
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,371
Записей в блоге: 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
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,371
Записей в блоге: 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-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru