2025年5月 2日(金) 23:43 JST
フォームの OnCretae イベントや OnShow イベントでは、Close メソッドをコールしても、クローズさせることはできません。
原因は、OnCreate イベントの段階では、まだメッセージループが開始されていないからということのようです。
これらのイベント中で、クローズさせたい場合には、下記のように記述します。
PostMessage(Handle, WM_CLOSE, 0, 0);
こうすることで現在実行中のイベント終了後、クローズしてくれるようになります。
ですから厳密にはイベント中ではありません。でもやりたいことはだいたいできると思います。
ボーランドの公式回答では、raise で処理するとのことです。
□CodeGearのホームページ
http://www.codegear.com/
□CodeGearのサポートページ
http://support.codegear.com/
□CodeGearの旧Delphi FAQサイト
http://support.codegear.com/article/37355
□該当の公式回答 - Form の OnCreate の処理中に中断
http://support.codegear.com/article/37355#37355_tocentry18
StrToInt は、10進または16進表記の整数型の数値を表す文字列(S)を数値に変換します。 しかし、Sが有効な数値を表していない場合、StrToInt は EConvertError 例外を生成します。
きちんと例外処理していても、開発環境で作業している際には、例外発生のダイアログが出てうっとうしいものです。 Delphi7以降の場合、TryStrToIntDef を使うと例外が発生せずチェックが可能です。StrToInt を使う場合でも 例外発生時に何か特別な値をセットするようなプログラムの場合には、StrToIntDef が有効です。 また 、Val 手続きを使うと2番目の引数の型を変更することで、数値チェックをする数字の範囲を変更可能です。
StrToIntは整数型の場合に有効ですが、他にExtended型に変換するStrToFloatや、通過型に変換するStrToCurrなど用途に合わせて選択してください。
TryStrToIntDef(s);
///数値チェック ///チェック対象文字列 /// True:数値文字列, Flase:非数値文字列 function IsNumeric(s: String): Boolean; var c: Integer; n: Extended; // ここの型を変えることでチェック範囲を変更できます。 begin Val(s, n, c); Result := (c = 0); end;
普段どこにあるかわからない、 Application変数(TApplication)のウィンドウ。 本当にあるのかどうか確認するために表示させることにしました。 表示させてもあまり意味がない、役立たずなサンプルです。
フォームの OnCreate に書いた場合のサンプルです。 フォーム表示と同時に、スクリーン左上にアプリケーションのウィンドウが表示されます。
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Application.Handle, GWL_STYLE, WS_CAPTION); SetWindowPos(Application.Handle, HWND_TOP, 0, 0, 100, 100, 0); end;
前回のFAQ で Windows 9x 系でのログオフ、シャットダウンや再起動の方法を書きましたが、本日はNTのコマンドプロンプトから動作するサンプルプログラムを。以下のコードをShutdown.dprとして保存し、コンパイルしてください。
システムをシャットダウンまたは再起動させるために、 WxitWindowsEx 関数を呼び出すプロセスは AdjustTokenPrivileges 関数を呼び出して、SE_SHUTDOWN_NAME 特権を得ています。
program Shutdown; {$APPTYPE CONSOLE} uses SysUtils, Windows; var hToken: THandle; tkp: TTokenPrivileges; dwRet: DWORD; begin // このプロセスのためのトークンを取得します。 if (not OpenProcessToken(GetCurrentProcess, (TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY), hToken)) then Writeln('OpenProcessToken'); // シャットダウンに必要な権限を取得します。 LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid); tkp.PrivilegeCount := 1; // one privilege to set tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; dwRet := 0; // シャットダウンプロセスに必要な特権を取得します。 AdjustTokenPrivileges(hToken, false, tkp, 0, nil, dwRet); // AdjustTokenPrivilegesの戻り値をチェックします。 if (GetLastError <> ERROR_SUCCESS) then Writeln('AdjustTokenPrivileges'); // 強制的にアプリケーションを終了させながら、シャットダウンします。 if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then Writeln('ExitWindowsEx'); end.
ExitWindowsExの1番目の引数部分を、先日ご紹介したように以下のように変更することで、ログオフなどを行うことができます。 また、EWX_FORCE を指定することで強制的に処理を進められます。
// ログオフ ExitWindowsEx(EWX_LOGOFF, 0); // シャットダウン ExitWindowsEx(EWX_SHUTDOWN, 0); // 再起動 ExitWindowsEx(EWX_REBOOT, 0); // POWER OFF ExitWindowsEx(EWX_POWEROFF, 0);