:: Visual Foxpro, Foxpro for DOS
Как при двойном щелчке избавиться от Click?
andrewk
Автор

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Если сделать двойной щелчок мышки, то происходят события:
MouseDown, MouseUp, Click,
MouseDown, MouseUp, DblClick.

В связи с этим «промежуточным» Click что-то не соображу, как повешать разные действия на одинарный и двойной щелчки? Или как в этом Click узнать, что будет двойной и не выполнять своё «одиночное» действие?
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Если бы это было так, то DblClick и Click нельзя было использовать одновременно (вешать на них обработчики в одном обьекте), а на самом деле это нормально работает...
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
andrewk
Если сделать двойной щелчок мышки, то происходят события:
MouseDown, MouseUp, Click,
MouseDown, MouseUp, DblClick.

В связи с этим «промежуточным» Click что-то не соображу, как повешать разные действия на одинарный и двойной щелчки? Или как в этом Click узнать, что будет двойной и не выполнять своё «одиночное» действие?

По идее, DblClick возникает после второго клика через системно установленоое время двойного клика.
Может попробовать запускать таймер и проверять это время?

Что-то типа такого:

oForm = CREATEOBJECT('Form1')
oForm.SHOW(1)
DEFINE CLASS Form1 AS form
AutoCenter = .T.
ADD OBJECT lbl1 AS label WITH ;
Height = 50, ;
Left = 150, ;
Top = 100, ;
Width = 100, ;
BackColor = RGB(255,255,255)
ADD OBJECT timer1 AS timer WITH Enabled = .F., Interval = 500
PROCEDURE lbl1.MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WITH thisform.timer1
.Enabled = IIF(.Enabled, .F., .T.)
ENDWITH
ENDPROC
PROCEDURE lbl1.DblClick
? "DblClick"
ENDPROC
PROCEDURE timer1.Timer
? "MouseButton"
this.Enabled = .F.
ENDPROC
ENDDEFINE


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Первое, что пришло в голову:
1. Click ничего не делает, кроме запуска некоего таймера, который должен выполнить процедуру через время, большее чем время DblClick.
2.1 Если до DblClick дело доходит, то он "гасит" этот таймер и делает, что должен.
2.2 Если до DblClick дело не доходит, то таймер срабатывает, выключается и выполняет то, что должен делать Click.

Можно сделать то же, но чуть иначе:
1. Добавить к методу Click параметр.
2. По умолчанию этот параметр будет равен .F., означающий, что тело метода Click выполнять не нужно.
3. А из таймера вызывать Click c непустым параметром, что будет означать "выполнить тело метода Click".



Исправлено 1 раз(а). Последнее : akvvohinc, 02.03.20 19:36
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Если бы это было так, то DblClick и Click нельзя было использовать одновременно (вешать на них обработчики в одном обьекте), а на самом деле это нормально работает...

Если последовательное срабатывание обоих методов при DblClick - это нормально, то ты прав - это работает.
Если же тебе нужно "либо - либо", то что-то придется придумать.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Да ничего делать не надо. И заморачиваться на тему, как оно там работает не надо. Знаете почему? Потому что оно работает и никто еще не пожаловался на то, что клик вместо даблклика сработал или они в кучу начучучили. Солнце всходит и заходит. Регулярно. Без ошибок. Не мешайте ему.


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
andrewk
Автор

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Chemberzhy
никто еще не пожаловался на то, что клик вместо даблклика сработал или они в кучу начучучили
of63
Если бы это было так
Чтобы убедиться, что это так, достаточно включить трейсинг в дебаггере.
Ну, или выполнить простейший пример:
Результат:
Какие тут могут быть сомнения?

of63
то DblClick и Click нельзя было использовать одновременно (вешать на них обработчики в одном обьекте)
Именно поэтому и спрашиваю, как обойти?



Исправлено 4 раз(а). Последнее : andrewk, 02.03.20 20:39
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
andrewk
Именно поэтому и спрашиваю, как обойти?

Йоперный теятр. [sm128]
Мой пример наверху невидимый что ли ни для кого совсем не был?


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
andrewk
Автор

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Crispy
Йоперный теятр.
Ну почему же, видимый))
Народ усомнился в существовании проблемы, я её пояснил.


Насчёт твоего примера. Я не понял, как это поможет в действии, выполняемом в Click, узнать, что щелчок не одинарный, а двойной? Ведь Click выполнится до второго MouseDown.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
andrewk
Автор

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
akvvohinc
Первое, что пришло в голову:
1. Click ничего не делает, кроме запуска некоего таймера, который
...
А, ну так вариант. Теоретически.
На самом деле я думал, есть какой-то общеизвестный костыль, который я не вижу. Чтоб универсально включить это в базовый класс. Но ради даблклика, который в конкретном объекте может и не нужен, пускать таймеры в каждом клике... из пушки по воробьям, проще от даблкликов вообще отказаться, наверное.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
andrewk
На самом деле я думал, есть какой-то общеизвестный костыль, который я не вижу. Чтоб универсально включить это в базовый класс.

Вот "универсально" и создавай (CreateObject) таймер-объект в своих базовых классах (в тех, что требуют различать клик и даблклик).
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Странно.
То же не поверил, накидал тест. И точно. так и есть, всегда сначала Click.
Задумался, почему же никогда не натыкался в реале.
Полагаю, слишком специфичные события.
DblClick как правило на гриде, что бы быстро открыть на редактирование строку, либо выбрать из справочника.
А Click... так сразу и в голову не приходит зачем он)))
Так что как вариант. Просто тщательно рассмотреть, так ли уж нужны, на одном объекте оба события (обработка конечно же)
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Аспид
Задумался, почему же никогда не натыкался в реале.
Полагаю, слишком специфичные события.

Конечно, интерфейс планируется не совсем стандартный.
Как предположение - требуется (хочется) обработка различных вариантов нажатий (в том числе с использованием клавиш-модификаторов) на изображении или лейбле.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Может подойдет что-то вроде этого:

* Object.Click
LOCAL llClick,i
FOR i = 1 TO 10 && Подобрать цикл
IF INKEY('M') > 0
llClick = .T.
EXIT
ENDIF
ENDFOR
IF llClick
? 'DblClick'
ELSE
? 'Click'
ENDIF
Ratings: 3 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Или может так:

* Object.Click
LOCAL lnSeconds,llClick
lnSeconds = SECONDS() + _DblClick
DO WHILE SECONDS() < lnSeconds
IF INKEY('M') > 0
llClick = .T.
EXIT
ENDIF
ENDDO
IF llClick
? 'DblClick'
ELSE
? 'Click'
ENDIF

ЗЫ. Наверное, все же надо вставить в цикл i = i + 1.
ЗЫ2. Столько все-таки понтов у асов форума из-за одного цикла.
А самые крутые спецы даже раскрасить посты сумели.



Исправлено 2 раз(а). Последнее : lulgu, 03.03.20 23:29
Ratings: 2 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
lulgu
А самые крутые спецы даже раскрасить посты сумели.

Не плачь, ещё научишься.
Я не крут и нынче не красил. Буду постоянен, скажу тебе просто:
ДЛБ
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Crispy
andrewk
Именно поэтому и спрашиваю, как обойти?

Йоперный теятр. [sm128]
Мой пример наверху невидимый что ли ни для кого совсем не был?


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Chemberzhy
Подправил ...

Вам осталось малость - дружно Grid-ы разукрасить таймерами и кодами, словно новогоднюю елку.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
lulgu
Или может так

Функция SECONDS() имеет некоторый максимум, который сумма (SECONDS() + _DBLCLICK) может иногда превышать.
И тогда этот цикл будет крутиться вечно, или придется что-то нажать, превратив Click в DblClick.

Кроме того, INKEY('m') сработает не только от мыши, а значит, быстрое нажатие мыши и клавиши сработает как DblClick.
Ratings: 0 negative/0 positive
Re: Как при двойном щелчке избавиться от Click?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Чем кончилось-то?

Забыл тогда спросить, а что за обьект, на котором требуется различать Клик и 2Клик? ...Как-то не было необходимости что-ли, что не замечал. У меня DblClick обычно "запаралелен" с RightClick, в смысле, что в DblClick выполняется умолчательная (первая) операция из списка, который вывешивается оператору по RightClick.

Конечно, таймером можно различить, просто писанины "много". Что за задача, что за видеоэффекта хочется добиться? Ведь на Click висит и умолчательная обработка, типа, в ТекстБокс - "встать на позицию символа" и пр.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика