2010-12-10 19 views
7

¿Existe alguna manera de crear una ventana secundaria MDI a partir de una DLL dll escrita en Delphi 5, y de incrustarla en una ventana principal MDI creada desde una aplicación cliente de Windows Delphi XE? Si no, ¿hay alguna manera de imitar el comportamiento?¿Cómo creo una ventana secundaria MDI desde un dll Delphi 5 ActiveX y la incrusto en un padre MDI Delphi XE?

Antecedentes

hay una aplicación escrita completamente en Delphi 5. La forma principal de la aplicación es una ventana MDI primario. Todos los demás formularios de la aplicación son formularios secundarios MDI, y cada uno de ellos se crea a partir de una biblioteca ActiveX. La aplicación principal crea el ActiveX, después de lo cual se llama a un método de la interfaz ActiveX. A partir de este método, se crea un formulario y su FormStyle se establece en fsMDIChild. En este punto, el formulario es un hijo MDI del padre MDI. Esto funciona porque tanto la aplicación como las bibliotecas ActiveX se compilan utilizando paquetes de tiempo de ejecución. Como resultado, todas las formas comparten la misma instancia de TApplication.

El problema

La aplicación es muy grande, y es necesario migrar a Delphi 2010 o Delphi XE. Sería fantástico si la aplicación se pudiera migrar sistemáticamente, migrando primero la aplicación y luego migrando las bibliotecas de ActiveX de a una por vez (hay alrededor de 50 de ellas).

El problema es que si la aplicación de consola se compila en XE, ya no va a utilizar la misma instancia TApplication como aquellas bibliotecas todavía compilados en Delphi 5.

Aunque las formas de la biblioteca ActiveX no pueden ser verdaderas ventanas hijas MDI, parece que debería ser capaz de devolver el identificador del formulario que se crea desde el ActiveX y tomarlo del formulario principal y hacer que el formulario parezca ser un MDI secundario. Entonces podría crear mi propia capa para manejar eventos.

¿Alguna idea?


Actualización: El enfoque que se está adoptando actualmente con esta aplicación es que se está migrando de MDI a una interfaz SDI. Es perfectamente posible instanciar TForms desde una DLL Delphi 5 ActiveX desde una aplicación Delphi XE, siempre que el primer formulario de cada DLL pueda encargarse de sus propios datos (cargar, guardar, mostrar formularios adicionales, etc.). El problema estaba en mantener el diseño original de MDI. Si el diseño de SDI resulta aceptable, no habrá necesidad de una solución de MDI. Aún así, si alguien sabe cómo lograr la solución MDI, me gustaría saberlo.

+0

tal vez podría integrar las formas de la biblioteca ActiveX en formularios MDI secundarios creados en la aplicación XE ... (re-crianza de los formularios ActiveX en las formas XE instancia - y no cambian el estilo de formulario de los formularios activex) –

Respuesta

4

Originalmente, dije que no puedes crearlo. Investigué un poco más y descubrí que es posible hacerlo. Tienes que tener mucho cuidado sin embargo.

Aquí hay alguna fuente que he creado recientemente para poner a prueba la idea: http://cc.embarcadero.com/item/28168

El código genera la Calculadora de Windows y la aplicación Bloc de notas, a continuación, MDIize las ventanas externas en el formulario MDI.

Haga clic en Iniciar el Bloc de notas después de iniciar la aplicación, y vea qué sucede.

Debería poder modificar el trabajo aún más para que pueda lograr lo que necesita.

Tenga en cuenta que debe asegurarse de que su MDI secundario en la DLL de ActiveX es totalmente independiente.

+0

El VCL es un marco que se encuentra en la parte superior de la API de Windows. Las propias formas de Delphi son ventanas de Windows, me hacen sospechar que es posible, obviamente con un poco de esfuerzo, no solo mostrar un TForm de Delphi en una ventana arbitraria, sino también comunicarse entre la ventana principal y su ventana incorporada, usando la cola de mensajes de Windows. Esto es lo que estoy buscando. –

+0

Sí, sé que el VCL es un framework, fui el soporte de APAC por casi 3 años ... Solo digo que no puedes usar el VCL como está, para hacer lo que quieras actualmente. – chuacw

+0

@chuacw: Chee Wee! Hace mucho tiempo :-) Bienvenido aquí. –

0

Aunque las formas de la biblioteca ActiveX no pueden ser verdaderos MDI niño ventanas, parece como si debiera ser capaz de devolver el mango de la forma que se crea desde el ActiveX y agarre desde el formulario principal y make el formulario parece ser un hijo MDI. I podría crear mi propia capa para el manejo de eventos .

me gustaría probar algo como esto (inspirado por el comentario de Marjan):
en las Delphi 5 ventanas MDI, dividir la ventana en dos capas para cada una de las formas:

  • un conjunto de sin marco TForms/TFrames que tienen el contenido (tal vez exponer esto como una forma de ActiveX)
  • para cada contenido sin marco, un niño que maneja el MDI MDI

en el Delphi XE host:

  • obtener el identificador para cada uno de los Delphi 5 sin marco TForms/TFrames
  • embed que manejan en un formulario secundario MDI

Probablemente significa que tiene que duplicar parte de la Delphi 5 Manejo de MDI en Delphi XE.

--jeroen

+0

Jeroen. Gracias por saltar! Consideré la sugerencia de Marjan, pero parecía un nivel adicional de complejidad. Imaginé que la forma principal XE debería ser capaz de agarrar el mango de la forma Delphi 5. El proyecto que Chee Wee localizó es exactamente lo que sospechaba que se podía hacer. Y tiene razón sobre que el niño MDI necesita ser autosuficiente. También me imagino que el padre MDI también podría enviar mensajes al niño MDI. Voy a aceptar su respuesta para esta pregunta en particular. –

+0

@Cary: de nada. +1 para chuacw. –