2012-03-07 10 views
5

El proyecto en el que trabajo consta de varios cientos de formularios. En su mayoría se llaman desde la forma principal. El nombre de la aplicación está en todas las categorías de formulario.Intentando atrapar el oncreate de un formulario

Ahora una "versión" diferente de la aplicación debe tener los títulos de los formularios cambiados a otro nombre de aplicación. Pero esto es condicional.

Lo que ocurrió fue la unión del

Screen.OnActiveFormChange := ScreenOnActiveFormChange; 

en el FormCreate y hacer un procedimiento para eso.

procedure TFormMAIN.ScreenOnActiveFormChange(Sender: TObject); 
begin 
    if Newversion then begin 
    if assigned(screen.activeform) then begin 
     Screen.ActiveForm.Caption := SwapFormCaption(Screen.ActiveForm.Caption); 
    end; 
    end; 
end; 

Esto funciona bien en el 95% de los casos. Pero en esos 5%, la forma se muestra demasiado rápido. La ventana se dibuja antes de actualizar el título y Windows lo deja allí. Pero el pie de foto ya tiene un nuevo valor. Lo que funcionó remedio fue aumentar y disminuir la altura del formulario en 1 píxel y luego se mostraría a la derecha. form.repaint no ayudó aquí. Esta es una forma bastante fea de hacer las cosas.

Lo que realmente quiero es interceptar la creación de la subforma en lugar de la activación. Intenté encontrar recursos sobre eso pero no tuve éxito.

+13

La mejor manera de hacer esto es hacer todas sus formas derivan de una base común clase. A continuación, puede controlar la configuración común a todos los formularios desde una única ubicación –

+0

Después de una investigación más profunda, creo que de alguna manera es un error de videobuffer. Cuando arrastro la ventana, la leyenda no cambia y se mantiene mal. A menos que lo arrastre para deslizarme fuera del escritorio. Cuando lo arrastro hacia atrás, la parte que no se muestra en el dekstop se cambia a la leyenda correcta, mientras que la parte que permaneció visible permanece mal. –

Respuesta

0

¿Ha intentado usar la aplicación de ventana?

SetWindowText(Screen.ActiveForm.Handle,PChar(SwapFormCaption(Screen.ActiveForm.Caption)); 

Editar: 1 sugerencia más: Añadir una llamada a la API DrawMenuBar para obligar a volver a dibujar de la barra de menú de la ventana

DrawMenuBar(Screen.ActiveForm.Handle); 
+0

Esto hace exactamente lo mismo que el código que publiqué, con el mismo problema. –

+0

DrawMenuBar funciona bien, gracias. –

Cuestiones relacionadas