2009-11-03 8 views
5

Nuestra aplicación solía hacer uso de una base común que todas las formas debían heredar. Me gustaría deshacerme de él por varias razones, que van desde la necesidad de controlar que todo el mundo lo usa hasta varias molestias relacionadas con la implementación de VFI de Delphi. Resulta que la mayor parte de las características que ofrece se puede hacer de otras maneras más confiables.¿Cómo colocar un formulario antes de que se muestre?

De la que no estoy tan seguro, coloca automáticamente todas las formas en el centro de las personas que llaman. Entonces, si abro Dialog A desde mi formulario principal, debería colocarse sobre el centro del formulario principal. Y si luego abro el Diálogo B del Diálogo A, debería colocarse sobre el centro del Diálogo A, y así sucesivamente.

Solíamos ocuparnos de todo esto estableciendo la propiedad Position del formulario base en poOwnerFormCenter y funcionaba muy bien. ¿Pero cómo hago esto en toda la aplicación?

Pensé en usar Screen.OnActiveFormChange, pero creo que esto sucede cada vez que el formulario recibe el foco. También pensé en usar Application.OnModalBegin, pero no parece haber una manera obvia de encontrar el formulario en el momento en que se llama.

¿Alguien ha intentado esto?

Respuesta

5

Bueno, obviamente la herencia de la forma se proporciona para resolver exactamente el problema que está tratando de resolver. Cualquier solución probablemente terminará imitando la herencia de la forma de alguna manera.

¿Podría hacer algo tan simple como buscar globalmente su código para "= clase (TForm)" y reemplazar la clase TForm con su formulario base existente o una nueva clase de formulario base simplificada con solo la funcionalidad que necesita?

De lo contrario, podría intentar modificar la clase TForm original para tener el comportamiento de posicionamiento que desee. Obviamente, modificar las clases provistas es un poco peligroso.

+1

+1 Me deshice de la base porque la gente no la usaba y era un fastidio vigilarla. Así que realmente me gustaría criticar su lógica aquí, pero tiene razón. Todavía no puedo encontrar una manera confiable de ocuparme de uno o dos de los requisitos sin una base, así que supongo que tendré que devolverlo. Definitivamente creo que debería omitir la parte visual de la herencia, porque eso simplemente no funciona bien. –

+0

No estoy seguro, pero es posible que Delphi IDE se pueda configurar para que al menos lo ayude a supervisar la clase en la que se basan los formularios nuevos. –

0

Sin saber más acerca de su aplicación, mi consejo sería agregar el código de posicionamiento a cada formulario individualmente - las ventajas de no tener una clase base es que hace que sea más fácil tener ciertas formas que hacen las cosas ligeramente diferentes, y mantiene toda la lógica de una forma unida en un solo lugar.

+0

El problema aquí es la escala. Tenemos unos cientos de paquetes, la mayoría con varias formas.La clase base fue (creo) un intento de asegurar que todas las formas se comporten de una manera consistente, pero a medida que pasaban los años y la gente iba y venía, la base no se usaba de manera consistente. Estoy tratando de hacer cumplir esta coherencia. –

4

Si no va a ir con un formulario de base común, le sugiero que coloque un componente no visual en cada formulario. Ese componente puede inyectar los comportamientos que desee en la forma base. Si desea tener diferentes comportamientos en diferentes formularios, dele a su componente una función que defina qué rol debe tener ese formulario, y luego puede inyectar diferentes características basadas en ese rol.

Por cierto, también puede tener herencia de formas no visuales, que es mi método preferido para crear una clase base común para todas las formas. También tiene la ventaja de agregar propiedades al formulario y, a partir de esas propiedades, puede cambiar el rol o el comportamiento del formulario.

0

Normalmente uso el evento FormShow para esto, usando el procedimiento SetBounds(). Con otros controles que no son de formulario, puede hacer lo mismo sobrescribiendo el mensaje CMShowing.

+0

Ver mi comentario en la respuesta de Kragen para la escala del proyecto. Si no puedo controlar el uso de una clase base común de manera efectiva, cualquier cosa que requiera un cambio en cada formulario estará muerta en el agua. En proyectos más pequeños, tienes razón, por supuesto. –

0

Tomé su idea de OnModalBegin y corrí con ella. El siguiente es un "Hack", pero parece funcionar. Para probar simplemente arrastre el formulario y haga clic en el botón.

procedure TMainForm.Button1Click(Sender: TObject); 
var 
    mForm: TForm; 
begin 
    mForm := TForm.create(self); 
    mform.width := 300; 
    mform.height := 300; 
    mForm.ShowModal; 
    mForm.Free; 
end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    application.OnModalBegin := modalbegin; 
end; 

procedure TMainForm.FormShow(Sender: TObject); 
begin 
    if Screen.FormCount>1 then begin 
    screen.forms[Screen.FormCount-1].left := round((screen.forms[Screen.FormCount-2].left + screen.forms[Screen.FormCount-2].width/2) - screen.forms[Screen.FormCount-1].width/2); 
    screen.forms[Screen.FormCount-1].top := round((screen.forms[Screen.FormCount-2].top + screen.forms[Screen.FormCount-2].height/2) - screen.forms[Screen.FormCount-1].height/2); 
    application.processmessages; 
    screen.forms[Screen.FormCount-1].Caption := inttostr(screen.forms[Screen.FormCount-1].top)+','+inttostr(screen.forms[Screen.FormCount-1].left); 
    end; 
end; 

procedure TMainForm.ModalBegin(Sender: TObject); 
begin 
    if Screen.FormCount>=0 then 
    screen.forms[Screen.FormCount-1].OnShow := FormShow; 
end; 
Cuestiones relacionadas