требуется узнать из-за чего форма закрыта — из-за нажатия пользователем
крестика в левом верхнем углу окна или программно. Подскажите, пожалуйста, как это
правильно выяснить?
Константин
Re: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Konstantin Polyakov, Вы писали:
KP>Добрый день,
KP>Находясь внутри блока
KP>void __fastcall TForm::FormClose(TObject *Sender, TCloseAction &Action) KP>{
KP>}
KP>требуется узнать из-за чего форма закрыта — из-за нажатия пользователем KP>крестика в левом верхнем углу окна или программно. Подскажите, пожалуйста, как это KP>правильно выяснить?
Видимо только если при программном закрытии выставлять какое-нибудь булевское поле в true, а после проверки его очищать...
Re: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
09.08.06 11:29
Оценка:
KP>требуется узнать из-за чего форма закрыта — из-за нажатия пользователем KP>крестика в левом верхнем углу окна или программно.
Что значит "программно" ?
Если юзер нажал на крестик, окно получает от ядра системы сообщение, не помню какое, можно найти в Windows SDK или исходниках TCustomForm
Никто не мешает мне написать программу, которая найдёт твоё окошко и отошлёт ей такое же точно сообщение через Post Message. Твоя программа никак не отличит это от реального нажатия мышкой. Так сделан Windows.
Поэтому определись, что такое "программно"
Пока предложу убрать все кнопки с заголовка окна (крестик убирается какжется как ??SystemMenu)
Потом рисуешь крестик сам (как сделать кнопку на панели — куча компонент от самых разных людей. Попробуй поискать на torry.ru или возьми универсальную библиотеку JediVCL). А нажатие на свою самостоятельно сделанную кнопку — отрабатывай как хочешь.
Re[2]: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Аноним, Вы писали:
KP>>требуется узнать из-за чего форма закрыта — из-за нажатия пользователем KP>>крестика в левом верхнем углу окна или программно.
А>Что значит "программно" ?
А>Если юзер нажал на крестик, окно получает от ядра системы сообщение, не помню какое, можно найти в Windows SDK или исходниках TCustomForm
А>Никто не мешает мне написать программу, которая найдёт твоё окошко и отошлёт ей такое же точно сообщение через Post Message. Твоя программа никак не отличит это от реального нажатия мышкой. Так сделан Windows.
А>Поэтому определись, что такое "программно"
А>Пока предложу убрать все кнопки с заголовка окна (крестик убирается какжется как ??SystemMenu) А>Потом рисуешь крестик сам (как сделать кнопку на панели — куча компонент от самых разных людей. Попробуй поискать на torry.ru или возьми универсальную библиотеку JediVCL). А нажатие на свою самостоятельно сделанную кнопку — отрабатывай как хочешь.
А как с помощью универсальной библиотеки JediVCL обработать Alt+F4?
Re[3]: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
10.08.06 14:23
Оценка:
S>А как с помощью универсальной библиотеки JediVCL обработать Alt+F4?
А фиг его знает, сначала узнай в соотв. форуме можно или это вообще, а потом надо уже думать как это привязать к VCL.
S>А как с помощью универсальной библиотеки JediVCL обработать Alt+F4?
>А фиг его знает, сначала узнай в соотв. форуме можно или это вообще, а потом надо уже думать как это привязать к VCL.
Понятно, что непонятно.. Ждём оригинатора...
Posted via RSDN NNTP Server 2.0
Re[5]: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Аноним, Вы писали:
А>Пока предложу убрать все кнопки с заголовка окна (крестик убирается какжется как ??SystemMenu) А>Потом рисуешь крестик сам (как сделать кнопку на панели — куча компонент от самых разных людей. Попробуй поискать на torry.ru или возьми универсальную библиотеку JediVCL). А нажатие на свою самостоятельно сделанную кнопку — отрабатывай как хочешь.
Из пушки по воробьям. Вариант, который предложил Skyle гораздо проще и "правильней".
Re[3]: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
11.08.06 07:31
Оценка:
_>Из пушки по воробьям. Вариант, который предложил Skyle гораздо проще и "правильней".
...если у тебя только один-два программных способа.
А черех полгода ты все забудешь (или другой программер придет), сделает третий способ — и будет сильно удивляться.
Т.е. как раз это неправильно — но гораздо проще. Eсли вопрос "быстро сделать и навсегда забыть" — то так проще.
Re[4]: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Аноним, Вы писали:
А>Т.е. как раз это неправильно — но гораздо проще.
А ломать стандарнтый итерфейс, тянуть за собой JEDI, ради такой мелочи правильно?
Re[4]: узнать не пользователем ли вызвано закрытие формы
_>Из пушки по воробьям. Вариант, который предложил Skyle гораздо проще и "правильней".
>..если у тебя только один-два программных способа. >А черех полгода ты все забудешь (или другой программер придет), сделает третий способ — и будет сильно удивляться.
>Т.е. как раз это неправильно — но гораздо проще. Eсли вопрос "быстро сделать и навсегда забыть" — то так проще.
Это ошибка проектирования. А выпячивание ошибки использованием всяческих джедаев мне видится неправильным.
Posted via RSDN NNTP Server 2.0
Re[2]: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Аноним, Вы писали:
А>Что значит "программно" ?
А>Если юзер нажал на крестик, окно получает от ядра системы сообщение, не помню какое, можно найти в Windows SDK или исходниках TCustomForm
А>Никто не мешает мне написать программу, которая найдёт твоё окошко и отошлёт ей такое же точно сообщение через Post Message. Твоя программа никак не отличит это от реального нажатия мышкой. Так сделан Windows.
Может быть, я не совсем корректно понял изначальный вопрос, но все же...
Мне кажется, что человек имел ввиду, что-то типа закрытия через "Снять задачу" диспетчера задач (или аналогичное). Ты прав насчет того, что приложение никак не отличит сообщение WM_CLOSE, посланное системой от крестика на главной формы, от того, которое пошлет другое "самописное" приложение этому окну с помощью Post/Send Message. Но если доступен крестик на форме, какой смысл писать другое (сложное) приложение (поиск окна, получение хэндла и другой геморрой)? Имхо бред. Корректная обработка крестика — и приложению будет до лампочки, кто ему прислал сообщение о закрытии (пользователь или внешнее приложение)
А вот насчет "Снять задачу" (и аналогичных TerminateApplication'ов) идея следующая: эта кнопка тоже посылает сообщение WM_CLOSE закрываемому приложению, но его все-таки можно отличить от других, посылаемых в нормальном режиме. Дело в том, что в этом случае оно посылается непосредственно окну, и если на обработчике оконных сообшений главного окна висит хук, тогда этот хук не срабатывает (сообщение посылается минуя его) и по этому факту можно выделить факт некорректного закрытия и выполнить какой-нибудь необходимый код. Сам недавно именно так "обезвредил" для своего приложения эту кнопку.
Re[5]: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
11.08.06 09:19
Оценка:
_>А ломать стандарнтый итерфейс,
Абсолютно не правильно, поэтому не нужно вообще отличать как закрыто окно — "программно" или юзером. В обоих случаях его надо закрывaть.
_>тянуть за собой JEDI,
Тяни ты чатсь, которую надо
Re[5]: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
11.08.06 09:20
Оценка:
S>Это ошибка проектирования. А выпячивание ошибки использованием всяческих джедаев мне видится неправильным.
Ошибка проектирования — это сама необходимость отличать как закрывается окно, программой или юзером.
Все что дальше — выпячивание этой ошибки так или иначе.
Re[3]: узнать не пользователем ли вызвано закрытие формы
От:
Аноним
Дата:
11.08.06 09:23
Оценка:
B_F>А вот насчет "Снять задачу" (и аналогичных TerminateApplication'ов) идея следующая: эта кнопка тоже посылает сообщение WM_CLOSE закрываемому приложению,
S>Это ошибка проектирования. А выпячивание ошибки использованием всяческих джедаев мне видится неправильным.
>Ошибка проектирования — это сама необходимость отличать как закрывается окно, программой или юзером. >Все что дальше — выпячивание этой ошибки так или иначе.
Хм... Ну я в точности так и сказал....
Posted via RSDN NNTP Server 2.0
Re[4]: узнать не пользователем ли вызвано закрытие формы
The WM_QUIT message indicates a request to terminate an application and is generated when the application calls the PostQuitMessage function. It causes the GetMessage function to return zero.
Кнопка "Снять задачу" НЕ посылает WM_QUIT приложению. WM_QUIT приложение посылает само себе для того, чтобы завершить цикл обработки сообщений (обычно при обработке WM_DESTROY, которое, как правило, обрабатывается самым последним) и заставляет GetMessage вернуть 0. А "Снять задачу" посылает приложению именно WM_CLOSE.
Re[6]: узнать не пользователем ли вызвано закрытие формы
Здравствуйте, Brutal_Force, Вы писали:
B_F>Здравствуйте, Аноним, Вы писали:
B_F>>>А вот насчет "Снять задачу" (и аналогичных TerminateApplication'ов) идея следующая: эта кнопка тоже посылает сообщение WM_CLOSE закрываемому приложению,
А>>Разве WM_CLose ?
[url ]
B_F>Цитирую по приведенной ссылке:
B_F>The WM_QUIT message indicates a request to terminate an application and is generated when the application calls the PostQuitMessage function. It causes the GetMessage function to return zero.
B_F>Кнопка "Снять задачу" НЕ посылает WM_QUIT приложению. WM_QUIT приложение посылает само себе для того, чтобы завершить цикл обработки сообщений (обычно при обработке WM_DESTROY, которое, как правило, обрабатывается самым последним) и заставляет GetMessage вернуть 0. А "Снять задачу" посылает приложению именно WM_CLOSE.
Согласен на все 100. Тем более что WM_QUIT можна послать только через PostQuitMessage, кторая не имеет параметров указывающих на принадлежность к потоку. А это значит что это сообщение пожна послать только и только с потока, который крутит Message Loop.