AGB  ·  Datenschutz  ·  Impressum  







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

Package - Unit.Initialization - Reihenfolge

Ein Thema von stahli · begonnen am 6. Mär 2011 · letzter Beitrag vom 10. Mär 2011
Antwort Antwort
Benutzerbild von stahli
stahli

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

Package - Unit.Initialization - Reihenfolge

  Alt 6. Mär 2011, 16:46
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 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
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 6. Mär 2011 um 17:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Package - Unit.Initialization - Reihenfolge

  Alt 10. Mär 2011, 12:10
... geht nicht, oder?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Package - Unit.Initialization - Reihenfolge

  Alt 10. Mär 2011, 12:20
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#4

AW: Package - Unit.Initialization - Reihenfolge

  Alt 10. Mär 2011, 12:21
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;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Package - Unit.Initialization - Reihenfolge

  Alt 10. Mär 2011, 12:30
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.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (10. Mär 2011 um 12:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Package - Unit.Initialization - Reihenfolge

  Alt 10. Mär 2011, 19:28
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...
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 21:09 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