![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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