Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приручение мышей, Как отловить двойное нажатие и одинарное 
:(
    Опции темы
STFN
Дата 1.8.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.8.2006
Где: Екатеринбург

Репутация: нет
Всего: 1



Здрасте, обитатели форума!
Пишу я тут оболочку одну для своей софт-коллекции. Для перечисления папок использую стандартный ListBox. Ни как не могу додуматься, как научить прогу отличать одинарное нажатие на листбокс от двойного. Т.е, когда пытаешься щелкнуть по листу дважды тут же срабатывает процедура, работающая с одинарным нажатием. Надеюсь ясно изложил smile   Подскажите кто чем может smile
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 1.8.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Вот что советует DRKB:
Цитата
Как разделить обработку OnClick и OnDblClick? Ведь OnClick будет вызываться всегда, и перед DblClick.
      
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:
Код
procedure TForm1.ListBox1Click(Sender: TObject);
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
   if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
     then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ak47black
Дата 1.8.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



STFN, а ты через WndProc попробуй тоесть через главную процедуру окна - там точно все нормально словить можно.
Неуверен ,но там вроде ошибка есть в коде от борладна.

Это сообщение отредактировал(а) Ak47black - 1.8.2007, 21:29
PM MAIL   Вверх
Yanis
Дата 1.8.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Я думаю, что речь об ошибке не идёт.
Цитата(MSDN)
Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP.



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
STFN
Дата 2.8.2007, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.8.2006
Где: Екатеринбург

Репутация: нет
Всего: 1



Цитата(Yanis @ 1.8.2007,  20:57)
Именно так и происходит в Windows - посылаются оба сообщения. Для того чтобы обработать только какое-то одно событие необходимо чуть "задержать" выполнение OnClick. Сделать это можно следующим способом:
Код
procedure TForm1.ListBox1Click(Sender: TObject);
var
Msg: TMsg;
TargetTime: Longint;
begin
{ get the maximum time to wait for a double-click message }
TargetTime := GetTickCount + GetDoubleClickTime;
{ cycle until DblClick received or wait time run out }
while GetTickCount < TargetTime do
   if PeekMessage(Msg, ListBox1.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, WM_NOREMOVE)
     then Exit; { Double click }
MessageDlg('Single clicked', mtInformation, [mbOK], 0);
end;
[/QUOTE]
Это не работает (не в Delphi 7 по крайней мере). Придется извращаться (я думал можно как-то просто сделать).
PM MAIL ICQ Jabber   Вверх
STFN
Дата 2.8.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.8.2006
Где: Екатеринбург

Репутация: нет
Всего: 1



Извиняюсь, соврал. Метод работает (хотя и модернизированный), но возникает задержка (время ожидания двойного щелчка). А еще меня удивляет сеть интернет.... везде один и тот же пример и одна и та же ошибка в коде. Хоть бы кто-нибудь проверил smile  Не существует параметра WM_NOREMOVE, существует PM_NOREMOVE.


Короче я решил проблема так: создаем обработку OnMouseDown и учим ее делать все что нужно при щелчке. Дальше кидаем на форму ApplicationEvents и в событии OnMessage проверяем, пришло для нашего списка сообщение:

Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.hwnd = ListBox1.Handle then { список? }
    if msg.message = WM_LBUTTONDBLCLK then  { двойной щедчек? }
    begin
        { делаем че-то по двойному щелчку }
    end;
end;





Это сообщение отредактировал(а) STFN - 2.8.2007, 08:45
PM MAIL ICQ Jabber   Вверх
Yanis
Дата 2.8.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(STFN @  2.8.2007,  09:43 Найти цитируемый пост)
Не существует параметра WM_NOREMOVE, существует PM_NOREMOVE.

smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Caduser
Дата 16.4.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 2.10.2006
Где: г. Хабаровск

Репутация: 1
Всего: 1



Цитата(STFN @ 2.8.2007,  08:43)
Короче я решил проблема так: создаем обработку OnMouseDown и учим ее делать все что нужно при щелчке. Дальше кидаем на форму ApplicationEvents и в событии OnMessage проверяем, пришло для нашего списка сообщение:

Код

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.hwnd = ListBox1.Handle then { список? }
    if msg.message = WM_LBUTTONDBLCLK then  { двойной щедчек? }
    begin
        { делаем че-то по двойному щелчку }
    end;
end;

Не смог решить проблему таким способом - OnMouseDown упорно срабатывает при двойном клике. Может есть более изящное решение проблемы?
PM MAIL ICQ   Вверх
LITEOMILL
Дата 24.1.2023, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.1.2023

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1432 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.