2012-03-01 38 views
6

Tengo un pequeño problema con los formularios que se crean desde dentro de una DLL.Delphi XE2 asignando Application.MainForm.Handle a Application.Handle dentro de una DLL

Básicamente lo que sucede es cuando se muestra un formulario (Form1) de un dll (creo que tiene que estar arriba) y abre otro formulario (Form2) que es aparte de la aplicación principal (es decir, no vive dentro del dll). Si coloca el cursor sobre un control en Form2 para que se muestre la sugerencia, Form2 irá inmediatamente detrás de Form1.

Esto solo ocurre cuando MainFormOnTaskBar es verdadero. En este momento estamos pasando Application.Handle de la aplicación principal a la DLL y asignándola a Application.Handle of the DLL.

He logrado resolver el problema al pasar Application.MainForm.Handle a la DLL que se asignará a Application.Handle en la DLL.

¿Esto es seguro? ¿Alguien sabe la forma correcta de solucionar este problema?

Respuesta

5

Su solución es perfectamente razonable. Tengo un complemento COM de Excel que hace algo muy similar. En ese código configuré Application.Handle en el DLL para que sea el manejador de ventana de la ventana principal de Excel. Eso es análogo a lo que estás haciendo.

El problema es que debe configurar correctamente el propietario de la ventana. Necesita la cadena de propiedad para llegar hasta el formulario principal de su aplicación. Los formularios en una DLL no tienen conocimiento de cuál es la forma principal, por lo que debe proporcionar ese conocimiento.

Tenga en cuenta que estoy hablando del concepto de propietario de ventana tal como lo usa Windows y no del concepto de propietario de VCL, que es totalmente diferente. En la terminología de VCL esto se conoce como padre emergente y usted podría resolver su problema estableciendo explícitamente el padre emergente del formulario DLL como el formulario principal. Las propiedades relevantes son PopupMode y PopupParent. Para los formularios que viven en la aplicación principal, el VCL naturalmente hará que su padre emergente sea la forma principal.

Sin embargo, después de haber hablado explícitamente del establecimiento de elementos emergentes, me gustaría destacar que su solución actual es más simple y más conveniente.

Lo que ambas soluciones hacen es asegurarse de que todos los formularios auxiliares sean propiedad del formulario principal. Eso significa que estos formularios siempre están en la parte superior de la forma principal. Significa que las formas auxiliares se minimizarán si se minimiza la forma principal. Lea acerca de windows propiedad aquí: Window Features.

Por cierto, si ha estado utilizando paquetes de tiempo de ejecución en lugar de una DLL, el código en el paquete estaría conectado al mismo VCL que el formulario principal. Por lo tanto, el código empaquetado podría ver el formulario principal y establecer apropiadamente el propietario de la ventana. Esta es sin duda una ventaja de usar paquetes. Por supuesto, puede haber una buena razón por la cual necesita usar archivos DLL en lugar de paquetes.

+0

Gracias por eso. Me preguntaba si necesito establecer la propiedad MainFormOnTaskBar en true en el objeto de la aplicación que se encuentra dentro de la DLL. –

+0

Dado que el objeto de la aplicación en la DLL no tiene forma principal, entonces supongo que no necesitamos o no debemos establecer MainFormOnTaskBar en true en el objeto de la aplicación –

+0

acordado, no hay necesidad de eso, no es que realmente importe ya que supongo que Application.MainForm no se asigna porque nunca se llama a Application.CreateForm. –

Cuestiones relacionadas