AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

class procedure, Singleton oder Instanz?

Ein Thema von stahli · begonnen am 21. Apr 2013 · letzter Beitrag vom 22. Apr 2013
Antwort Antwort
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 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
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: class procedure, Singleton oder Instanz?

  Alt 21. Apr 2013, 22:08
Also, die Trennung von des GuiManagers und des BLManager würde ich schon beibehalten?

Man so ins Blaue: Ich würde vermuten, daß im Falle der Komponente Events ausgelöst werden, die Teile der GUI betreffen, die aber noch nicht erzeugt sind (im Unterschied zu OnCreate (beim Erzeugen))?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

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

AW: class procedure, Singleton oder Instanz?

  Alt 22. Apr 2013, 20:32
Danke Bjoerk.

Ich werde es beim bisherigen Ansatz belassen.

Das Problem ist, dass sich schwer nachvollziehen lässt, wo es genau knallt.
Man kann zwar eigene Packages debugen, aber nicht deren Installation (jedenfalls kann ich das nicht).

Ich akzeptiere jetzt einfach als Einschränkung, dass der BLManager nicht zur Designtime in das Formular gesetzt werden darf wenn man noch am Framework arbeitet und dies ggf. neu installiert.
Statt dessen instanziiert man ihn im FormularCreate.
Delphi-Quellcode:
procedure TFormZipJob.FormCreate(Sender: TObject);
begin
  TZipJobBLManager.Create(Self);
end;
Dann gibt es das Problem nicht und es ist ja auch nicht wirklich mehr Arbeit.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz