Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wann wird initialization von eingebundenen units aufgerufen? (https://www.delphipraxis.net/119867-wann-wird-initialization-von-eingebundenen-units-aufgerufen.html)

xineohp 2. Sep 2008 14:37


Wann wird initialization von eingebundenen units aufgerufen?
 
hi,

wann wird der initialization/finalization-Block von eingebundenen Units aufgerufen? Mir ist aufgefallen, dass die "Hauptdatei" (die Datei, die mit program bzw. library beginnt) keinen initialization/finalization-Block besitzt, dafür aber ein begin/end. Wenn ich jetzt also in die Hauptdatei eine Unit einbinde die einen initialization/finalization-Block hat, was wird zuerst aufgerufen? der initialization/finalization-Block der eingebundenen Unit oder der begin/end-Block der Hauptdatei? Insbesondere interessiert mich ob das bei DLLs irgendwie besonders/anders ist.

taaktaak 2. Sep 2008 14:43

Re: Wann wird initialization von eingebundenen units aufgeru
 
In der Reihenfolge, in der die Units eingebunden werden und vor dem begin..end der .dpr

Dezipaitor 2. Sep 2008 20:00

Re: Wann wird initialization von eingebundenen units aufgeru
 
Du kannst dich nicht auf irgendeine Reihenfolge verlassen. Diese Reihenfolge kann beim nächsten Release beliebig geändert werden.

jottkaerr 3. Sep 2008 07:11

Re: Wann wird initialization von eingebundenen units aufgeru
 
Die Reihenfolge der Abarbeitung der initialization-Abschnitte wird mit Sicherheit nicht mehr geändert werden. Sie ist nämlich dokumentiert, und es gibt viel zu viele Quelltexte, die sich darauf verlassen. Den auf eine solche Änderung folgenden Aufschrei, auch der eigenen Entwickler, will Embarcadero bzw. Codegear nicht hören.

jkr

Bernhard Geyer 3. Sep 2008 08:13

Re: Wann wird initialization von eingebundenen units aufgeru
 
Zitat:

Zitat von jottkaerr
Die Reihenfolge der Abarbeitung der initialization-Abschnitte wird mit Sicherheit nicht mehr geändert werden. Sie ist nämlich dokumentiert,

Quelle?

Zitat:

Zitat von jottkaerr
und es gibt viel zu viele Quelltexte, die sich darauf verlassen. Den auf eine solche Änderung folgenden Aufschrei, auch der eigenen Entwickler, will Embarcadero bzw. Codegear nicht hören.

Ich wüsste nicht wo in unserem Programm die Init-Reihenfolge der Units relevant wäre? Und da du ja nur auf globale Variablen von Units zugreifen kannst die du auch used ist auf jeden Fall in dieser Unit die initalisierung schon durchgeführt bevor irgendeine Quellcodezeile deiner Unit aufgerufen wird. Es gilt die Regel die taaktaak beschrieben hat.

jottkaerr 3. Sep 2008 08:43

Re: Wann wird initialization von eingebundenen units aufgeru
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von jottkaerr
Die Reihenfolge der Abarbeitung der initialization-Abschnitte wird mit Sicherheit nicht mehr geändert werden. Sie ist nämlich dokumentiert,

Quelle?


In der Delphi-5-Hilfe, besonders der zweite Absatz:

Zitat:

Zitat von Delphi-Hilfe
Der initialization-Abschnitt

Der initialization-Abschnitt ist optional. Er beginnt mit dem reservierten Wort initialization und endet mit dem Beginn des finalization-Abschnitts oder - wenn kein finalization-Abschnitt vorhanden ist - mit dem Ende der Unit. Der initialization-Abschnitt enthält Anweisungen, die beim Programmstart in der angegebenen Reihenfolge ausgeführt werden. Arbeiten Sie beispielsweise mit definierten Datenstrukturen, können Sie diese im initialization-Abschnitt initialisieren.

Die initialization-Abschnitte von Units, die von Clients eingebunden werden, werden in der Reihenfolge ausgeführt, in der die Units in der uses-Klausel des Clients angegeben sind.

Mit Clients sind Units und DPR-Dateien gemeint, die andere Units einbinden.

Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von jottkaerr
und es gibt viel zu viele Quelltexte, die sich darauf verlassen. Den auf eine solche Änderung folgenden Aufschrei, auch der eigenen Entwickler, will Embarcadero bzw. Codegear nicht hören.

Ich wüsste nicht wo in unserem Programm die Init-Reihenfolge der Units relevant wäre?

Wenn eine Unit ein globales Objekt bereitstellt, z.B. ein Singleton, muss sichergestellt sein, dass dieses Objekt auch in initialization-Abschnitten von Units, die eben diese Unit einbinden, schon existiert. Das lässt sich nur über eine definierte Abarbeitungsreihenfolge der initialization-Abschnitte erreichen. (Oder durch eine on-the-fly-Erstellung des Singletons. Durch die o.g. Regel kann man sich aber das dazu notwendige Überprüfen, ob das Objekt bereits erzeugt wurde, sparen, wenn das Objekt sowieso in den meisten oder fast allen Fällen benötigt wird.)

Zitat:

Zitat von Bernhard Geyer
Und da du ja nur auf globale Variablen von Units zugreifen kannst die du auch used ist auf jeden Fall in dieser Unit die initalisierung schon durchgeführt bevor irgendeine Quellcodezeile deiner Unit aufgerufen wird. Es gilt die Regel die taaktaak beschrieben hat.

Habe ich dem irgendwo widersprochen? Ich bezog mich nur auf die Aussage von Christian.

jkr

alzaimar 3. Sep 2008 08:47

Re: Wann wird initialization von eingebundenen units aufgeru
 
Zitat:

Zitat von Bernhard Geyer
...Quelle?

Zitat:

Zitat von Delphi6-Hilfe
The initialization sections of units used by a client are executed in the order in which the units appear in the client’s uses clause.

Zitat:

Zitat von BDS 2006-Hilfe
Der initialization-Abschnitt
...
Für Units in der uses-Liste von Interfaces werden die von einem Client verwendeten initialization-Abschnitte von Units in der Reihenfolge ausgeführt, in der Units in der uses-Klausel des Clients aufgeführt sind.


Bernhard Geyer 3. Sep 2008 08:57

Re: Wann wird initialization von eingebundenen units aufgeru
 
Zitat:

Zitat von jottkaerr
Zitat:

Zitat von Bernhard Geyer
Und da du ja nur auf globale Variablen von Units zugreifen kannst die du auch used ist auf jeden Fall in dieser Unit die initalisierung schon durchgeführt bevor irgendeine Quellcodezeile deiner Unit aufgerufen wird. Es gilt die Regel die taaktaak beschrieben hat.

Habe ich dem irgendwo widersprochen? Ich bezog mich nur auf die Aussage von Christian.

Ok, dann habe ich dich mißverstanden. Ich denke aber auch das sich Christians aussage darauf bezieht das mit einem neuen Delphi z.B. SysUtils früher als Types initialisert wird weil sich in der VCL die Uses-Reihenfolge geändert hat. Das sollte aber zu 99,99% jedem Delphi-Entwickler egal sein da durch seine Uses-Anweisungen seine Initalisation-Abschnitte erst aufgerufen werden wenn sowohl SysUtils als auch Types initalisiert sind, egal in welcher Reihenfolge.


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf