2012-05-10 16 views
7

me encontré con un problema extraño con XE2:Delphi XE2, cómo mantener la forma ENCIMA después de cambiar estilos VCL

estoy usando HWND_TOPMOST con SetWindowPos para establecer mi formulario en la parte superior, pero si cambio estilos VCL en tiempo de ejecución , la ventana ya no está más arriba, y desarmarla/reajustarla tampoco la arregla.

¿Alguna manera de arreglar esto?

+0

Suena como un error. Debe informar esto a [QC] (http://qc.embarcadero.com/). –

+0

@MasonWheeler esto no es un error, esta es la forma en que funcionan los estilos vcl, cada vez que se cambia un estilo vcl se recrea el manejo de los formularios. – RRUZ

+0

@RRUZ: De acuerdo con la descripción original del OP, esa redefinición del atributo no funcionaba con los estilos activados, lo que sin duda sería un error si fuera cierto. (Vea el comentario del OP a la respuesta de Sertac para una mejor explicación de lo que realmente estaba sucediendo.) –

Respuesta

8

Su problema es que el formulario se está recreando debido a un cambio de estilo y perder su estilo más alto ya que el VCL no tiene conocimiento de esto. De cualquier uso:

FormStyle := fsStayOnTop; 

o anular de manera que CreateWindowHandleSetWindowPos se llama cada vez que se vuelve a crear la forma:

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; 


Por cierto, no podría duplicar "desarmado/re-ajuste no hace arreglarlo ". Con mis pruebas, llamando al SetWindowPos lo arreglé de nuevo.

+0

Gracias. Tienes razón, volver a establecerlo realmente funciona. El problema era que el identificador de ventana era diferente porque llamé a RecreateWnd después de cambiar los estilos de VCL para solucionar un problema diferente, así que estaba llamando a SetWindowPos con un identificador ahora no válido. – hikari

+0

@hikari - ¡De nada! –

5

Al establecer un nuevo estilo en un control, se vuelve a crear el identificador de ventana del control, por lo que HWND_TOPMOST debería volver a aplicarse.

0

Después de una larga búsqueda en Internet y en Delphi ayuda sin solución, probé varios códigos diferentes, varios consejos, todos ellos sin ningún efecto, el problema persistió. Mirando la ayuda, decidí probar el sencillo código a continuación que funcionó perfectamente para mí.

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