Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)