AGB  ·  Datenschutz  ·  Impressum  







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

unit initialisieren

Ein Thema von Berni68 · begonnen am 11. Mai 2010 · letzter Beitrag vom 14. Mai 2010
Antwort Antwort
Seite 2 von 2     12   
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#11

Re: unit initialisieren

  Alt 12. Mai 2010, 17:45
Zitat von jaenicke:
Was macht denn Lazarus da so anders als Delphi?
Weiss nicht so genau, aber eigentlich ist es auch egal.
Denn:
1.) es sind wahrscheinlich noch Initialization-Abschnitte anderer Units vorhanden, die noch nicht ausgeführt wurden
2.) die Reihenfolge in der die Initialization-Abschnitte ausgeführt werden lässt sich nicht zuverlässig und stabil bestimmen.
Man kann schon Einfluss nehmen über die Projektdatei aber das ist nicht zuverlässig;
man kann jederzeit aus Unachtsamkeit oder Unwissenheit die Reihenfolge ändern
3.) Application.Initialize wurde noch nicht aufgerufen


Daraus lassen sich folgende Schlüsse ziehen:
a.) man darf sich niemals darauf verlassen, dass andere Units schon initialisiert sind
b.) man darf im Initialization-Abschnitt nur Dinge tun, die keinerlei Nebenwirkungen haben
erlaubt wäre z.B. Zufallsgenerator mit Startwert belegen, Array mit Sinuswerten vorab berechnen
nicht erlaubt sind z.B. Aktionen, die in irgeneiner Art mit dem Benutzer in Kontakt treten
oder Code der potentiell eine Exception auslösen kann
c.) man sollte den Initialization-Abschnitt so gut wie möglich vermeiden, denn er kann nur mit globalen Variablen und globalen Resourcen arbeiten.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#12

Re: unit initialisieren

  Alt 12. Mai 2010, 17:53
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.

Da Lazarus/FPC angeblich eine "Nachmache" von Delphi ist und dieses Verhalten schon immer so sein dürfte, sollte sich FPC doch auch daran halten?
Ansonsten würde ich dieses als gravierenden Fehler einstufen.




Also ich hoffe mal der Fehler liegt bei Punkt 3, denn auch in Lazarus dürfte ShowMessage ein VCL-Formular kapseln
und die VCL wird über Application.Initialize erst richtig initialisiert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: unit initialisieren

  Alt 12. Mai 2010, 18:29
Application.Initialize wird normalerweise gar nicht gebraucht. Nur aus der Unit ComObj wird eine Initialisierungsmethode zum Beispiel eingetragen, das braucht man aber nur für COM. Rein mit der VCL hat das erst einmal nichts zu tun und man kann die Zeile (zumindest bei Delphi) einfach löschen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#14

Re: unit initialisieren

  Alt 12. Mai 2010, 20:14
Daß darin in Delphi nichts passiert, weiß ich schon, aber ich könnte diesbezüglich nichts über Lazarus sagen.

Aber wenn es nicht Punkt 3 ist, dann .... nja
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#15

Re: unit initialisieren

  Alt 14. Mai 2010, 14:58
Zitat von jaenicke:
Application.Initialize wird normalerweise gar nicht gebraucht. Nur aus der Unit ComObj wird eine Initialisierungsmethode zum Beispiel eingetragen, das braucht man aber nur für COM. Rein mit der VCL hat das erst einmal nichts zu tun und man kann die Zeile (zumindest bei Delphi) einfach löschen.
Ein kurzer Test durch Einfügen eines Application.Initialize vor dem init-Aufruf ergibt einen funktionierenden Dialog.
Ein kurzer Blick in das Application.Initialize ergibt, dass da durchaus einiges zum Start gemacht wird. Also eine LCL Anwendung am besten nie ohne diesen Aufruf starten.

Ich würde auf jeden Fall aber nicht empfehlen LCL-Code innerhalb eines initialization-Abschnittes anzufassen (genause wie man es nicht von einem anderem Thread sollte). Das gibt nichts als Ärger.

EDIT: Rechtschreibung

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:30 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