Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.064 c
15-1159441329
Иксик
2006-09-28 15:02
2006.10.22
Откуда берутся дети


9-1137705694
ZilonAtakuit
2006-01-20 00:21
2006.10.22
Прозрачность, текстура


2-1160053586
Чародей
2006-10-05 17:06
2006.10.22
Цвет Node


2-1160132776
andrey44
2006-10-06 15:06
2006.10.22
Flat Memory as Dynamic array


2-1160030756
TrainerOfDolphins
2006-10-05 10:45
2006.10.22
Значение по умолчанию на стороне клиента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский