今回はアプリケーションのウィンドウメニューで閉じる[×]ボタンを制御する方法をご紹介します。
通常Windowsアプリケーションのウインドウには右上のメニューに
最小化[_]、最大化[□]、閉じる[×]
のボタンが用意されています。
特に[×]ボタンはウィンドウを終了してしまうため、
ユーザー操作でアプリケーションが意図せず終了してしまう場合があります。
この[×]ボタンが誤って押されないように制御するにはいくつかの方法があります。
①:メニューアイコンを非表示にする
FormのBorderIconsプロパティでbiSystemMenuをFalseにすると、
最小化[_]、最大化[□]、閉じる[×]を非表示にすることができます。
これによって実質[×]ボタンは使用できなくなります。

ただし最小化[_]、 最大化[□]も使用できなくなりますので、
最小化[_]、最大化[□]を使用したい場合は②の方法が有効です。
なお、BorderIconsプロパティにある
「biMinimize」「biMaximize」をFalseに設定すると、
それぞれ最小化[_]、最大化[□]だけを非表示に設定できます。
②:Windows APIで [×]ボタンを無効化する
メニューアイコンを表示しつつ、[×]ボタンを無効化するには、
FormのCreateイベントでWindowsのAPI関数を使用します。
例)[×]ボタンを無効化
procedure TForm1.FormCreate(Sender: TObject);
var
hSysmenu :hMenu;
begin
hSysmenu := GetSystemMenu(Handle,false);
DeleteMenu(hSysMenu,SC_CLOSE,MF_BYCOMMAND); // [×]ボタンを無効化
end;
これによってメニューアイコンを表示しつつ、
[×]ボタンだけをDisabled状態とすることができますので、
アプリケーションや画面の意図しない終了を防ぐことができます。
<実行イメージ>
(それぞれ[×]ボタンが押下不可になっている)



ちゃんと押下不可になっている

「閉じる」が非表示になっている
注意事項としては、①②いずれの方法も、
[×]ボタンを誤って押さないようにする手順となりますので
「Alt+F4」ショートカットなどでは普通に画面が閉じられます。
またこの設定を行った画面で意図して画面を閉じさせたい場合は、
画面内に「閉じる」ボタンなどを配置して「Close;」処理を記述するのが一般的です。
なお、画面をロジックレベルで完全に閉じさせたくない場合は、
FormのOnCloseQueryイベントで引数CanCloseをFalseに設定するなどの方法があります。
例)ロジックで完全に画面を閉じさせない
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// 特定の条件に合致する場合のみ画面を閉じる
if (bTOJIRU_JOUKEN = True) then
CanClose := True // 画面を閉じる(FormCloseに進む)
else
CanClose := False; // 画面を閉じさせない
end;