2010-12-10 75 views
7

Existe-t-il un moyen de créer une fenêtre enfant MDI à partir d'une DLL ActiveX écrite en Delphi 5 et de l'incorporer dans une fenêtre parent MDI créée à partir d'une application client Delphi XE Windows? Sinon, existe-t-il un moyen d'imiter le comportement?Comment créer une fenêtre enfant MDI à partir d'une DLL Delphi 5 ActiveX et l'intégrer dans un parent Delphi XE MDI?

Contexte

Il existe une application entièrement écrit en Delphi 5. La forme principale de l'application est une fenêtre parent MDI. Tous les autres formulaires de l'application sont des formulaires enfants MDI et chacun d'eux est créé à partir d'une bibliothèque ActiveX. L'application parente crée l'ActiveX, après quoi elle appelle une méthode de l'interface ActiveX. A partir de cette méthode, un formulaire est créé et FormStyle est défini sur fsMDIChild. À ce stade, le formulaire est un enfant MDI du parent MDI. Cela fonctionne parce que l'application et les bibliothèques ActiveX sont compilées à l'aide des packages d'exécution. Par conséquent, tous les formulaires partagent la même instance de TApplication.

Le problème

L'application est très importante, et doit être migré vers Delphi 2010 ou Delphi XE. Ce serait fantastique si l'application pouvait être migrée systématiquement, en migrant d'abord l'application, puis en migrant les bibliothèques ActiveX une à la fois (il y en a environ 50).

Le problème est que si l'application de la console est compilé dans XE, il ne sera plus en utilisant la même instance TApplication que ces bibliothèques encore compilées dans Delphi 5.

Même si les formulaires dans la bibliothèque ActiveX ne peut pas être vrai fenêtres enfant MDI, il semble que je devrais être capable de retourner le handle du formulaire qui est créé à partir de l'ActiveX et le récupérer du formulaire principal et faire apparaître le formulaire comme un enfant MDI. Je pourrais alors créer ma propre couche pour gérer les événements.

Des idées?


Mise à jour: L'approche actuellement utilisée pour cette application est la migration de MDI vers une interface SDI. Il est parfaitement possible d'instancier TForms à partir d'une DLL Delphi 5 ActiveX à partir d'une application Delphi XE, tant que le premier formulaire de chaque DLL peut prendre en charge ses propres données (chargement, enregistrement, affichage de formulaires supplémentaires, etc.). Le problème était de conserver la conception originale de MDI. Si la conception SDI s'avère acceptable, il n'y aura pas besoin d'une solution MDI. Pourtant, si quelqu'un sait comment réaliser la solution MDI, j'aimerais savoir.

+0

Vous pourriez peut-être intégrer les formes de la bibliothèque activex dans les formulaires enfants MDI créés dans l'application XE ... (re-parenting les formes activex dans les formes XE instancié - et ne pas changer le style de formulaire des formes activex) –

Répondre

4

À l'origine, j'ai dit que vous ne pouvez pas créer le faire. J'ai fait des recherches et j'ai découvert qu'il est possible de le faire. Vous devez être très prudent cependant.

est ici une source que j'ai créé récemment pour tester l'idée: http://cc.embarcadero.com/item/28168

Le code génère la calculatrice Windows et l'application Bloc-notes, puis MDIize les fenêtres externes dans le formulaire MDI.

Cliquez sur Lancer le bloc-notes après avoir démarré l'application et voir ce qui se passe.

Vous devriez être en mesure de modifier davantage le travail afin de pouvoir réaliser ce dont vous avez besoin.

Notez que vous devez vous assurer que votre enfant MDI dans la DLL ActiveX est entièrement autonome.

+0

La VCL est une structure située au-dessus de l'API Windows. Les formulaires Delphi eux-mêmes sont des fenêtres Windows, me font soupçonner qu'il est possible, évidemment avec un peu d'effort, non seulement d'afficher un Delphi TForm dans une fenêtre arbitraire, mais de communiquer entre la fenêtre principale et sa fenêtre incorporée. C'est ce que je cherche. –

+0

Oui, je sais que la VCL est un framework, j'ai été le support APAC pendant près de 3 ans ... Je dis juste que vous ne pouvez pas utiliser la VCL telle qu'elle est, pour faire ce que vous voulez actuellement. – chuacw

+0

@chuacw: Chee Wee! Il y a longtemps :-) Bienvenue ici. –

0

Même si les formulaires dans la bibliothèque ActiveX ne peuvent pas être vraies fenêtres de l'enfant MDI, il semble que je devrais être en mesure de retourner la poignée de la forme qui est créée à partir de l'ActiveX et saisir à partir La forme principale et faire le formulaire semblent être un enfant MDI. I pourrait alors créer ma propre couche pour les événements de gestion .

Je vais essayer quelque chose comme ça (inspiré par le commentaire de Marjan):
dans les Delphi 5 fenêtres MDI, diviser la fenêtre en deux couches pour chacune des formes:

  • un ensemble de Frameless TForms/TFrames ayant le contenu (exposer peut-être cela comme une forme ActiveX)
  • pour chaque contenu sans cadre, un enfant MDI qui gère le MDI

dans le Delphi XE hôte:

  • obtenir la poignée pour chacun des Delphi 5 TForms/TFrames sans cadre
  • Embed que la poignée dans un formulaire enfant MDI

Cela signifie probablement que vous devez dupliquer une partie de Delphi 5 Gestion des MDI dans Delphi XE.

--jeroen

+0

Jeroen. Merci d'avoir participé! J'ai considéré la suggestion de Marjan, mais cela semblait être un niveau de complexité supplémentaire. J'ai imaginé que le formulaire principal XE devrait simplement être capable de saisir le handle de la forme Delphi 5. Le projet que Chee Wee a localisé est exactement ce que je soupçonnais de pouvoir faire. Et il a raison à propos de l'enfant MDI qui a besoin d'être autosuffisant. J'imagine également que le parent MDI pourrait également envoyer des messages à l'enfant MDI. Je vais accepter sa réponse pour cette question particulière. –

+0

@Cary: vous êtes les bienvenus. +1 pour chuacw. –