Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#1

class procedure, Singleton oder Instanz?

  Alt 21. Apr 2013, 16:43
Ich habe ein recht schwierig zu beschreibendes Problem.

Für mein Framework habe ich 2 Manager erstellt.

Zunächst einen BusinessLogic-Manager (BLManager), von dem im Projekt eine Instanz erzeugt werden soll.
Dieser erzeugt und verwaltet Businessobjekte in Listen und gibt die heraus.

Für die GUI-Controls gibt es einen GUI-Manager. Dieser wird ohne Instanziierung über Klassenfunktionen genutzt.
Die GUI-Controls melden sich bei Ihrer Erstellung (bzw. Laden der Formulare) dort an.

Der BLManager informiert den GUIManager über Änderungen. Der GUI-Manager beauftragt dann die Controls, sich neu zu zeichnen.

Das funktioniert wunderbar (bisher nur unter FMX), aber wenn ich Änderungen im Framework vornehme und das Package neu installiere, kann es zu Problemen kommen (Laufzeitfehler in IDE), wenn ich den BLManager im Mainform instanziiert habe. Führer ich die Instanziierung erst im OnCreate des Mainforms durch, dann gibt es das Problem nicht. Allerdings ist es natürlich schicker, eine BLManager-Komponente im Formular zu haben.

Bild 1 zeigt den Ablauf wenn kein Formular in der IDE geöffnet war und Bild 2 das Problem.

Ich habe nun mal untersucht, wo das Problem entsteht und die Abläufe der uses initialization und finalization sowie der class constructoren und class destructoren gelogt.
Wenn ein Formular in der IDE geöffnet ist oder war wurde ein BLManager instanziiert. Beim Installieren des Packages werden die Komponenten kurz entfernt und dann neu erzeugt.
Den zeitlichen Ablauf kann man ja nicht beeinflussen. Ich habe auch den Eindruck, dass die IDE seit XE sensibler auf das Installieren eines verwendeten Packages reagiert.

Ich habe schon einmal versucht, statt der statischen Klasse TssGUIManager ein Singleton zu verwenden. Das hat jedoch nichts verbessert.

Nun überlege ich, innerhalb einer TBLManager-Instanz eine TGUIManager-Instanz zu erzeugen. Diese würde dann mit aufgelöst, wenn der BLManager aufgelöst würde.
Die Listen, in denen sich die Controls registrieren müssten aber weitere über Klassenfunktionen erreichbar sein.

Der Vorteil der jetzigen Lösung ist, dass der GUIManager auch ohne Instanziierung funktioniert und eine Datenbindung der GUI-Controls sozusagen im Hintergrund ermöglicht.

Ich weiß, das ist ein schwer nachvollziehbares Problem, aber vielleicht hat ja jemand doch einen grundsätzlichen Rat?
Miniaturansicht angehängter Grafiken
log.jpg   log-fehler.jpg  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat