Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Приручение мышей


Автор: STFN 1.8.2007, 20:53
Здрасте, обитатели форума!
Пишу я тут оболочку одну для своей софт-коллекции. Для перечисления папок использую стандартный ListBox. Ни как не могу додуматься, как научить прогу отличать одинарное нажатие на листбокс от двойного. Т.е, когда пытаешься щелкнуть по листу дважды тут же срабатывает процедура, работающая с одинарным нажатием. Надеюсь ясно изложил smile   Подскажите кто чем может smile

Автор: Yanis 1.8.2007, 20:57
Вот что советует DRKB:
Цитата
Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick.
      
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:
Код
procedure TForm1.ListBox1Click(Sender: TObject);
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
   if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
     then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;

Автор: Ak47black 1.8.2007, 21:28
STFN, а ты через WndProc попробуй тоесть через главную процедуру окна - там точно все нормально словить можно.
Неуверен ,но там вроде ошибка есть в коде от борладна.

Автор: Yanis 1.8.2007, 21:42
Я думаю, что речь об ошибке не идёт.
Цитата(MSDN)
Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP.

Автор: STFN 2.8.2007, 07:11
Цитата(Yanis @ 1.8.2007,  20:57)
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:
Код
procedure TForm1.ListBox1Click(Sender: TObject);
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
   if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
     then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;
[/QUOTE]
Это не работает (не в Delphi 7 по крайней мере). Придется извращаться (я думал можно как-то просто сделать).

Автор: STFN 2.8.2007, 08:43
Извиняюсь, соврал. Метод работает (хотя и модернизированный), но возникает задержка (время ожидания двойного щелчка). А еще меня удивляет сеть интернет.... везде один и тот же пример и одна и та же ошибка в коде. Хоть бы кто-нибудь проверил smile  Не существует параметра WM_NOREMOVE, существует PM_NOREMOVE.


Короче я решил проблема так: создаем обработку OnMouseDown и учим ее делать все что нужно при щелчке. Дальше кидаем на форму ApplicationEvents и в событии OnMessage проверяем, пришло для нашего списка сообщение:

Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.hwnd = ListBox1.Handle then { список? }
    if msg.message = WM_LBUTTONDBLCLK then  { двойной щедчек? }
    begin
        { делаем че-то по двойному щелчку }
    end;
end;




Автор: Yanis 2.8.2007, 09:29
Цитата(STFN @  2.8.2007,  09:43 Найти цитируемый пост)
Не существует параметра WM_NOREMOVE, существует PM_NOREMOVE.

smile

Автор: Caduser 16.4.2009, 13:54
Цитата(STFN @ 2.8.2007,  08:43)
Короче я решил проблема так: создаем обработку OnMouseDown и учим ее делать все что нужно при щелчке. Дальше кидаем на форму ApplicationEvents и в событии OnMessage проверяем, пришло для нашего списка сообщение:

Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.hwnd = ListBox1.Handle then { список? }
    if msg.message = WM_LBUTTONDBLCLK then  { двойной щедчек? }
    begin
        { делаем че-то по двойному щелчку }
    end;
end;

Не смог решить проблему таким способом - OnMouseDown упорно срабатывает при двойном клике. Может есть более изящное решение проблемы?

Автор: LITEOMILL 24.1.2023, 03:00
Модератор: Сообщение скрыто.

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