私の Windows 7 デスクトップでは、Windows タスクバーが画面の左側 (デフォルトでは下部) に接続され、カスタム デスクトップ ツールバー ("True Launch Bar") が画面の上部に接続されています。
Delphi XE8 VCL プロジェクトでは、メイン ウィンドウの位置の値 (formMain.Top
とformMain.Left
) をFormClose
イベントに保存し、プログラムの開始時にこれらの値を使用してメイン ウィンドウの位置をイベントに復元しますFormCreate
。
これは通常うまく機能します。ただしformMain.WindowState
、最小化 ( = )しているときにプログラムを閉じるとwsMinimized
、フォームの位置の値が間違っている (つまり、ツールバーの幅/高さによって縮小される) ため、プログラムの開始時にウィンドウが間違った位置に復元されます。
では、どうすればこの問題を解決できますか?
編集: Davidが言及した他の解決策を試しました:
var
WindowPlacement: TWindowPlacement;
R: TRect;
....
WindowPlacement.Length := SizeOf(WindowPlacement);
Win32Check(GetWindowPlacement(formMain.Handle, @WindowPlacement));
R := WindowPlacement.rcNormalPosition;
CodeSite.Send('formMainLeft by WinAPI', R.Left); // normal: 323 minimized: 323
CodeSite.Send('VCL formMain.Left', formMain.Left); // normal: 423 minimized: 323
ただし、WORK AREA 値のみを取得するため、ツールバーが占有するスペースが考慮されないため、これは同じ問題を引き起こします。
さらに、これはデビッドが述べた重複した質問ではなく、類似の質問です。この問題は、最小化された状態のときに画面の値が間違っていることに起因しますが、もう 1 つの問題は、全体的な状態とサイズの復元に関するものです。
また、注意してください:ウィンドウの状態(最小化など)と位置を復元したくないのですが、ウィンドウの位置のみを復元したいのでSetWindowPlacement
、他の質問でDavidが述べたように使用できません。
EDIT2:このコードで問題を解決しました:
if formMain.WindowState = wsMinimized then
begin
MinimizedOffsetTop := Screen.WorkAreaTop;
MinimizedOffsetLeft := Screen.WorkAreaLeft;
end
else if formMain.WindowState = wsNormal then
begin
MinimizedOffsetTop := 0;
MinimizedOffsetLeft := 0;
end;
SettingsIni.WriteInteger('Persistence', 'Top', formMain.Top + MinimizedOffsetTop);
SettingsIni.WriteInteger('Persistence', 'Left', formMain.Left + MinimizedOffsetLeft);
(ウィンドウが最大化されている場合、ウィンドウの位置を保存して復元するのではなく、最大化されたウィンドウの状態のみを保存して復元します)。