:: Visual Foxpro, Foxpro for DOS
Как перехватить нажатие на "крестик" формы?
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Хочется, чтобы выходил диалог - "Вы не обработали такие-то данные! Выйти, проигнорировав изменения или остаться на форме?"

Хотел через BINDEVENT() событие Destroy к собственному методу прибиндить, но не взлетело.

P.S. Отдельную кнопку не предлагать - это будет изменение интерфейса, пусть привыкнут хоть 2-3 кнопки правильно нажимать, а то с ума сойдут.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
QueryUnload?




------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
sphinx
QueryUnload?

ага
Do Case
*=:•••• •••• •••• •••• •••• •••• •••• аварийное завершение - ничего не проверяем
Case PemStatus(_VFP, '_lEmergencyEnd', 5) and _VFP._lEmergencyEnd
*=:•••• •••• •••• •••• •••• •••• ••••
Case !this._CheckOfClosing()
NoDefault && не выходить из формы
EndCase
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Правильно хукать TerminateProcess))
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Мне сдается можно пока попроще написать, один черт _SuperCheckOfClosingThisForm() у меня пока нет.

IF MESSAGEBOX("Вы не обработали такие-то данные! Выйти, проигнорировав изменения или остаться на форме?", 4+32, "Выход")=6
thisform.Release()
ELSE
NODEFAULT
ENDIF


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
sphinx
Автор

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
spinz
Правильно хукать TerminateProcess))

А TerminateThread? ;)


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Хукать треды неправильно в общем случае.
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не надо release вызывать из QU. Лишнее и потенциально небезопасное - и так уже запущен процесс аналогичный release.

Не стоит и "безусловно" messagebox бросать. QU должен в определённых случаях срабатывать молча, быстро, и по возможности корректно прерывать "незаконченную" работу (откатывать изменения, или сохранять их в какое-то временное store, чтобы при следующем запуске начать с того места на котором прервались).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
sphinx

Присоединяясь к предыдущим ораторам хотелось бы только еще заметить, что при попытке обработать нажатие на стандартный крестик, будут у тебя проблемы. \m/ Не в смысле цыганского какого-то предсказания а просто из практики. В каких-то ситуациях с этим могут бывать косяки.
В результате я например предпочитаю в таких случаях, особенно в "промежуточных" формах, "пойти другим путем". Поскольку крестик на фоксовской форме совсем не так прост, как может показаться. Т.е. таки прячу у данной формы шапку и помещаю свою кнопку выхода, плюс вешая выход еще и на нажатие Esc, как бы привычная пользователю клавиша выхода, что обычно указываю всегда и на кнопке выхода: "выход - Esc".
Ну а про "сообщение" Игорь собственно выше уже совершенно точно заметил, что совершенно не нужно оно в таких случаях. Я обычно молча все сохраняю, пользователь сам обязан отвечать за все свои действия по вводу. Ввел сумму с потолка - кто виноват. Единственное, что обязан программист - максимально проверять корректность ввода данных в комплексе, чтобы в таблицы никогда не записывалась противоречивая или недостаточная для корректности каждой записи информация.
По поводу же, что без крестика "с ума сойдут" - так и хай с ними. Иначе от крестика тебе самому придется иногда сходить. Лучше уж пусть они.

Кстати по интерфейсу еще, давнишнее наблюдение, заметил (не на фоксе, но тем не менее), немцы например (почему-то именно они обычно) предпочитают делать главные окна программ жестко фиксированного размера. У других обычно можно мышкой за границы и углы растаскивать формы, которые без масштабирования при этом начинают смотреться уродливо. У немцев же - нет! \m/ И в чем-то они и правы. Пусть без масштаба, зато никаких уродств. Поначалу для кого-то бывает непривычна такая жесткость размера. Но привыкнув, становится в принципе ничего. [sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
У меня в самом базовом классе форм, есть метод CheckExit
Пустой.
В наследниках, можно что угодно написать.
В базовом классе для редактирования, есть свойство chg, которое показывает менялись ли данные на форме.
Дальше этот метод можно вызвать откуда хошь.
По мне так выход что по кнопке закрыть, что по крестику - одинаков)


------------------
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Аспид
У меня в самом базовом классе форм, есть метод CheckExit
Пустой.
В наследниках, можно что угодно написать.
В базовом классе для редактирования, есть свойство chg, которое показывает менялись ли данные на форме.
Дальше этот метод можно вызвать откуда хошь.
По мне так выход что по кнопке закрыть, что по крестику - одинаков)

+ 100500

+ перехват "крестика" у _Screen-a.

PS проблем с выходом пока не наблюдал


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
PaulWist
PS проблем с выходом пока не наблюдал

Да не столько с самим выходом, сколько с правильной обработкой при выходе.
В каких-то случаях точно были проблемы. Сейчас уже не помню точно, но что-то там есть, что не совсем так выполняется, как при обработке событий формы при нажатии на кнопку/Esc.

Короче дай мне свою программу с крестиком - и я ее на раз подвешу, может быть даже с вылетом (и несохранением естественно).
А мою с кнопкой - ты просто так уже не повесишь. ;)
Вот такой был расклад помнится.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Нет никаких проблем с выходом из формы по "крестику". Нормально писать надо, без извращений, и всё будет хорошо. Есть проблемы с САМИМ крестиком - при запуске цепочки модальных форм он может заблокироваться (лечение тривиально), есть сложности с закрытием ВСЕЙ программы по крестику (если внутри в это время понаоткрыто всяких разных форм, особенно таких "тупых" что безусловный messagebox при попытке закрытия вывешивают).
Дополнительная кнопка закрытия с cancel=.t. - для реакции на esc - нормально, хотя и далеко не для всех случаев (esc вообще-то отменяет и текущий ввод в поле. И крайне недружественно при попытке отменить случайную ошибочку в одном поле ввода закрывать ВСЮ форму) - для диалогов и некоторых особо простых форм (особенно если там нет как такового "ввода данных") - пойдёт.
Неизменные по размеру формы - конечно же лучше чем растягиваемые но БЕЗ корректного растягивания/масштабирования контролов внутри, но ХУЖЕ чем адекватная форма с продуманным ресайзом внутренних контролов (особенно если там списки/гриды, или большие editbox-ы имеются). Естественно не все формы в принципе имеет смысл растягивать/масштабировать. Тот же messagebox-подобный или inputbox-аналог с надписью да полем ввода для пары циферок - никакого разумного способа растягивать такого рода формы нет, а масштабироватние это отдельный вопрос (и не на уровне отдельных форм он должен решаться)...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Crispy
Короче дай мне свою программу с крестиком - и я ее на раз подвешу, может быть даже с вылетом (и несохранением естественно).
А мою с кнопкой - ты просто так уже не повесишь. ;)
Вот такой был расклад помнится.

Держи:

PUBLIC o
o = CREATEOBJECT('QeryUn')
o.show()
*
DEFINE CLASS QeryUn AS form
Caption = "Жми Esc или крестик на форме, на Screen."
Name = "QeryUn"
ADD OBJECT label1 AS label WITH ;
FontBold = .T., ;
Caption = "Жми Esc или крестик на форме или на Screen.", ;
Height = 25, ;
Left = 48, ;
Top = 12, ;
Width = 300, ;
Name = "Label1"
ADD OBJECT label2 AS label WITH ;
FontBold = .T., ;
Caption = "Да-закрываем, Нет-закрываем, Отмена-оставляем форму", ;
Height = 25, ;
Left = 24, ;
Top = 36, ;
Width = 348, ;
Name = "Label2"
PROCEDURE QueryUnload
LOCAL cH
m.cH = this.KeyPress(27, 0)
DO CASE
CASE !m.cH
NODEFAULT
ENDCASE
ENDPROC
PROCEDURE KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL cH
DO CASE
CASE nKeyCode = 27 and nShiftAltCtrl = 0
m.cH = messagebox('Сохранить сделанные изменения ',3 + 32 + 0,'Выбор')
DO CASE
CASE m.cH = 6
** Да-Сохраняем, если ошибки нет то this.Release()
this.Release()
CASE m.cH = 7
** Нет-Откатываем, если ошибки нет то this.Release()
this.Release()
CASE m.cH = 2
** Отмена-оставляем форму как есть
RETURN .f.
ENDCASE
ENDCASE
ENDPROC
ENDDEFINE


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
PaulWist
Crispy
Короче дай мне свою программу с крестиком - и я ее на раз подвешу, может быть даже с вылетом (и несохранением естественно).
А мою с кнопкой - ты просто так уже не повесишь. ;)
Вот такой был расклад помнится.

Держи:

PUBLIC o
o = CREATEOBJECT('QeryUn')
o.show()
*
DEFINE CLASS QeryUn AS form
Caption = "Жми Esc или крестик на форме, на Screen."
Name = "QeryUn"
ADD OBJECT label1 AS label WITH ;
FontBold = .T., ;
Caption = "Жми Esc или крестик на форме или на Screen.", ;
Height = 25, ;
Left = 48, ;
Top = 12, ;
Width = 300, ;
Name = "Label1"
ADD OBJECT label2 AS label WITH ;
FontBold = .T., ;
Caption = "Да-закрываем, Нет-закрываем, Отмена-оставляем форму", ;
Height = 25, ;
Left = 24, ;
Top = 36, ;
Width = 348, ;
Name = "Label2"
PROCEDURE QueryUnload
LOCAL cH
m.cH = this.KeyPress(27, 0)
DO CASE
CASE !m.cH
NODEFAULT
ENDCASE
ENDPROC
PROCEDURE KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL cH
DO CASE
CASE nKeyCode = 27 and nShiftAltCtrl = 0
m.cH = messagebox('Сохранить сделанные изменения ',3 + 32 + 0,'Выбор')
DO CASE
CASE m.cH = 6
** Да-Сохраняем, если ошибки нет то this.Release()
this.Release()
CASE m.cH = 7
** Нет-Откатываем, если ошибки нет то this.Release()
this.Release()
CASE m.cH = 2
** Отмена-оставляем форму как есть
RETURN .f.
ENDCASE
ENDCASE
ENDPROC
ENDDEFINE

Как-нибудь на досуге возможно гляну.
Хотя суть таки была совсем не в этом. Не в пустой форме. А в ряде отличий при обработке данных с разными способами закрытия. Ну что-то такое. Подробностей сейчас уже не помню. Помню только, что в итоге ряда экспериментов оставил не заблокированной лишь одну кнопку минимизации. Максимизацию заблокировал, чтобы не портила фигуру форму. А крестик - чтобы не закрывал через стандартный набор закрывающих методов Сразу под ним своя кнопка закрытия. Ну как-то так, подробности ж говорю, надо уже вспоминать-смотреть в конкретном проекте, что там было, анализируя всю цепочку при разных способах закрытия. Если будет время и желание, попробую.
Впрочем, как давно уже в принципе понял (хотя и порой забываю про это) - у всех свои конкретные ситуации. У кого-то скем-то сходные, у кого-то нет. И в конечном итоге видимо нет особого смысла всегда на чем-то однозначно настаивать. Опыт того, кто пашет на гигантском тракторе поля в 100 гектар, бесполезен для того, кто пашет мотоплугом огород в палисаднике у окна. И наоборот. Как бы ни был бесценен и уникален при этом опыт каждого.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Мериться крестиком с кнопкой - это уже новое слово в отрасли.
Надеюсь, кнопка победит
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
medstraxy для размышлений: крестик продолговатый, кнопка округлая... [sm128]
Ratings: 0 negative/0 positive
Re: Как перехватить нажатие на "крестик" формы?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
От души, тов.Симпле вдохнул в медстраха надежду
Ratings: 0 negative/0 positive


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

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

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