Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2014, 22:18   #1
Evil-Racer
Пользователь
 
Регистрация: 03.11.2009
Сообщений: 10
Восклицание MouseDown vs DblClick

Есть изображение (xImg) у него есть событие MouseDown, где происходит

Код:
procedure TMain.xImg_MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    TImage(Sender).BeginDrag(False);
end;
Так же у изображения есть ивент DblClick, где происходит неважно-какой код.

Суть проблемы, мне надо вызвать только даблклик. Я дважды щелкаю по изображению, запускается MouseDown, начинается драг, затем запускается DblClick, делается что надо. DblClick завершается, а вот курсор переходит в состояние, будто он до сих пор делает драг. И никак не убить его (насильственный EndDrag не помогает).

Вопрос, как в MouseDown отловить ивент даблклика так, чтоб не испортить нормальноработающее BeginDrag, и вслучае удачной ловли запустить вместо драга даблклик?
Evil-Racer вне форума Ответить с цитированием
Старый 08.06.2014, 22:44   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Думаю это не нормально (если не сказать дурдом) вешать одновременно обработчики на OnMouseDown и двойной клик. А копать скорее всего замером времени на первом Down, ожиданием в течение определенного времени второго Down и разрулировать в зависимости от ситуации. Время ожидания можно из SystemParametersInfo узнать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.06.2014, 19:24   #3
Evil-Racer
Пользователь
 
Регистрация: 03.11.2009
Сообщений: 10
По умолчанию

Без этой камасутры никак...
Нашел на инглишфоруме такое
Код:
type
 TFrmMain = class(TForm)
 ...
 private
 DoubleClicked: Boolean;
 end;

procedure TFrmMain.ControlClick(Sender: TObject);
 begin
 Application.ProcessMessages;
 if DoubleClicked then begin
 DoubleClicked := false;
 Exit;
 end;

 ...{your code}

end;

procedure TFrmMain.ControlDblClick(Sender: TObject);
 begin
 DoubleClicked := True;

 ...{your code}

end;
Адаптировал под себя - работает =)
Evil-Racer вне форума Ответить с цитированием
Старый 09.06.2014, 19:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Это гарантировано не всегда сработает. Зависит от скорости двойного клика, от настройки максимального времени между ними. Ожидайте проблем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TImage и DblClick coNsept Общие вопросы C/C++ 6 04.02.2012 17:40
TWebBrowser блокировка MouseDown Crystallon Общие вопросы Delphi 2 30.04.2011 02:25
ColorBox и DblClick Sanprof Общие вопросы Delphi 1 05.08.2010 18:13
CEdit Dblclick handler nusik Общие вопросы C/C++ 0 09.07.2009 11:02
DblClick Crivel Общие вопросы Delphi 1 01.03.2009 15:16