Как мне создать дочернее окно MDI из DLL Delphi 5 ActiveX и внедрить его в родительский Delphi XE MDI? - PullRequest
7 голосов
/ 10 декабря 2010

Есть ли способ создать дочернее окно MDI из DLL ActiveX, написанной на Delphi 5, и встроить его в родительское окно MDI, созданное из клиентского приложения Windows Delphi XE? Если нет, есть ли способ имитировать поведение?

Фон

Существует приложение, полностью написанное на Delphi 5. Основной формой приложения является родительское окно MDI. Все остальные формы в приложении являются дочерними MDI-формами, и каждая из них создается из библиотеки ActiveX. Родительское приложение создает ActiveX, после чего вызывает метод интерфейса ActiveX. Из этого метода создается форма, и ее FormStyle устанавливается в fsMDIChild. На данный момент форма является дочерним элементом MDI родительского MDI. Это работает, потому что и приложение, и библиотеки ActiveX компилируются с использованием пакетов времени выполнения. В результате все формы используют один и тот же экземпляр TApplication.

Проблема

Приложение очень большое, и его необходимо перенести на Delphi 2010 или Delphi XE. Было бы здорово, если бы приложение можно было переносить систематически, сначала перенеся приложение, а затем перенося библиотеки ActiveX по одной (их около 50).

Проблема в том, что если консольное приложение скомпилировано в XE, оно больше не будет использовать тот же экземпляр TApplication, как те библиотеки, которые все еще скомпилированы в Delphi 5.

Даже если формы в библиотеке ActiveX не могут быть настоящими дочерними окнами MDI, кажется, что я должен иметь возможность вернуть дескриптор формы, созданной из ActiveX, извлечь ее из основной формы и заставить форму отображаться быть MDI ребенком. Затем я мог бы создать свой собственный слой для обработки событий.

Есть идеи?


Обновление. В настоящее время этот подход используется для переноса его из MDI в интерфейс SDI. Вполне возможно создать TForms из DLL-файла Delphi 5 ActiveX из приложения Delphi XE, при условии, что первая форма из каждой DLL может заботиться о своих собственных данных (загрузка, сохранение, отображение дополнительных форм и т. Д.). Проблема заключалась в сохранении оригинального дизайна MDI. Если проект SDI окажется приемлемым, не будет необходимости в решении MDI. Тем не менее, если кто-то знает, как реализовать решение MDI, я хотел бы знать.

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Изначально я сказал, что вы не можете создавать, делайте так. Я исследовал еще немного и обнаружил, что это возможно сделать. Вы должны быть очень осторожны, хотя.

Вот некоторый источник, который я недавно создал, чтобы проверить идею: http://cc.embarcadero.com/item/28168

Код порождает приложение «Калькулятор Windows» и «Блокнот», а затем MDIize внешние окна в форму MDI.

Нажмите Launch Notepad после запуска приложения и посмотрите, что произойдет.

Вы должны быть в состоянии изменить работу дальше, чтобы вы могли достичь того, что вам нужно.

Обратите внимание, что вам нужно убедиться, что ваш MDI Child в ActiveX DLL полностью автономен.

0 голосов
/ 16 декабря 2010

Даже если формы в библиотеке ActiveX не могут быть настоящими дочерними окнами MDI, похоже, что я должен иметь возможность вернуть дескриптор формы, созданной из ActiveX, извлечь ее из основной формы и сделатьФорма выглядит как ребенок MDI.Затем я мог бы создать свой собственный слой для обработки событий.

Я бы попробовал что-то вроде этого (вдохновленный комментариями Марьян):
в окнах Delphi 5 MDI, разделить окно на два слоядля каждой из форм:

  • набор безкадровых TForms / TFrames, имеющих содержимое (может быть, представить это как формы ActiveX)
  • для каждого безрамочного содержимого, один дочерний MDI, который обрабатываетMDI

в хосте Delphi XE:

  • получить дескриптор для каждого из бескаркасных TForms / TFrames Delphi 5
  • встраивать этот дескриптор в MDIдочерняя форма

Это, вероятно, означает, что вам придется дублировать часть обработки Delphi 5 MDI в Delphi XE.

- jeroen

...