Главная страница
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.046 c
1-1108414574
Kubic
2005-02-14 23:56
2005.02.27
срочно нужен компанент


14-1107881734
AG.Smit
2005-02-08 19:55
2005.02.27
Кто скажет что значит "ИМХО"?


3-1107075964
Kri
2005-01-30 12:06
2005.02.27
Oshibka pri otkritie programki na drugih particijah


1-1108069277
Porecla
2005-02-11 00:01
2005.02.27
Получить параметры из реестра


6-1103521635
Lex_!
2004-12-20 08:47
2005.02.27
Web-чат.