2012-05-10 6 views
7

mir ein seltsames Problem mit XE2 begegnet:Delphi XE2, wie Form an der Spitze zu halten, nachdem VCL Arten Ändern

I HWND_TOPMOST mit SetWindowPos bin mit meiner Form an der Spitze gesetzt, aber wenn ich VCL Stile zur Laufzeit wechseln , das Fenster ist nicht mehr zuoberst, und das Unscharfschalten/Neueinstellung repariert es auch nicht.

Irgendeine Möglichkeit, dies zu beheben?

+0

Klingt wie ein Fehler. Sie sollten dies an [QC] (http://qc.embarcadero.com/) melden. –

+0

@MasonWheeler dies ist kein Fehler, das ist die Art, wie die vcl-Stile funktionieren, jedes Mal, wenn Sie einen vcl-Stil ändern, wird der Handle der Formulare neu erstellt. – RRUZ

+0

@RRUZ: Basierend auf der ursprünglichen Beschreibung des OP funktionierte das Zurücksetzen des Attributs nicht mit Stilen, was sicherlich ein Fehler wäre, wenn es wahr wäre. (Siehe den Kommentar des OP zu Sertacs Antwort für eine bessere Erklärung dessen, was wirklich geschah.) –

Antwort

8

Ihr Problem ist, dass die Form wegen eines Artänderung neu erstellt wird und dessen obersten Stil zu verlieren, da die VCL keine Kenntnis von diesem. Entweder Verwendung:

FormStyle := fsStayOnTop; 

oder außer Kraft setzen CreateWindowHandle so dass SetWindowPos jedes Mal aufgerufen wird, die Form neu erstellt wird:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure CreateWindowHandle(const Params: TCreateParams); override; 
    .. 

procedure TForm1.CreateWindowHandle(const Params: TCreateParams); 
begin 
    inherited; 
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); 
end; 


BTW, ich nicht duplizieren könnte „Entschärfen/Neueinstellung nicht behebe es ". Mit meinen Tests, SetWindowPos wieder angerufen, reparierte es.

+0

Danke. Du hast recht, die Neueinstellung funktioniert tatsächlich. Das Problem war, dass das Fenster-Handle anders war, weil ich RecreateWnd aufruft, nachdem ich VCL-Stile geändert habe, um ein anderes Problem zu lösen, also habe ich SetWindowPos mit einem jetzt ungültigen Handle aufgerufen. – hikari

+0

@hikari - Gern geschehen! –

5

einen neuen Stils auf einer Steuer Einstellung wird die Fenstergriff Kontrolle neu erstellt werden, so würde HWND_TOPMOST haben wieder neu aufgetragen werden.

0

Nach einer langen Suche im Internet und in Delphi Hilfe ohne Lösung, ich verschiedene Codes, einige Tipps, die alle von ihnen ohne Wirkung auch immer, das Problem bestand versucht. Wenn ich mir die Hilfe anschaue, habe ich beschlossen, den unten stehenden einfachen Code zu testen, der perfekt für mich funktioniert hat.

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Application.RestoreTopMosts; 
end;