Delphi XE2 назначает Application.MainForm.Handle для Application.Handle внутри DLL - PullRequest
6 голосов
/ 01 марта 2012

У меня есть небольшая проблема с формами, которые создаются внутри DLL.

В основном, что происходит, когда форма (Form1) из DLL показывает (я думаю, что это должно быть на вершине)и вы открываете другую форму (Form2), которая является частью основного приложения (то есть не живет внутри DLL).Если навести курсор на элемент управления в форме Form2, чтобы отобразить подсказку, Form2 сразу же перейдет за форму Form1.

Это происходит только с MainFormOnTaskBar, значение true.В данный момент мы передаем Application.Handle основного приложения в DLL и назначаем его в Application.Handle DLL.

Мне удалось решить эту проблему, вместо этого передав Application.MainForm.Handle в DLL.быть назначенным на Application.Handle в DLL.

Это безопасно?Кто-нибудь знает правильный способ решения этой проблемы?

1 Ответ

5 голосов
/ 01 марта 2012

Ваше решение вполне разумно.У меня есть надстройка Excel COM, которая делает что-то очень похожее.В этом коде я установил Application.Handle в DLL как дескриптор главного окна Excel.Это аналогично тому, что вы делаете.

Проблема в том, что вам нужно правильно установить владельца окна.Вам нужна цепочка владения, чтобы вернуться к основной форме вашего приложения.Формы в DLL не знают, что такое основная форма, и поэтому вы должны предоставить эти знания.

Обратите внимание, что я говорю о концепции владельца окна, используемой в Windows, а не о концепции VCLвладелец, который совершенно другой.В терминологии VCL это известно как родитель всплывающего окна, и вы можете решить свою проблему, явно указав родительский файл всплывающего окна формы DLL в качестве основной формы.Соответствующими свойствами являются PopupMode и PopupParent.Для форм, которые живут в основном приложении, VCL естественным образом сделает их родителем всплывающего окна главной формой.

Однако, поговорив об явной установке родителя всплывающего окна, я бы подчеркнул, что ваше текущее решение проще и болееудобно.

Что оба эти решения делают, чтобы убедиться, что все вспомогательные формы принадлежат основной форме.Это означает, что эти формы всегда находятся над основной формой.Это означает, что вспомогательные формы будут минимизированы, если основная форма минимизирована.Прочитайте о собственных окнах здесь: Особенности окна .

Кстати, если бы вы использовали пакеты времени выполнения, а не DLL, код в пакете был бы подключен к тому же VCL, что и основнойформа.Таким образом, упакованный код сможет увидеть основную форму и правильно установить владельца окна.Это, безусловно, одно из преимуществ использования пакетов.Конечно, вполне может быть веская причина, по которой вам нужно использовать библиотеки DLL, а не пакеты.

...