Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Внизотловить нажатие на кнопку закрытия формы Найти похожие ветки
← →
avsam (2005-02-14 19:02) [0]Как отловить нажатие на кнопку закрытия формы?
Отловить нужно именно нажатие, а не закрытие, так как форма может быть закрыта и другими способами.
← →
Плохиш © (2005-02-14 19:08) [1]OnCloseQuery
← →
begin...end © (2005-02-14 19:18) [2]> Плохиш © (14.02.05 19:08) [1]
Будут отлавливаться не только нажатия на крестик.
← →
ssk © (2005-02-14 19:23) [3]может так?
type
TForm1 = class(TForm)
.....
protected
procedure WMGETSYSCOMMAND(var Msg :TMessage); message WM_SYSCOMMAND;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMGETSYSCOMMAND(var Msg :TMessage);
begin
if Msg.wParam = SC_CLOSE then
ShowMessage("press")
else inherited;
end;
← →
begin...end © (2005-02-14 19:28) [4]> ssk © (14.02.05 19:23) [3]
Во-первых, не wParam, а wParam and $FFF0. А во-вторых, после Alt-F4 тоже попадём в обработчик.
← →
ssk © (2005-02-14 19:34) [5]>после Alt-F4 тоже попадём в обработчик
так и есть.
на самом деле автор не сказал, какой результат ему нужен после сего действия:
1. блокировка закрытия окна?
2. запрос на закрытие окна?
3. просто блокировка "крестика"? ( Крестик.Enabled := False )
что?
← →
begin...end © (2005-02-14 19:36) [6]> ssk © (14.02.05 19:34) [5]
> на самом деле автор не сказал, какой результат ему
> нужен после сего действия
Думаю, что нас это не должно интересовать. Вопрос есть: "Как отловить нажатие на кнопку закрытия формы?". Мне тоже ничего конкретно по этому вопросу в голову не приходит. Кроме, разве что, извращённых методов.
← →
Юрий Зотов © (2005-02-14 20:07) [7]Из обработчика WM_SYSCOMMAND послать WM_NCHITTEST и проверить результат.
← →
begin...end © (2005-02-14 20:14) [8]> Юрий Зотов © (14.02.05 20:07) [7]
А Вы не могли бы привести пример?
← →
Юрий Зотов © (2005-02-14 20:39) [9]> begin...end © (14.02.05 20:14) [8]
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType and $FFF0 = SC_CLOSE then
if SendMessage(Handle, WM_NCHITTEST, 0, Message.YPos shl 16 or Message.XPos) = HTCLOSE then
ShowMessage("Угу, крестик")
else
ShowMessage("Ни фига не крестик");
inherited
end;
← →
begin...end © (2005-02-14 20:49) [10]> Юрий Зотов © (14.02.05 20:39) [9]
Юрий, Вы не поверите! Я тоже хотел предложить нечто подобное, но в хелпе (Windows SDK), идущим с Delphi 7 (по крайней мере), в описании WM_NCHITTEST нет HTCLOSE! Сейчас проверил на сайте MSDN - есть! Поэтому я и думал, что фокус с WM_NCHITTEST не пройдёт. Теперь всё понятно. Спасибо!
← →
Юрий Зотов © (2005-02-14 20:57) [11]> begin...end © (14.02.05 20:49) [10]
Этому хелпу сто лет в обед, там много чего нет. Даже в куда более поздних модулях Windows.pas от последних версий Delphi - и то есть не все. Поэтому всегда полезно иметь свежие MSDN и заголовочные файлы из SDK.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c