Für Objekte, die ich von vielen verschiedenen Programmteilen aus brauche und die nur einmal vorhanden sein sollen, verwende ich normalerweise Singletons. Die werden erzeugt, wenn man das erste mal auf Sie zugreift und existieren bis zum Programmende. In Delphi kann man das z.B. folgendermassen realisieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| interface
type TMeinDatenmodul = class(TDataModule) ... public class function Shared(): TMeinDatenmodul; end;
implementation
var GMeinDatenmodul : TMeinDatenmodul;
class function TMeinDatenmodul.Shared() : TMeinDatenmodul; begin if not Assigned(GMeinDatenmodul) then begin GMeinDatenmodul := TMeinDatenmodul.Create(nil); end; Result := GMeinDatenmodul; end;
...
initialization GMeinDatenmodul := nil; finalization FreeAndNil(GMeinDatenmodul); end. |
Verwenden kannst du das Ding dann mit
Delphi-Quelltext
1:
| TMeinDatenmodul.Shared.ProzedurXY; |
Beim ersten Aufruf von TMeinDatenmodul.Shared wird das Datenmodul erzeugt, danach wird immer das erzeugte Datenmodul zurückgegeben. Bei Programmende wird
das Datenmodul durch den finalization-Teil der Unit freigegeben. Delphi sorgt dafür, das finalization-Abschnitte in der richtigen Reihenfolge aufgerufen werden.
Stefan