Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Delphi: Общие вопросы > Клик на Splitter |
Автор: OlegG 03.02.04, 05:01 |
Привет всем! Скажите пожалуйста, как ЛУЧШЕ всего отловить и обработать клик на Splitter ? |
Автор: x77 03.02.04, 06:30 |
стандартными средствами именно клик отловить нельзя, можно отловить событие OnMoved, происходящее в зависимости от свойства ResizeStyle. |
Автор: Zoobastik 03.02.04, 06:58 |
Цитата OlegG,3.02.04, 08:01 Привет всем! Скажите пожалуйста, как ЛУЧШЕ всего отловить и обработать клик на Splitter ? Для сплиттера пиши ловушку на WM_LBUTTONDOWN - как писать ловушки - можно посмотреть в FAQ для других типов ловушек. |
Автор: ZEE 03.02.04, 07:30 |
можно создать свой сплиттер и обявить у него эвент OnClick, т.к. TSplitter наследник TControl, правда через TGraphicControl - вобщем можна попробовать... Добавлено в : если не получится со стандартным TSplitter - то можно по другому - я делал свой сплиттер, он работает как обычный + на нем можно размещать др. контролы (как панель) и только что я объявил у него OnClick - работает ... |
Автор: OlegG 03.02.04, 07:53 |
Цитата Zoobastik,3.02.04, 06:58 Для сплиттера пиши ловушку на WM_LBUTTONDOWN - как писать ловушки - можно посмотреть в FAQ для других типов ловушек. Да это понятно, только не WM_LBUTTONDOWN а WM_LBUTTONCLICK. Я же спрашиваю как лучше... |
Автор: Zoobastik 03.02.04, 08:05 |
Цитата OlegG,3.02.04, 10:53 только не WM_LBUTTONDOWN а WM_LBUTTONCLICK Смысл - написать не свое сообщение WM_LBUTTONCLICK, а использовать уже имеющееся в Windows (и это WM_LBUTTONDOWN, его и надо ловить) Как лучше? - а как можно хуже? - по-моему все однозначно. |
Автор: OlegG 03.02.04, 08:13 |
Цитата Zoobastik,3.02.04, 08:05 Смысл - написать не свое сообщение WM_LBUTTONCLICK, а использовать уже имеющееся в Windows (и это WM_LBUTTONDOWN, его и надо ловить) WM_LBUTTONCLICK - это стандартное сообщение Windows (уже имеющееся) Цитата Zoobastik,3.02.04, 08:05 Как лучше? - а как можно хуже? - по-моему все однозначно. Существует несколько путей отловить сообщение - подправить/написать свой компонент, через объект Application... |
Автор: Zoobastik 03.02.04, 08:23 |
Цитата OlegG,3.02.04, 11:13 Цитата WM_LBUTTONCLICK - это стандартное сообщение Windows Как мне кажется ты путаешь сообщения Windows и сообщения Delphi (посмотрел справочник по WinAPI на русском - там именно то, что я написал - к сожалению он не полный, а SDK под рукой нет, так что на 100% не уверен). Написать можно как procedure Splitter1.Click(..); message WM_LBUTTONDOWN; Не уверен, что все правильно - на VCL почти не прогил (как и на API ) |
Автор: OlegG 03.02.04, 09:10 |
Цитата To Zoobastik When you move your mouse and click a button, a huge number of messages are generated, including WM_MOUSEMOVE for each movement of the mouse, WM_LBUTTONDOWN when the button goes down, WM_LBUTTONCLICK when the button is released Взято из "Using Visual C++ 6" |
Автор: Zoobastik 03.02.04, 09:49 |
Цитата OlegG,3.02.04, 12:10 Взято из "Using Visual C++ 6" Назвать можно как угодно - имхо WM_LBUTTOCLICK - это то же, что и WM_LBUTTONUP (или как там) Вообще мож я и не прав. Никогда не слеплял VCL и API (как только слегка разобрался в API, так сразу на VCL полностью забил) |
Автор: OlegG 03.02.04, 09:53 |
Дак всё-таки, как лучше всего отловить и обработать клик на Splitter ? |
Автор: Song 03.02.04, 11:10 |
Хм.. у него даже хэндла нет А ведь onMoved вызывается при нажатой кнопке мыши? |
Автор: OlegG 03.02.04, 11:35 |
Да, по-другому его сдвинуть нельзя... |
Автор: Song 03.02.04, 11:53 |
а без движения не вызывается? |
Автор: OlegG 03.02.04, 13:26 |
неа |
Автор: Song 03.02.04, 13:34 |
Тогда копай его исходники, смотри как там сделано onMoved |
Автор: OlegG 03.02.04, 13:43 |
Да, придётся... |
Автор: ZEE 03.02.04, 14:12 |
Цитата +Song, 3.02.04, 16:34 Тогда копай его исходники Цитата OlegG, 3.02.04, 16:43 Да, придётся а посмотреть Пост #4 - не судьба? (особенно два последних слова в нем) |
Автор: OlegG 03.02.04, 14:22 |
Я просто думал, что получится обойтись "малой кровью", без редактирования или создания производных классов... Впринципе у меня так сделано, но через Application.OnMessage... Не нравить мне этот способ... Под словом "так" я имею ввиду "без редактирования или создания производных классов". |
Автор: Fr0sT 01.08.17, 15:27 |
Натыкался на эту тему в поисках, отвечу для тех, кто возможно придет. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> type TSplitterEx = class(ExtCtrls.TSplitter) public procedure Click; override; end; TSplitter = class(TSplitterEx); // magic! TForm1 = class(TForm) ... end; ... procedure TSplitterEx.Click; begin ... end; Можно запоминать координаты, перекрывая таким же образом MouseUp. |