Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OnClick() VS OnDblClick()


DevilDevil ©   (2006-10-03 11:01:00) 

При двойном щелчке, сначала происходит событие OnClick(), а потом   OnDblClick(). Необходимо реагировать на оба события... но без вызова OnClick()при двойном клике


DevilDevil   (2006-10-04 12:48:00) [1]

В общем переделал всё под свой компонент, всё работает как надо. han_malign, спасибо за идею!


DevilDevil   (2006-10-04 12:19:00) [2]

Как вам такой вариант:

private
  procedure WMTimer(var Message: TWMTimer); message WM_TIMER;

var
 Form1: TForm1;
 ONE_CLK : boolean;

const TIMER_ID = 17;

procedure TForm1.WMTimer(var Message: TWMTimer);
begin
 if Message.TimerID = TIMER_ID then
 begin
    ONE_CLK := true;
    Memo1.Lines.Add('OneClick');
    KillTimer(Handle, TIMER_ID);
 end;
end;

procedure TForm1.Memo1Click(Sender: TObject);
begin
 ONE_CLK := false;
 SetTimer(Handle, TIMER_ID, 120, nil); // !!! 120 - время Double_Click-a
end;

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
 if not ONE_CLK then
 begin
   Memo1.Lines.Add('DblClick');
   KillTimer(Handle, TIMER_ID);
 end;
end;


В этом случае всё путём работает и одиночный клик не застаивает.


han_malign   (2006-10-04 11:38:00) [3]


> Задержку надо реализовывать? Если да, то можно воспользоваться
> Sleep и какую задержку делать?

- ну-ну, у меня например GetDoubleClickTime - 500 мс. Что с таймером, что с задержкой - латентность меньше не будет... Логичнее пересмотреть интерфейс.

а с таймером прозрачнее:
.................................
 private
   procedure WMTimer(var Message: TWMTimer); message WM_TIMER;
.................................
procedure TForm1.Memo1Click(Sender: TObject);
begin
  Memo1.Lines.Add('Click');
  SetTimer(Handle, 17, GetDoubleClickTime, nil);
end;

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
  Memo1.Lines.Add('DblClick');
  KillTimer(Handle, 17);
end;

procedure TForm1.WMTimer(var Message: TWMTimer);
begin
  case(Message.TimerID)of
  17: begin
     Memo1.Lines.Add('Click Timer');
     //DoSingleClick;
     KillTimer(Handle, 17);
  end;
  end;{case(Message.TimerID)}
end;


clickmaker   (2006-10-04 11:22:00) [4]

попробуй так

OnClick()
var
  Msg: TMsg;
begin
  if Hi(GetQueueStatus(QS_MOUSEBUTTON)) <> 0 then
  begin
    if PeekMessage(Msg, Handle, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE)
    then
       // Possible double-click
  end;
end;


DevilDevil   (2006-10-04 11:07:00) [5]

> clickmaker ©   (04.10.06 10:46) [7]

Приведи, пожалуйста, пример. Задержку надо реализовывать? Если да, то можно воспользоваться Sleep и какую задержку делать? Как интерпретировать полученное значение?


clickmaker   (2006-10-04 10:46:00) [6]

а это что? - QS_MOUSEBUTTON


DevilDevil   (2006-10-04 10:32:00) [7]

> clickmaker ©   (04.10.06 10:18) [5]

Ничего о кликах я там не прочитал...


clickmaker   (2006-10-04 10:18:00) [8]

GetQueueStatus


DevilDevil   (2006-10-04 10:11:00) [9]

Идея у меня следующая: по событию OnClick()сделать задержку, скажем в 20 милисекунд, потом проверить следующее сообщение в очереди сообщений. Таким образом я узнаю, должен ли произойти двойной клик...

Вопрос: как проверить следующее сообщение в очереди сообщений?

Неужели что то типа:

ifGetMessage() then
begin
  if Message <> DOUBLE_CLICK then  
  begin
      // то, что должно быть по OnClick
  end;
  TranslateMessage()
end;


Elen   (2006-10-03 13:30:00) [10]


> DevilDevil

А не лучше разделить действия не на click...dblclick a на нажатие правой и левой клавиши мыши?


Barloggg   (2006-10-03 13:22:00) [11]

и если OnDblClick успел сработать раньше таймера, то отменяй OnClick.

но это будет означать тормоза при одиночных кликах. на доли секунды, но все же...


MBo   (2006-10-03 13:02:00) [12]

В OnClick таймер одноразового срабатывания запускай с интервалом, скажем, удвоенным GetDoubleClickTime


Наверх

Титульная страница Поиск, карта сайта Написать письмо