2012-05-10 12 views
7

natknąłem się na dziwny problem z XE2:Delphi XE2, jak utrzymać formę na górze po zmianie stylów VCL

używam HWND_TOPMOST z SetWindowPos ustawić mojego formularza na górze, ale jeśli mogę przełączyć style VCL przy starcie , okno nie jest już najwyższe, a jego wyłączenie/ponowne ustawienie nie rozwiązuje go.

Jakikolwiek sposób to naprawić?

+0

Brzmi jak błąd. Powinieneś zgłosić to do [QC] (http://qc.embarcadero.com/). –

+0

@MasonWheeler to nie jest błąd, tak właśnie działają style vcl, za każdym razem, gdy zmieniasz styl vcl, odtwarzanie formularzy jest odtwarzane. – RRUZ

+0

@RRUZ: W oparciu o oryginalny opis OP, ponowne ustawienie atrybutu nie działało z włączonymi stylami, co z pewnością byłoby błędem, gdyby było prawdziwe. (Zobacz komentarz OP do odpowiedzi Sertaca dla lepszego wyjaśnienia, co się naprawdę dzieje.) –

Odpowiedz

8

Twój problem polega na tym, że formularz jest odtwarzany z powodu zmiany stylu i utraty najlepszego stylu, ponieważ VCL nie ma o tym pojęcia. Albo zastosowanie:

FormStyle := fsStayOnTop; 

lub nadpisać CreateWindowHandle tak że SetWindowPos nazywa każdym razem, gdy forma jest odtwarzany:

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, ja nie mógł powielać „rozbrajania/ponowne ustawienie nie napraw to ". W moich testach ponownie wywołałem SetWindowPos.

+0

Dzięki. Masz rację, ponowne ustawienie to działa. Problem polegał na tym, że uchwyt okna był inny, ponieważ wywołałem program RecreateWnd po zmianie stylów VCL w celu rozwiązania innego problemu, dlatego nazwałem SetWindowPos nieprawidłowym uchwytem. – hikari

+0

@hikari - Nie ma za co! –

5

Ustawienie nowego stylu na elemencie sterującym powoduje odtworzenie uchwytu okna sterowania, w związku z czym konieczne będzie ponowne ponowne zastosowanie HWND_TOPMOST.

0

Po długich poszukiwaniach w Internecie iw Delphi pomogłem bez rozwiązania, próbowałem kilku różnych kodów, kilku wskazówek, wszystkie bez żadnego efektu, problem utrzymywał się. Patrząc na pomoc, postanowiłem przetestować poniższy kod, który działał idealnie dla mnie.

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Application.RestoreTopMosts; 
end; 
Powiązane problemy