私はPeter Below's PBThreadedSplashFormを使用して、アプリケーションの起動時に表示しています。これは、データモジュールの作成中(メインフォームが作成される直前)にさまざまなデータベースが開かれると更新されます。Peter以下のスレッドスプラッシュ画面とモーダルダイアログ
問題は、データモジュールの作成中に行われる特定のことが存在するかどうかを確認することです。それらの項目のいずれかが見つからない場合は、項目を作成するかアプリケーションを閉じることができるようにモーダルダイアログが表示されます。 (欠落している項目は通常インデックスで、ダイアログは主にデータベースのインデックスを再作成するときに使用されるため、通常のユーザーではなく開発者を対象としています)。ただし、スプラッシュ画面の後ろにモーダルダイアログが表示されます。キャプションが変更されると、フォーカスされたウィンドウのように見えますが、スプラッシュ画面の後ろに表示されます。
スプラッシュ画面は、次のコードを使用して、メインのプロセスとは異なるスレッドからのWindows APIのCreateWindowEx()を使用して作成されます。
procedure TPBSplashThread.CreateSplashWindow;
const
TopmostStyle: Array [Boolean] of DWORD = (0, WS_EX_TOPMOST);
NoActivateStyle : Array [Boolean] of DWORD = (0, WS_EX_NOACTIVATE);
var
wsize: TSize;
begin
wsize.cx := FSurface.Width + GetSystemMetrics(SM_CXEDGE) * 2;
wsize.cy := FSurface.Height + GetSystemMetrics(SM_CYEDGE) * 2;
FWnd := CreateWindowEx(
TopmostStyle[ FTopmost ] or WS_EX_TOOLWINDOW
or WS_EX_STATICEDGE or WS_EX_CLIENTEDGE
or NoActivateStyle[ Win32MajorVersion >= 5 ],
MakeIntResource(FWndClass),
nil,
WS_POPUP or WS_BORDER,
Forigin.x, Forigin.y,
wsize.cx, wsize.cy,
0, 0, hInstance, self);
If FWnd = 0 Then
raise exception.create('TPBSplashThread.CreateSplashWindow: CreateWindowEx failed');
end;
FTopmostは決してありません(明確な意味を持つ)プロパティですクラスの構築時にデフォルトの初期化が行われるため、Falseです。 (私は明示的にそれをFalseに設定しようとしましたが効果がありません)また、モーダルダイアログのOnShowイベント中にSetForegroundWindow()とSetWindowPos()を使用してみました。
これを引き起こしている原因は何ですか?
私はEddieの投稿を見ました。問題は、スプラッシュフォームを知らないTDataSetの子孫によってダイアログが実際に作成されることです。スプラッシュフォームは、ShowSplashScreen()を使用してDPRで作成され、Application.CreateForm()は2回呼び出されます(データモジュールでは1回、メインフォームでは1回)、スプラッシュフォームはHideSplashForm()を使用して解放されます。データモジュールのOnCreateイベントでは、TDataSet。Openメソッドは欠落しているインデックスをチェックし、モーダルダイアログを表示するメソッドを呼び出します。その時点で誰がOpenを呼び出したのか、親プロセスのどこでそれが起こっているのか分かりません。 –