Как создать дочернее окно MDI из библиотеки Delphi 5 ActiveX и внедрить его в родительский файл Delphi XE MDI?

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

фон

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

Проблема

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

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

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

какие идеи?


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

2 ответов


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

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

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

нажмите "Запустить Блокнот" после запуска приложения и посмотрите, что происходит.

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

обратите внимание, что необходимо убедиться, что ваш MDI-ребенок в библиотеке ActiveX полностью автономный.


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

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

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

в Хосте Delphi XE:

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

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

--jeroen