Peter Below's Threaded Splash Screen und modale Dialoge

Ich benutzePeter Below's PBThreadedSplashForm Anzeige während des Programmstarts. Es wird aktualisiert, wenn während der Erstellung des Datenmoduls verschiedene Datenbanken geöffnet werden (kurz bevor das Hauptformular erstellt wird).

Das Problem ist, dass wir prüfen, ob bestimmte Dinge vorhanden sind, die während der Erstellung des Datenmoduls ausgeführt werden. Wenn eines dieser Elemente fehlt, wird ein modales Dialogfeld angezeigt, in dem entweder das Element erstellt oder die Anwendung geschlossen werden kann. (Bei den fehlenden Elementen handelt es sich in der Regel um Indizes. Das Dialogfeld wird hauptsächlich verwendet, wenn Datenbanken neu indiziert werden. Es richtet sich daher an Entwickler und nicht an normale Benutzer.) Das modale Dialogfeld wird jedoch hinter dem Begrüßungsbildschirm angezeigt. Es scheint das fokussierte Fenster zu sein, wenn sich die Beschriftung ändert, aber es wird hinter dem Begrüßungsbildschirm angezeigt.

Der Begrüßungsbildschirm wird mit der Windows-API CreateWindowEx () aus einem anderen Thread als dem Hauptprozess mit folgendem Code erstellt:

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 ist eine Eigenschaft (mit der offensichtlichen Bedeutung), die niemals festgelegt wird. Aufgrund der Standardinitialisierung während der Klassenerstellung ist sie daher "Falsch". (Ich habe auch versucht, es explizit auf False zu setzen, nur für den Fall, dass es keine Auswirkungen hat.) Ich habe auch versucht, SetForegroundWindow () und SetWindowPos () während des OnShow-Ereignisses des modalen Dialogfelds ohne Auswirkungen zu verwenden.

Hat jemand eine Idee, was dies verursachen könnte?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage