2011-09-22 13 views
10

En Delphi XE Actualización 1, estoy recibiendo comportamiento aparentemente aleatoria de las formas modales si el padre FormStyle (principal) del formulario se establece en fsStayOnTop.para "mantener el" principal forma y diálogos modales en Delphi XE

1) Con MainFormOnTaskbar: = False (a la antigua), todo "simplemente funciona". Con el nuevo MainFormOnTaskbar: = True, los formularios modales se ocultan detrás del formulario principal cuando el formulario principal está configurado para "permanecer en la parte superior". En la mayoría de los casos diciendo

modalForm.PopupParent := self; 

justo antes de la llamada a modalForm.ShowModal parece ayudar. Pero no siempre.

2) Todos mis formas modales son simples, sin lujos, colocados en MainFormCenter, no utilizando herencia de formularios, etc. Sin embargo, la PopupParent fijar sólo funciona para cerca de la mitad de ellos, mientras que la otra mitad todavía quedan ocultos detrás de la forma principal. Lo más extraño de todo es que en un caso el orden de líneas de código no relacionadas se rompe o lo hace. Ver líneas marcadas (1) y (2) en este código:

procedure TEchoMainForm.DBMaintenancePrompt(actions : TMaintenanceActions); 
var 
    frm : TDBMaintenanceForm; 
begin 
    frm := TDBMaintenanceForm.Create(self); 
    try 
    frm.Actions := actions; // (1) 
    frm.PopupParent := self; // (2) 
    frm.ShowModal; 
    finally 
    frm.Free; 
    end; 
end; 

Cuando se ejecuta en este orden, la forma modal muestra correctamente en la parte superior de la forma principal. Pero cuando invierto las líneas, la forma modal se esconde detrás de main. La línea marcada (1) establece una propiedad de la forma modal, lo que da como resultado que se verifiquen varias casillas de verificación desmarcadas en un TRzCheckGroup, sentado en un TRzPageControl (de los componentes de Raize). Este es el método setter que se ejecuta cuando la línea (1) anterior se ejecuta:

procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions); 
var 
    ma : TMaintenanceAction; 
begin 
    for ma := low(ma) to high(ma) do 
    cgMaintActions.ItemChecked[ ord(ma)] := (ma in Value); 
    end; 
end; 

Esto es suficiente para la forma modal para mostrar detrás de la forma principal, si el orden de las líneas (1) y (2) es invertido

Esto podría apuntar a TRzCheckGroup (que se manipula cuando se ejecuta el código setter), pero tengo otros dos formularios que muestran el mismo problema y no uso TRzCheckGroup (o TRzPageControl). Y no pude reproducir el problema con una aplicación de muestra separada utilizando componentes de Raize. Desactivar el formulario, el control de página o el TRzCheckGroup durante todo el tiempo de establecimiento no tiene ningún efecto.

No parece ser un problema de tiempo, porque cuando el formulario modal muestra oculto una vez, siempre lo hace. El cambio de comportamiento solo proviene de la reorganización de las líneas de código.

3) Una última observación: mis formularios modales son bastante simples, por lo que se muestran más o menos al instante, sin retraso visible. Pero cuando la forma principal es fsStayOnTop, entonces muy a menudo puedo ver el formulario modal en la parte superior, y luego veo que se "empuja" hacia atrás. Luego, al presionar Esc, la forma modal (invisible) se muestra en la parte superior de la forma principal durante una fracción de segundo y luego se cierra.

O me falta algo que parecerá obvio en retrospectiva, o esta es una llamada para la depuración psíquica, no sé. Alguna idea, por favor?


ACTUALIZACIÓN. Intenté localizar el problema en otra forma donde ocurre. Tiene algunos botones (Raize) y un TSyntaxMemo (un componente memo mejorado de eControl.ru). Esta forma no tiene casi nada en común con las otras formas que experimentan el problema.Después de eliminar partes del código y probar, ahora puedo reproducir el problema haciendo un pequeño cambio en un método que asigna una cadena al componente memo:

Este es mi código original, que hace que el formulario que contiene el editor esconderse detrás de la forma principal:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := Value; 
end; 

Cuando cambio la asignación a una cadena vacía, se muestra el formulario correctamente:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := ''; // CRAZY! Problem goes away 
end; 

Cuando le asigno un carácter único al editor, se inicia el formulario ocultando de nuevo :

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := 'a'; // Problem is back 
end; 

Por supuesto, las otras dos formas problemáticas no usan este componente de editor o cualquiera de sus unidades.

He intentado eliminar el control de notas y volverlo a agregar (pensar en el orden de creación, etc.), pero no ha tenido ningún efecto. Lo mismo si creo la nota en el código. El formulario se oculta tan pronto como se asigna una cadena no vacía a la propiedad de texto de la nota.

+0

Estoy un poco confundido. Dice que funciona con las líneas numeradas en el orden en que se encuentran, pero el código allí hace referencia a "Self" sin ser un método de una instancia de objeto. El código publicado no compilará, mucho menos funcionará, independientemente del orden de las líneas. Es difícil explicar las anomalías del código cuando no se publica un código real. :) –

+0

@Ken: corregido ahora, gracias. El código es un método de la forma principal, por lo que la auto-referencia es válida. Es el código literal. Simplifique un poco el código en SetActions, pero tal como está escrito aquí, compila * y * todavía causa el problema de "ocultación". –

+0

@moodforaday: ¿en qué tiene configurada la propiedad 'PopupMode' del formulario modal? ¿En qué tiene establecida la propiedad 'TApplication.ModalPopupMode'? –

Respuesta

-1

Windows no es compatible con la mayoría de los formularios para la aplicación. Y el formulario modal es el más alto por defecto. Pero tienes este estilo para tu propia forma.

Una decisión en mente: elimine la parte superior de su formulario principal (sin efecto visible), llame al formulario modal, defina el estilo superior cuando termine modal.

0

Tuve el mismo problema hace algún tiempo. Mi solución fue agregar un Self.BringToFront; al evento OnShow del formulario modal.

Cuestiones relacionadas