Ekran wątku Splash i dialogów modalnych Petera Belowa

używamPBThreadedSplashForm Petera Below do wyświetlenia podczas uruchamiania aplikacji. Zostaje zaktualizowany w miarę otwierania różnych baz danych podczas tworzenia modułu danych (tuż przed utworzeniem głównego formularza).

Problem polega na tym, że mamy sprawdzenie istnienia pewnych rzeczy, które są wykonywane podczas tworzenia modułu danych. Jeśli brakuje któregokolwiek z tych elementów, wyświetlane jest modalne okno dialogowe, aby można było utworzyć element lub zamknąć aplikację. (Brakujące elementy to zazwyczaj indeksy, a okno dialogowe jest używane głównie podczas reindeksowania baz danych, więc jest ono skierowane do programistów i nie zwykłych użytkowników). Jednak modalne okno dialogowe jest wyświetlane za ekranem powitalnym; wydaje się, że jest to okno zogniskowane, gdy zmienia się podpis, ale wyświetla się za ekranem powitalnym.

Ekran powitalny jest tworzony przy użyciu API CreateWindowEx () z innego wątku niż główny proces, przy użyciu następującego kodu:

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 to właściwość (z oczywistym znaczeniem), która nigdy nie jest ustawiona, więc jest to Fałsz z powodu domyślnej inicjalizacji podczas konstruowania klasy. (Próbowałem też jawnie ustawić go na False, na wszelki wypadek, bez efektu.) Próbowałem także użyć SetForegroundWindow () i SetWindowPos () podczas zdarzenia OnShow okna modalnego bez żadnego efektu.

Czy ktoś ma pojęcie, co może to powodować?

questionAnswers(3)

yourAnswerToTheQuestion