Hallo zusammen,
irgendwie verstehe ich die Welt nicht mehr
Ich habe eine Applikation in viele Dlls aufgeteilt, welche an TabSheets an der Mainform angedockt werden (CreateParented).
Das funktioniert soweit so gut. Nun habe ich eine
DLL, welche selbst ein weiteres Formular an ein Panel andockt. Wenn diese
DLL geladen ist, wird beim Schließen der Applikation ein Fehler ausgeworfen: Im Projekt ... ist eine
Exception der Klasse EOSError mit der Meldung 'Systemfehler', Code 1400. Ungültiges Fensterhandle aufgetreten.
Beim Debuggen stelle ich fest, dass beim Beenden des Programmes das OnClose-Ereignis in den
DLL-Forms NICHT ausgelöst wird.
Alles andere funktioniert wirklich gut, nur halt gibt es bei einer Form (sie sind alle gleich) das Problem mit dem ungültigen
Handle beim Schließen. - Diese Form erzeugt wieder selbst eine weitere (kleine) Form, welche mittels ... parent = Panel1 angedockt wird.
Und das Wundersame ist, dass in den Dlls das OnClose nicht ausgelöst wird!
Gruss
mcinternet
Tue Dir einen Gefallen und verwende packages, nicht DLLs. Anyway: wenn Du eine Form nicht als top-level window verwendest, sondern sie in ein child window (control) verwandelst, ändert sich einiges in der Art der messages, die das Form im gedockten Zustand bekommt. Dadurch funktionieren einige der events nicht mehr, da das Form einfach die messages nicht mehr bekommt, die den event auslösen (OnClose ist so ein Fall). Das wird noch verschärft, wenn Du ein Form mit CreateParented an einen Parent bindest und nicht durch setzten der Parent-Eigenschaft. Dadurch wird einiges umgangen, was die
VCL sonst bei der Verwaltung von Controls macht, z. B. werden nicht mehr alle der
VCL-internen messages, die von der message loop in TApplication.Run erzeugt werden, an das eingebettete Form und seine Controls weitergegeben.
Alles in allem ist dein Ansatz grundlegend falsch (sorry). Forms sind nicht dafür gedacht, als Controls irgendwo eingebettet zu werden; dafür gibt es Frames. CreateParented sollte nur verwendet werden, wenn man ein Delphi-Control in ein nicht-
VCL Control einbetten will. Und diese ganze Verteilerei von UI-Elementen auf verschiedenen Module (plug-in Architektur) ist zwar durchaus ein gutes Design für manche Anwendungen, aber es funktioniert nur mit Packages vernünftig, da nur dadurch eine vollständige Integration in die Hostanwendung möglich wird. Bei DLLs ist das nicht im gleichen Maße gegeben, auch wenn man alle Module mit
run-time packages baut.
Egal ob man DLLs oder packages verwendet, für diese Art der Integration hat man immer noch die Notwendigkeit, das alle Module mit der gleichen Delphi-Version kompiliert werden müssen.
Es geht zwar auch anders, aber dann muss man eine andere Architektur verwenden, die es einerseits möglich macht, die plug-ins völlig unabhängig von der Hostanwendung zu halten (keine gemeinsame
RTL oder
VCL oder memory manager), und andererseits die Elemente nachflickt, die für eine reinbungslose Kommunikation von Host und Plugin notwendig sind (alle Interaktion geht über
COM-kompatible Interfaces oder windows messages). Das ist nicht nur ein ziemlicher Aufwand, den man allerdings nur einmal betreiben muss (Stichwort Plug-in framework), sonder erfordert auch wirklich detailierte Kenntnisse darüber, wie die
VCL solche Sachen wie Tab order, keyboard shortcuts, action configuation etc. realisiert, damit man sicherstellen kann, dass das alles auch für die eingebetteten Plugins funktioniert, auch wenn sie mit einer anderen
VCL-Version gebaut wurden.