![]() |
Package - Unit.Initialization - Reihenfolge
Ich erstelle im Initializationsteil einer Unit (UnitA) eine Liste, in der ich erzeugte Instanzen einer Klasse verwalte.
In einer anderen Unit-Initalisierung (UnitB) erstelle ich solch eine Instanz. Wie kann ich es erreichen, dass UnitA (beide sind in einem gemeinsamen Package) IMMER zuerst initialisiert wird? In einem anderen Beitrag (die Frage betraf aber Lazarus) hat himitsu geschrieben: Zitat:
Ich habe UnitA in der interface Uses-Liste von UnitB aufgenommen. Auch habe ich testweise im initialization-Teil von UnitB
Delphi-Quellcode:
aufgenommen.
TMyClass.Create(nil).Free
Damit dachte ich, UnitA.Initialization erzwingen zu können. Die Klasseninstanz wird zwar erzeugt, die Unit-Initialisierung aber (noch) nicht aufgerufen. |
AW: Package - Unit.Initialization - Reihenfolge
... geht nicht, oder?
|
AW: Package - Unit.Initialization - Reihenfolge
Zitat:
|
AW: Package - Unit.Initialization - Reihenfolge
Bevor ich krampfhaft versuchen würde, die Reihenfolge "vorherzusehen", würde ich den Zugriff auf die Instanz über eine Methode kapseln (ob die Syntax so in Delphi XE geht, weiß ich nicht - aber ich denke, es sollte klar sein)
Delphi-Quellcode:
unit UnitA;
type MyInstances = class private class var FInstance : MyInstances; protected class function GetInstance: MyInstance; public class property Instance : MyInstances read GetInstance; procedure RegisterInstance(AInstance: TObject); end; class function MyInstances.GetInstance: MyInstance; begin // check if global instance variable is initialized if MyInstance.FInstance = nil then // not initialized, so create MyInstance.FInstance := MyInstance.Create; result := MyInstance.FInstance; end; procedure MyInstances.RegisterInstance(AInstance: TObject); begin // do sth. with AInstance end; initialization // nothing needed here finalization // clean up MyInstances.FInstance.Free;
Delphi-Quellcode:
unit UnitB;
uses UnitA; procedure Test; begin MyInstances.Instance.RegisterInstance(TObject.Create); end; |
AW: Package - Unit.Initialization - Reihenfolge
Solche heiklen Probleme löse ich in der Regel auf folgende Art:
Delphi-Quellcode:
Das heißt, die Liste wird dann erstellt, wenn sie das erste Mal gebraucht wird, und nicht, wenn das Delphi für richtig hält.
interface
function MeineListe: TMeineListe; implementation var FMeineListe: TMeineListe = nil; function MeineListe: TMeineListe; begin if not assigned(FMeineListe) then FMeineListe:=TMeineListe.Create; Result:=FMeineListe; end; finalization FreeAndNil(FMeineListe); end. Da der Zeitpunkt des Aufräumens meist weniger kritisch ist, kann das im finalization-Abschnitt erfolgen. Das ist wahrscheinlich das, was ![]() |
AW: Package - Unit.Initialization - Reihenfolge
Ok danke.
Die alternativen Umsetzungen sind schon klar, ich wollte halt mal wissen, ob ich die Möglichkeit einer Intitialisierungsreihenfolge nur übersehen habe. Himitsu hatte ja angedeutet, dass das gehen müsste (wie bei den Formularen im Projekt). Dann eben nicht... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz