Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

отловить нажатие на кнопку закрытия формы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
1-1107798214
Алексей Петухов
2005-02-07 20:43
2005.02.27
Clipboard


1-1107968377
alexa
2005-02-09 19:59
2005.02.27
Gif


9-1101732389
malij
2004-11-29 15:46
2005.02.27
OpenGl


1-1108475251
BFG9k
2005-02-15 16:47
2005.02.27
Как найти место ошибки по адресу?


8-1100008739
AlexLine
2004-11-09 16:58
2005.02.27
Как управлять балансом звука из моей программы