2010-12-10 5 views
7

Gibt es eine Möglichkeit, ein untergeordnetes MDI-Fenster aus einer in Delphi 5 geschriebenen ActiveX-DLL zu erstellen und es in ein übergeordnetes MDI-Fenster einzubetten, das aus einer Delphi XE-Windows-Clientanwendung erstellt wurde? Wenn nicht, gibt es eine Möglichkeit, das Verhalten nachzuahmen?Wie erstelle ich ein untergeordnetes MDI-Fenster aus einer Delphi 5-ActiveX-DLL und bette es in einen Delphi XE MDI-Elternteil ein?

Hintergrund

Es ist eine Anwendung geschrieben vollständig in Delphi 5. Die wichtigste Form der Anwendung ist ein übergeordnetes MDI-Fenster. Alle anderen Formulare in der Anwendung sind untergeordnete MDI-Formulare und jedes einzelne Formular wird aus einer ActiveX-Bibliothek erstellt. Die übergeordnete Anwendung erstellt das ActiveX, nach dem eine Methode der ActiveX-Schnittstelle aufgerufen wird. Von dieser Methode wird ein Formular erstellt und es ist FormStyle auf fsMDIChild festgelegt. Zu diesem Zeitpunkt ist das Formular ein untergeordnetes MDI des übergeordneten MDI. Dies funktioniert, da sowohl die Anwendung als auch die ActiveX-Bibliotheken mithilfe von Laufzeitpaketen kompiliert werden. Daher haben alle Formulare dieselbe Instanz von TApplication.

Das Problem

Die Anwendung ist sehr groß, und muss Delphi 2010 oder Delphi XE migriert werden. Es wäre fantastisch, wenn die Anwendung systematisch migriert werden könnte, indem zuerst die Anwendung migriert wird und dann die ActiveX-Bibliotheken nacheinander migriert werden (es gibt ungefähr 50 davon).

Das Problem ist, dass, wenn die Konsolenanwendung in XE kompiliert wird, ist es nicht mehr die gleiche TApplication Instanz sein wird, mit wie diese Bibliotheken in Delphi kompiliert noch 5.

Auch wenn die Formen in der ActiveX-Bibliothek kann nicht sein, Wahre MDI-Unterfenster, es scheint, als ob ich in der Lage sein sollte, das Handle des Formulars zurückzugeben, das von dem ActiveX erstellt wird, und es aus dem Hauptformular zu ziehen, und das Formular scheint, ein MDI-Kind zu sein. Ich könnte dann meine eigene Ebene für die Behandlung von Ereignissen erstellen.

Irgendwelche Ideen?


Update: Der Ansatz zur Zeit mit dieser Anwendung genommen wird, ist, dass es von MDI auf eine SDI-Schnittstelle migriert wird. Es ist durchaus möglich, TForms von einer Delphi 5 ActiveX DLL aus einer Delphi XE-Anwendung zu instanziieren, solange das erste Formular von jeder DLL sich um ihre eigenen Daten kümmert (Laden, Speichern, Anzeigen zusätzlicher Formulare usw.). Das Problem bestand darin, das ursprüngliche MDI-Design beizubehalten. Wenn das SDI-Design akzeptabel ist, wird keine MDI-Lösung benötigt. Dennoch, wenn jemand weiß, wie man die MDI-Lösung erreicht, würde ich es gerne wissen.

+0

Sie könnten einbetten vielleicht die Formulare aus der ActiveX-Bibliothek in untergeordneten MDI-Formularen in der XE App erstellt ... (Re-Elternschaft der activex Formen in die XE instanziiert Formen - und nicht zu ändern Der Formularstil "activex forms" –

Antwort

4

Ursprünglich habe ich gesagt, dass Sie das nicht schaffen können. Ich recherchierte etwas mehr und fand heraus, dass es möglich ist. Sie müssen jedoch sehr vorsichtig sein.

Hier einige Quelle, die ich vor kurzem die Idee zu testen, erstellt: http://cc.embarcadero.com/item/28168

Der Code laicht den Windows-Rechner und Notizblock app, dann MDIize die externen Fenster in das MDI-Formular.

Klicken Sie nach dem Start der App auf "Launch Notepad" und sehen Sie, was passiert.

Sie sollten in der Lage sein, die Arbeit weiter zu modifizieren, damit Sie erreichen können, was Sie brauchen.

Beachten Sie, dass Sie sicherstellen müssen, dass Ihr MDI Child in der ActiveX-DLL vollständig eigenständig ist.

+0

Die VCL ist ein Framework, das über der Windows API liegt. Delphi-Formulare selbst sind Windows-Fenster, und ich vermute, dass es offensichtlich mit etwas Aufwand möglich ist, ein Delphi-TForm nicht nur in einem beliebigen Fenster anzuzeigen, sondern über die Windows-Nachrichtenwarteschlange zwischen dem Hauptfenster und dem eingebetteten Fenster zu kommunizieren. Das ist was ich suche. –

+0

Ja, ich weiß, dass die VCL ein Framework ist, ich war seit fast 3 Jahren der APAC-Support ... Ich sage nur, dass Sie die VCL nicht so verwenden können, wie Sie es derzeit tun. – chuacw

+0

@chuacw: Chee Wee! Vor langer Zeit :-) Willkommen hier. –

0

Auch wenn die Formen in der ActiveX Bibliothek nicht wahr MDI Kind Fenster sein können, so scheint es, wie ich Lage, wieder den Griff der Form sein sollte , die aus dem ActiveX und greifen erstellt wird es aus das Hauptformular und make das Formular scheint, ein MDI-Kind zu sein. I könnte dann meine eigene Schicht für Umgang mit Ereignissen erstellen.

ich so etwas wie dies versuchen würde (inspiriert von Marjan Kommentar):
in den Delphi 5 MDI-Fenster, spaltete die Fenster in zwei Schichten für jede der Formen:

  • eine Reihe von rahmenlos TForms/TFrames den Inhalt, die (vielleicht aussetzen dies als ActiveX-Formulare)
  • für jeden rahmenlos Inhalt, Kind eines MDI, das die MDI behandelt

im Delphi XE host:

  • den Griff für jede der rahmenlos Delphi 5 TForms/TFrames
  • einbetten, die
  • in einer MDI-Kind Form behandeln

Es wahrscheinlich bedeutet, dass Sie duplizieren Teil der Delphi erhalten 5 MDI-Handhabung in Delphi XE.

--jeroen

+0

Jeroen. Danke fürs Einspringen! Ich dachte über Marjans Vorschlag nach, aber es schien eine zusätzliche Stufe der Komplexität zu sein. Ich stellte mir vor, dass das XE-Hauptformular einfach in der Lage sein sollte, den Griff des Delphi 5-Formulars zu greifen. Das Projekt, das Chee Wee gefunden hat, ist genau das, was ich vermutete. Und er hat Recht damit, dass das MDI-Kind autark sein muss. Ich stelle mir auch vor, dass das MDI-Elternteil auch Nachrichten an das MDI-Kind senden könnte. Ich werde seine Antwort für diese spezielle Frage akzeptieren. –

+0

@Cary: Sie sind willkommen. +1 für chuacw. –

Verwandte Themen