Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: In DLLs wird kein OnClose ausgelöst?

  Alt 14. Apr 2019, 11:44
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.
Peter Below
  Mit Zitat antworten Zitat