Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Package - Unit.Initialization - Reihenfolge (https://www.delphipraxis.net/158879-package-unit-initialization-reihenfolge.html)

stahli 6. Mär 2011 16:46

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:

Die Punkte 1 und 2 sind z.B. Delphi zwar auch "unberechenbar", aber es steht definitiv fest, daß alle Units, welche im Interface eingebunden werden immer vor der Initialization initialisiert werden.
Nur bei Units, welche erst in der Implementation eingebunden werden, ist diesbezüglich keine Garantie festgelegt.
Ansonsten habe ich widersprüchliche Aussagen dazu gefunden.

Ich habe UnitA in der interface Uses-Liste von UnitB aufgenommen.
Auch habe ich testweise im initialization-Teil von UnitB
Delphi-Quellcode:
TMyClass.Create(nil).Free
aufgenommen.
Damit dachte ich, UnitA.Initialization erzwingen zu können.
Die Klasseninstanz wird zwar erzeugt, die Unit-Initialisierung aber (noch) nicht aufgerufen.

stahli 10. Mär 2011 12:10

AW: Package - Unit.Initialization - Reihenfolge
 
... geht nicht, oder?

BUG 10. Mär 2011 12:20

AW: Package - Unit.Initialization - Reihenfolge
 
Zitat:

Zitat von stahli (Beitrag 1086248)
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?

Eventuell könntest du alternativ beim ersten Erstellen einer Instanz die Verwaltung initialisieren.

littleDave 10. Mär 2011 12:21

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;

Thom 10. Mär 2011 12:30

AW: Package - Unit.Initialization - Reihenfolge
 
Solche heiklen Probleme löse ich in der Regel auf folgende Art:
Delphi-Quellcode:
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.
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.
Da der Zeitpunkt des Aufräumens meist weniger kritisch ist, kann das im finalization-Abschnitt erfolgen.

Das ist wahrscheinlich das, was BUG beschrieben hat.

stahli 10. Mär 2011 19:28

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 17:37 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