Консультация № 110135
19.11.2007, 13:19
0.00 руб.
0 5 5
Здравствуйте! Подскажите, пожалуйста, как мне перехватить для обработки событие нажатия на "крестик" в верхнем правом углу формы? При нажатии на него программа закрывается некорректно. Или хотя бы сделать его недоступным пользователю. Спасибо.

Обсуждение

Неизвестный
19.11.2007, 13:30
общий
это ответ
Здравствуйте, Kalina!
Событие перед закрытием формы - OnCloseQuery:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;
Неизвестный
19.11.2007, 13:33
общий
это ответ
Здравствуйте, Kalina!

Сделать недоступной кнопку закрыть можно так, как указано в приложении


Приложение:
procedure TForm1.FormCreate(Sender: TObject);var SysMenu: HMenu;begin SysMenu := GetSystemMenu(Handle, False); Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED or MF_GRAYED);end;
Неизвестный
19.11.2007, 13:41
общий
это ответ
Здравствуйте, Kalina!

Есть ещё одно событие перед закрытием программы - OnClose. По нему формируется обработчик:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Ваши действия
Action := caNone; //ещё варианты: caHide, caFree, caMinimize.
end;

В моей практике пригождались caNone (проигнорировать нажатие крестика) и caFree (всё-таки закрыть форму, а в случае главной формы - и программу).
Неизвестный
19.11.2007, 13:57
общий
это ответ
Здравствуйте, Kalina!
За кнопки наверху формы (в строке заголовка) отвечает свойство BorderIcons.
Поставьте напротив biSystemMenu значение False
Неизвестный
20.11.2007, 18:08
общий
это ответ
Здравствуйте, Kalina!

чтобы не дать пользователю закрыть окно достаточно обработать событие
FormClose переменной Action присваиваем caNone и форма не закроется Action:= caNone;
но введите глобальное условие при котором вы можете правильно закрыть программу т.е Action:= caFree;
в этом обработчике кстати можете поместить код который правильно бы выгружал форму

ниже код запрещающий кнопку закрытия приложения

Приложение:
var hMenuHandle : HMENU;begin hMenuHandle := GetSystemMenu(Form1.Handle, FALSE); if (hMenuHandle <> 0) then DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);end;
Форма ответа