2009-04-13 35 views
10

A veces, cuando abro una ventana modal en mi aplicación Delphi tarda un rato en aparecer, entonces noto que la aplicación está bloqueada y lo que sucedió fue que el formulario modal se abrió con ShowModal pero no se mostró y la aplicación se bloqueó como si la Ventana modal estuviera en la primera capa.La ventana modal recién creada pierde el foco y se vuelve inaccesible en Windows Vista

Normalmente, cuando esto sucede, tengo que usar Alt + Tab o Windows + Tab para encontrar la ventana modal "oculta", pero esto no funciona cada vez.

Este comportamiento solo ocurre en Vista, pero es bastante molesto.

¿Hay alguna manera de evitar que ocurra esta "rareza de enfoque"?

Gracias.

* * EDITAR

establecer parecer Application.MainFormOnTaskbar: = True resolvió el problema, pero todavía es demasiado pronto para sacar conclusiones, porque esto ocurre al azar.

* EDITAR 2 *

ModalFormOnTaskbar no resolvió el problema, después de que he intentado establecer PopupMode = pmAuto, pero que acaba de hacer el problema peor.

Ahora estoy tratando de configurar el PopupParent explícitamente y le avisaré si el problema está resuelto.

Respuesta

7

Eche un vistazo a la propiedad PopupParent. Es posible que desee establecerlo explícitamente para su formulario modal antes de la llamada ShowModal. Cuando PopupParent es nulo (valor predeterminado), VCL se comporta de manera un poco diferente según el valor de la propiedad relacionada PopupMode.

Si configura PopupParent del formulario modal en el formulario que está activo justo antes de llamar a ShowModal, eso puede ayudar.

+0

¿Qué sucede si no hay ningún formulario activo antes de llamar a ShowModal? – ertx

7

El problema que ha comenzado a suceder cuando Windows XP introdujo el concepto de ventana fantasma. Debido a la arquitectura inusual que utiliza Delphi (todas las formas son hijos de una ventana oculta - TApplication) muchas aplicaciones Delphi experimentan el mismo problema.

Una manera de resolver rápidamente que es disable window ghosting al inicializar la aplicación:

var 
    User32: HMODULE; 
    DisableProcessWindowsGhosting: TProcedure; 
begin 
    User32 := GetModuleHandle('USER32'); 
    if User32 <> 0 then 
    begin 
    DisableProcessWindowsGhosting := GetProcAddress(User32, 'DisableProcessWindowsGhosting'); 
    if Assigned(DisableProcessWindowsGhosting) then 
     DisableProcessWindowsGhosting; 
    end; 
end; 

Otro (más elegante, aunque laboriosa) posible solución es normalize your Delphi application.

Una tercera opción sería switching to Delphi 2006 (Delphi 10.0).

Además del problema que está reportando, la arquitectura de Delphi presenta más rarezas, entre ellas el menú de la barra de tareas y la incapacidad de flash.

0

es posible que desee intentar editar Forms.pas para añadir el siguiente código en TCustomForm.ShowModal(), justo antes de la llamada a Application.ModalStarted():

if Assigned(Application) then begin 
    while PeekMessage(msg, Application.Handle, CM_ACTIVATE, CM_DEACTIVATE, PM_REMOVE) do begin 
    TranslateMessage(msg); 
    DispatchMessage(msg); 
    end; 
end; 
2

He conseguido reducir una gran cantidad de estas ocurrencias, eliminando las llamadas a la aplicación. ProcessMessages que tengo en mi código, siempre que puedo.

+0

Tuve el mismo problema y este me funcionó. Gracias. –

1

Alt+P+V (.dpr) tiene Application.MainFormOnTaskbar := True; por defecto, no sé por qué, pero si pongo Application.MainFormOnTaskbar := False;, el problema está resuelto.

+2

Su respuesta podría ser más útil para explicar cómo funciona – oefe

+0

Alt + P + V (.dpr) tiene Application.MainFormOnTaskbar: = True; por defecto, no sé por qué, pero si puse Application.MainFormOnTaskbar: = False; el problema esta resuelto. Lo siento. –

Cuestiones relacionadas