Twoje rozwiązanie jest całkowicie uzasadnione. Mam dodatek Excel COM, który robi coś bardzo podobnego. W tym kodzie ustawiłem Application.Handle w bibliotece DLL na uchwyt okna głównego okna programu Excel. To jest analogiczne do tego, co robisz.
Problem polega na tym, że trzeba prawidłowo ustawić prawa własności do okna. Potrzebujesz łańcucha własności, by dotrzeć do głównej formy aplikacji. Formularze w bibliotece DLL nie mają wiedzy o tym, jaka jest główna forma, więc musisz podać tę wiedzę.
Należy zauważyć, że mówię o koncepcji właściciela okna używanej przez system Windows, a nie o koncepcji właściciela VCL, która jest zupełnie inna. W terminologii VCL jest to znane jako wyskakujący rodzic i można rozwiązać problem, jawnie ustawiając wyskakujący rodzic formularza DLL, który ma być główną postacią. Odpowiednie właściwości to PopupMode i PopupParent. W przypadku formularzy, które znajdują się w głównej aplikacji, VCL naturalnie sprawi, że ich wyskakujący rodzic będzie główną postacią.
Jednakże, mówiąc o wyraźnym ustawieniu wyskakującego rodzica, chciałbym podkreślić, że twoje obecne rozwiązanie jest prostsze i wygodniejsze.
Rozwiązaniem obu tych rozwiązań jest upewnienie się, że wszystkie formularze pomocnicze są własnością formularza głównego. Oznacza to, że formularze te są zawsze na wierzchu głównej formy. Oznacza to, że formularze pomocnicze zostaną zminimalizowane, jeśli główna forma zostanie zminimalizowana. Przeczytaj o posiadanych oknach tutaj: Window Features.
Nawiasem mówiąc, jeśli korzystałeś z pakietów runtime zamiast z DLL, kod w pakiecie byłby połączony z tym samym VCL, co formularz główny. Tak więc kod pakietu byłby w stanie zobaczyć główny formularz i odpowiednio ustawić właściciela okna. Jest to z pewnością jedną z zalet używania pakietów. Oczywiście może istnieć dobry powód, dla którego musisz używać bibliotek DLL zamiast pakietów.
Dzięki za to. Zastanawiam się tylko, czy muszę ustawić właściwość MainFormOnTaskBar na true w obiekcie aplikacji zawartym w bibliotece DLL? –
Ponieważ obiekt aplikacji w bibliotece DLL nie ma głównej formy, domyślam się, że nie musimy lub nie powinniśmy ustawiać MainFormOnTaskBar na wartość true w obiekcie aplikacji –
, nie ma takiej potrzeby, nie ma to znaczenia ponieważ przypuszczam, że Application.MainForm nie jest przypisany, ponieważ nigdy nie wywołuje Application.CreateForm. –