7

Delphi5で記述されたActiveXdllからMDI子ウィンドウを作成し、Delphi XE Windowsクライアントアプリケーションから作成されたMDI親ウィンドウに埋め込む方法はありますか?そうでない場合、動作を模倣する方法はありますか?

バックグラウンド

完全にDelphi5で記述されたアプリケーションがあります。アプリケーションの主な形式はMDI親ウィンドウです。アプリケーション内の他のすべてのフォームはMDI子フォームであり、それらはすべてActiveXライブラリから作成されます。親アプリケーションはActiveXを作成し、その後、ActiveXインターフェイスのメソッドを呼び出します。このメソッドからフォームが作成され、そのFormStyleがfsMDIChildに設定されます。この時点で、フォームはMDI親のMDI子です。これは、アプリケーションとActiveXライブラリの両方がランタイムパッケージを使用してコンパイルされるために機能します。その結果、すべてのフォームがTApplicationの同じインスタンスを共有します。

問題

アプリケーションは非常に大きいため、Delphi2010またはDelphiXEに移行する必要があります。最初にアプリケーションを移行し、次にActiveXライブラリを一度に1つずつ移行することで、アプリケーションを体系的に移行できれば素晴らしいと思います(約50個あります)。

問題は、コンソールアプリケーションがXEでコンパイルされている場合、Delphi5でコンパイルされているライブラリと同じTApplicationインスタンスを使用しなくなることです。

ActiveXライブラリのフォームを真のMDI子ウィンドウにすることができない場合でも、ActiveXから作成されたフォームのハンドルを返し、メインフォームから取得して、フォームをMDIの子。次に、イベントを処理するための独自のレイヤーを作成できます。

何か案は?


更新:このアプリケーションで現在採用されているアプローチは、MDIからSDIインターフェイスに移行されることです。各DLLの最初のフォームがそれ自体のデータ(追加のフォームのロード、保存、表示など)を処理できる限り、DelphiXEアプリケーションのDelphi5ActiveXDLLからTFormsをインスタンス化することは完全に可能です。問題は、元のMDI設計を維持することでした。SDI設計が受け入れ可能であることが証明されれば、MDIソリューションは必要ありません。それでも、誰かがMDIソリューションを実現する方法を知っているなら、私は知りたいです。

4

2 に答える 2

4

もともと、作成できないと言っていました。もう少し調べてみると、それが可能であることがわかりました。ただし、非常に注意する必要があります。

アイデアをテストするために最近作成したソースを次に示します。http://cc.embarcadero.com/item/28168

このコードは、Windows CalculatorとNotepadアプリを生成し、外部ウィンドウをMDIフォームにMDIします。

アプリの起動後に[メモ帳の起動]をクリックして、何が起こるかを確認します。

必要なことを達成できるように、作業をさらに変更できるはずです。

ActiveXDLLのMDI子が完全に自己完結型であることを確認する必要があることに注意してください。

于 2010-12-14T09:18:13.693 に答える
0

ActiveXライブラリのフォームを真のMDI子ウィンドウにすることができない場合でも、ActiveXから作成されたフォームのハンドルを返し、メインフォームから取得して、フォームをMDIの子。次に、イベントを処理するための独自のレイヤーを作成できます。

私はこのようなものを試してみます(Marjanのコメントに触発され
ました):Delphi 5 MDIウィンドウで、フォームごとにウィンドウを2つのレイヤーに分割します。

  • コンテンツを含むフレームレスTForms/TFrameのセット(おそらくこれをActiveXフォームとして公開します)
  • フレームレスコンテンツごとに、MDIを処理する1つのMDI子

Delphi XEホストの場合:

  • Delphi5フレームレスTForms/TFrameのそれぞれのハンドルを取得します
  • そのハンドルをMDI子フォームに埋め込みます

これはおそらく、DelphiXEでDelphi5MDI処理の一部を複製する必要があることを意味します。

--jeroen

于 2010-12-16T07:29:13.417 に答える