Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

OnClick() VS OnDblClick()   Найти похожие ветки 

 
DevilDevil ©   (2006-10-03 11:01) [0]

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


 
MBo ©   (2006-10-03 13:02) [1]

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


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

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

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


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


> DevilDevil

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


 
DevilDevil ©   (2006-10-04 10:11) [4]

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

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

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

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


 
clickmaker ©   (2006-10-04 10:18) [5]

GetQueueStatus


 
DevilDevil ©   (2006-10-04 10:32) [6]

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

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


 
clickmaker ©   (2006-10-04 10:46) [7]

а это что? - QS_MOUSEBUTTON


 
DevilDevil ©   (2006-10-04 11:07) [8]

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

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


 
clickmaker ©   (2006-10-04 11:22) [9]

попробуй так

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;


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


> Задержку надо реализовывать? Если да, то можно воспользоваться
> 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;


 
DevilDevil ©   (2006-10-04 12:19) [11]

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

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;


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
15-1159418753
Climber
2006-09-28 08:45
2006.10.22
sql-запросы


2-1160376880
Roman_ln
2006-10-09 10:54
2006.10.22
в проекте формы создал новую процедуру...


3-1156506680
иван8511
2006-08-25 15:51
2006.10.22
Перехватить ошибку Key violation


2-1160028164
dera
2006-10-05 10:02
2006.10.22
Как на форме разместить web-страницу?


2-1159783773
pathfinder
2006-10-02 14:09
2006.10.22
IndyFTP(10) + proxy = Socket Error # 10038