2012-03-01 12 views
6

Mam mały problem z formularzami, które są tworzone z wewnątrz DLL.Delphi XE2 przypisywanie Application.MainForm.Handle do Application.Handle wewnątrz DLL

Zasadniczo dzieje się, gdy pojawi się formularz (Form1) z biblioteki dll (myślę, że musi być na górze) i otwiera się inny formularz (Form2), który jest poza główną aplikacją (np. wewnątrz biblioteki DLL). Jeśli umieścisz kursor nad formantem Form2, aby wskazówka była wyświetlana, Form2 natychmiast przejdzie do Form1.

Dzieje się tak tylko przy wartości MainFormOnTaskBar jest prawdą. W tym momencie przekazujemy aplikację Application.Handle do biblioteki DLL i przypisujemy ją do Application.Handle biblioteki DLL.

Udało mi się rozwiązać problem, przekazując Application.MainForm.Handle do biblioteki DLL, która ma zostać przypisana do Application.Handle w bibliotece DLL.

Czy to jest bezpieczne? czy ktoś zna właściwy sposób rozwiązania tego problemu?

Odpowiedz

5

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.

+0

Dzięki za to. Zastanawiam się tylko, czy muszę ustawić właściwość MainFormOnTaskBar na true w obiekcie aplikacji zawartym w bibliotece DLL? –

+0

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 –

+0

, nie ma takiej potrzeby, nie ma to znaczenia ponieważ przypuszczam, że Application.MainForm nie jest przypisany, ponieważ nigdy nie wywołuje Application.CreateForm. –

Powiązane problemy