Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c