[Gelöst] Kommunikation von Singleton zu Splashscreen

Rund um die LCL und andere Komponenten
Antworten
charlytango
Beiträge: 218
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

[Gelöst] Kommunikation von Singleton zu Splashscreen

Beitrag von charlytango »

Hi!

Die Hürde zu den Singleton-Objekten hab ich scheinbar gemeistert. Nun stellt sich die Frage wie man Meldungen der in der Applikation nötigen Singleton-Objekte (z.B. Datenbankanbindung, Laden diverser Einstellungen etc) auf einer Splashscreen anzeigen kann.

Irgendwie bekomme ich die Infos schon angezeigt, aber ich möchte die SingletonObjekte auch in anderen Applikationen verwenden, die keine SplashScreen haben. Und daher suche ich nach einer Lösung möglichst ohne die Units mittels uses-Klausel zu "verheiraten".

Damit es nicht zu einfach wird, habe ich eine Unit uGlobalInit erstellt, in der die Singleton-Objekte zu einem bestimmten Zeitpunkt in bestimmter Reihenfolge erstellt und zerstört werden sollen. Ich möchte das nicht dem Compiler und meiner Schlampigkeit bei der uses-Reihenfolge überlassen.

Code: Alles auswählen

unit uGlobalInit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, uSingleton;
 
procedure MyGlobalInit;
procedure MyGlobalDeInit;
 
implementation
 
procedure MyGlobalInit;
begin
  Settings;  //Erzeugt das Singleton Objekt für Einstellungswerte
  //Hier würde ich gerne Informationen von den Singleton-Objekten an die Splashscreen schicken
end;
 
procedure MyGlobalDeInit;
begin
  Settings.Free;
end;
 
end.


Irgendwie spukt mir da das Schlagwort Interface im Kopf rum (ohne zu wissen ob es der richtige Weg ist), aber trotz Recherche bekomme ich das nicht elegant auf die Reihe. Bitte um Hilfe oder leichte Schläge auf den Denkapparat ;)

project1.zip
Testprojekt zu Singleton und Splashscreen
(127.19 KiB) 39-mal heruntergeladen
Zuletzt geändert von charlytango am Fr 22. Feb 2019, 10:11, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 728
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Kommunikation von Singleton zu Splashscreen

Beitrag von fliegermichl »

Nimm doch einfach Events.

Dein Splashscreen besetzt fOnInitChange mit einer entsprechenden Procezedur.


Code: Alles auswählen

 
type
 TInitChangeEvent = procedure(Sender : TObject; State : integer) of object;
 
var
 fOnInitChange : TInitChangeEvent;
 
procedure TMyClass.GlobalInit;
var Done : integer;
begin
 Done := 0;
 if Assigned(fOnInitChange) then fOnInitChange(self, Done);
 ...
 if Assigned(fOnInitChange) then fOnInitChange(self, Done);
 ...
 if Assigned(fOnInitChange) then fOnInitChange(self, Done);
end;
 

charlytango
Beiträge: 218
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Kommunikation von Singleton zu Splashscreen

Beitrag von charlytango »

[quote="fliegermichl"]Nimm doch einfach Events.
Dein Splashscreen besetzt fOnInitChange mit einer entsprechenden Procezedur.
[code=laz] 

Danke f den Hinweis, so "einfach" wars dann f mich doch nicht, ich konnte allerdings eine flexible und zufriedenstellende Lösung erreichen.

ich wollte das .lpr file nicht zumüllen und die nötigen Singletons in einer Prozedur kontrolliert starten. Trotzdem sollten die Singleton-Objekte bei Vorghandensein einer Splashscreen ihre Messages auf der Splashscreen anzeigen oder auch ohne Splashscreen funktionieren. Das Empfohlene Event ist daher in die Singleton-Objekte gewandert.

Wen es Interessiert und wer es brauchen kann findet meine Lösung ohne Gewähr in der beigefügten .ZIP Datei
Dateianhänge
project1.zip
Lösung ohne Gewähr
(127.49 KiB) 34-mal heruntergeladen

Antworten