:: Visual Foxpro, Foxpro for DOS
Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
Таймером, проверяя MDOWN(), не хочется



Исправлено 1 раз(а). Последнее : Ydin, 05.12.22 22:02
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
_vit

Сообщений: 5138
Дата регистрации: 29.07.2002
Включи в дебаггере Event Tracking.
Посмотри что происходит.
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
Что там смотреть? Resize на движении мыши многократно и на нем Mdown() и в конце и в начале
Какой дебаггер тут...



Исправлено 1 раз(а). Последнее : Ydin, 05.12.22 22:52
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
Если никто не ответит быстро, через таймер сделаю.
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
akvvohinc

Сообщений: 4001
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Если никто не ответит быстро, через таймер сделаю.
Нормальный вариант - делал когда-то такое.
В ресайзе формы включал таймер (если он не был включён), который выключал сам себя при NOT MDOWN().

PS
А вообще странно, что при нажатии/отпускании мышки в тех областях формы, где действует ресайз, не отрабатывают события MouseDown и MouseUp формы.
Я даже подумал, что, возможно, в этой ситуации отрабатывают события MouseDown и MouseUp экрана (_SCREEN), и тогда можно было бы через BINDEVENT() решить задачу, но оказалось, что это не так - я не нашел объекта, который бы ловил эти события в этой ситуации.

А ведь в Help о функции MDOWN() написано, что она включена лишь для обратной совместимости, но получается, что MouseDown и MouseUp, которые вроде как пришли ей на смену работают не везде, где работает MDOWN().



Исправлено 1 раз(а). Последнее : akvvohinc, 06.12.22 03:20
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
akvvohinc
А ведь в Help о функции MDOWN() написано, что она включена лишь для обратной совместимости, но получается, что MouseDown и MouseUp, которые вроде как пришли ей на смену работают не везде, где работает MDOWN().

Да, MouseDown и MouseUp - события объекта, а MDOWN() фунция.
Мы же тянем мышкой границы формы и они решили, видимо, что границы - это не область формы.
Через таймер создаем событие проверкой функции MDOWN()
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Владимир Максимов

Сообщений: 14063
Откуда: Москва
Дата регистрации: 02.09.2000
Гм... Традиция раз в несколько лет переспрашивать?

19.05.09 - Resize формы
17.02.13 - Resize _Screen'а мышкой. Есть ли событие завершения процесса
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
19.05.09 - Resize формы

Да, это моя ветка - 19.05.09 15:17:37
Читаю и узнаю только свою аваторку. Спасибо, встрепенуло!

17.02.13 - Resize _Screen'а мышкой. Есть ли событие завершения процесса
Аналогично! Спасибо, Володя (Максимов). Рад был узнать, что это уже раньше узнавал 2 раза в жизни прямо тут.

74-й год мой -- начинаю стареть. Вам, может, пока не понять!

Короче, сейчас на таймере легко получилось. Задача решена.
И куда проще с таймером, чем городить
Igor Korolyov:
Угу, это должно работать - только оно ещё и на перемещения окна реагирует.
НО, что более важно - если диаграммы рисуются методами GDI на форме, то недостаточно ресайзы ловить -
тогда надо ещё и перерисовки ловить - WM_ERASEBKGND или ещё чего...
А это совсем другая частота срабатываний - и там всё одно нужен таймер для "прореживания" перерисовок...

Тогда я работал с FoxCharts и там была совсем другая задача. Уже не помню, но тогда, вроде, на Bindevent получилось.
Какая разница сейчас...



Исправлено 3 раз(а). Последнее : Ydin, 06.12.22 18:50
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
_vit

Сообщений: 5138
Дата регистрации: 29.07.2002
Так еще можно.
Не помню в какой версии появилась возможность биндить оконные сообщения.
В 8? 9?

#Define WM_ENTERSIZEMOVE 0x0231
#Define WM_EXITSIZEMOVE 0x0232
#Define WM_SIZING 0x0214
frmTest = Createobject('myForm')
frmTest.Show
Define Class myForm As Form
Hidden isSized
Procedure Init
Bindevent(This.HWnd, WM_ENTERSIZEMOVE, This, 'HandleEvents')
Bindevent(This.HWnd, WM_EXITSIZEMOVE, This, 'HandleEvents')
Bindevent(This.HWnd, WM_SIZING, This, 'HandleEvents')
Endproc
Function HandleEvents (HWnd, Msg, wParam, Lparam)
Do Case
Case Msg = WM_ENTERSIZEMOVE
This.isSized = .F.
Case Msg = WM_SIZING
This.isSized = .T.
Case Msg = WM_EXITSIZEMOVE
If This.isSized
Debugout "This Form sized"
Else
Debugout "This Form moved"
Endif
Endcase
Endfunc
Enddefine
Ratings: 0 negative/2 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
of63

Сообщений: 24629
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В наше время. Хорошая деталь в 9-ке
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
Через таймер не все так просто. Тут, похоже, серьезная и неожиданная проблема.
Побочный эффект. Плавающий, т.е. не сразу на него попадаешь.
Таймер отрабатывает, все нормально, но вдруг форма (размеры) начинает меняться от движения мышки.
Т.е. мы уже про ресайз забыли, т.к. отпустили мышь...
А мышь отжатая на движении рулит размерами.

У меня со светом и Интернетом какие-то перебои, я потом вернусь сюда.
И так пишу не с первого раза.
До встречи!
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
akvvohinc

Сообщений: 4001
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Через таймер не все так просто. Тут, похоже, серьезная и неожиданная проблема.
Побочный эффект. Плавающий, т.е. не сразу на него попадаешь.
Таймер отрабатывает, все нормально, но вдруг форма (размеры) начинает меняться от движения мышки.
Т.е. мы уже про ресайз забыли, т.к. отпустили мышь...
А мышь отжатая на движении рулит размерами.
Нужен код, чтобы подумать и попробовать.
Не помню, чтобы у меня такое случалось.

Но в принципе "отжатая мышь", меняющая или перемещающая окна, - такое помню, но это не обязательно случалось при работе в Фоксе.
Думаю, у меня это была не программная вещь, а "железная".

Оригинальный код мне искать не хочется, но, думаю, он не сильно отличался от чего-то подобного:
oForm = Createobject('myForm')
oForm.Show(1)
DEFINE CLASS myForm AS Form
ADD OBJECT timer1 AS mytimer
PROCEDURE resize
IF this.timer1.interval=0
this.timer1.interval = 500
WAIT WINDOW 'Нажали мышь.' NOWAIT
ENDIF
ENDPROC
ENDDEFINE
DEFINE CLASS mytimer AS timer
PROCEDURE timer
IF !MDOWN()
this.Interval=0
WAIT WINDOW 'Отпустили мышь.' NOWAIT
ENDIF
ENDPROC
ENDDEFINE

Я его немного потыкал - никаких "побочных эффектов" сходу обнаружить не удалось.
Надо подумать, может ли что случиться, если юзер успеет отпустить и снова нажать мышь внутри временного интервала таймера.
С кодом выше ничего плохого, как мне кажется, случиться не должно, но посмотри, что у тебя, увеличив интервал до нескольких секунд.

PS
А если под "побочным эффектом" понимать глюк Фокса, то в него я не верю.



Исправлено 5 раз(а). Последнее : akvvohinc, 10.12.22 05:22
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
#DEFINE WM_EXITSIZEMOVE 0x0232
BINDEVENT(THIS.HWND, WM_EXITSIZEMOVE, THIS, 'ExitSizeMove')
И все, а там в ExitSizeMove одна строчка у меня. Рулит!

Leonid forever!

Это именно то, что ожидал от этой темы.
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
akvvohinc
Нужен код, чтобы подумать и попробовать.
Не помню, чтобы у меня такое случалось.

Но в принципе "отжатая мышь", меняющая или перемещающая окна, - такое помню, но это не обязательно случалось при работе в Фоксе.
Думаю, у меня это была не программная вещь, а "железная".

Оригинальный код мне искать не хочется, но, думаю, он не сильно отличался от чего-то подобного:
WAIT WINDOW 'Отпустили мышь.' NOWAIT

Я его немного потыкал - никаких "побочных эффектов" сходу обнаружить не удалось.
Надо подумать, может ли что случиться, если юзер успеет отпустить и снова нажать мышь внутри временного интервала таймера.
С кодом выше ничего плохого, как мне кажется, случиться не должно, но посмотри, что у тебя, увеличив интервал до нескольких секунд.

PS
А если под "побочным эффектом" понимать глюк Фокса, то в него я не верю.

Не только увеличивал интервал, еще вставлял Inkey() для задержки.
Реже возникало или нет трудно сказать.
WAIT WINDOW может не мешает. У меня одна строчка там, но она вызывает мой метод частичной перерисовки формы.
Я это делал на ресайзе, но были мелькания, а их не любят. Сейчас перерисовка в конце на отпускании мышки.
Форма содержит динамически создаваемые текстбоксы, это значения комбобоксов. В зависимости от ширины и высоты формы меняется к-во показываемых строк и столбцов ячеек.
Эта форма у меня вызывается в моем классе комбобокса вместо стандарта Фокса.



Исправлено 1 раз(а). Последнее : Ydin, 10.12.22 11:27
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
leonid

Сообщений: 3180
Откуда: Рига
Дата регистрации: 03.02.2006
Ydin
Побочный эффект. Плавающий, т.е. не сразу на него попадаешь.
Таймер отрабатывает, все нормально, но вдруг форма (размеры) начинает меняться от движения мышки.
Т.е. мы уже про ресайз забыли, т.к. отпустили мышь...
А мышь отжатая на движении рулит размерами.

Думаю, это проблема вовсе не фокса. Я подобные эффекты неоднократно видел в Eclipse. Происходит это когда во время операции drag and drop Eclipse автоматически открывает какое-нибудь модальное окно (есть у него такая привычка), а потом автоматически закрывает его. Так вот, если отпустить кнопку мышки, когда открыто это окно, то сыбытие MOUSE UP будет передано этому окну, а когда оно закроется, drag and drop будет продолжать работать при отпущенной кнопке мышки, поскольку окно, в котором происходит drag and drop событие MOUSE UP не получало.
Ratings: 0 negative/1 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
leonid
Думаю, это проблема вовсе не фокса. Я подобные эффекты неоднократно видел в Eclipse. Происходит это когда во время операции drag and drop Eclipse автоматически открывает какое-нибудь модальное окно (есть у него такая привычка), а потом автоматически закрывает его. Так вот, если отпустить кнопку мышки, когда открыто это окно, то сoбытие MOUSE UP будет передано этому окну, а когда оно закроется, drag and drop будет продолжать работать при отпущенной кнопке мышки, поскольку окно, в котором происходит drag and drop событие MOUSE UP не получало.

Да, это не у Фокса, смотри глубже! Я помню времена, а они и сейчас на Форуме - "не обвиняй Фокс!".
И мне это нравится, я этому Фоксу многому обязан...

По-любому, BINDEVENT лучше тут, чем таймер!



Исправлено 1 раз(а). Последнее : Ydin, 10.12.22 20:37
Ratings: 0 negative/1 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
of63

Сообщений: 24629
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Плюснул. Хорошая деталь фокса. Причем "событие" (вот этот BINDevent) исполняется как подпрограмма в ОТДЕЛЬНОМ (кстати, надо посмотреть при случае стек вызовов в "прерывании" в фоксовой проге) командном счетчике команда фокса (видно, что фоксисты что-то думали про "прерывания"... молодцы)
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
of63
Плюснул. Хорошая деталь фокса. Причем "событие" (вот этот BINDevent) исполняется как подпрограмма в ОТДЕЛЬНОМ (кстати, надо посмотреть при случае стек вызовов в "прерывании" в фоксовой проге) командном счетчике команда фокса (видно, что фоксисты что-то думали про "прерывания"... молодцы)

Лучше, когда б минуснул.
"событие" (вот этот BINDevent) исполняется как подпрограмма в ОТДЕЛЬНОМ ...
фоксисты что-то думали про "прерывания ..."
Походу, 63-й ни хера не понял. Но, согласен - "фоксисты... молодцы"



Исправлено 7 раз(а). Последнее : Ydin, 11.12.22 20:28
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
Ydin
Автор

Сообщений: 7640
Откуда: Киев
Дата регистрации: 16.12.2005
В теме "Изменение высоты", но этот BINDEVENT и для ширины
Ratings: 0 negative/0 positive
Re: Как при изменении высоты формы мышкой поймать событие завершения этого процесса
_vit

Сообщений: 5138
Дата регистрации: 29.07.2002
Ydin
В теме "Изменение высоты", но этот BINDEVENT и для ширины

Сообщение WM_EXITSIZEMOVE посылается окну не только когда изменяют его размер но и при его перемещении.
Поэтому если надо отловить именно изменение размера окна то надо отлавливать и сообщения
WM_ENTERSIZEMOVE, WM_SIZING как у меня в примере.
Или использовать какую другую технику например определять изменение координат окна.

Ну и через параметр wParam сообщения WM_SIZING можно определить за какой угол/сторону ресайзится окно.
Ratings: 0 negative/1 positive


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

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

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