![]() |
Komponenten initialisieren
Hallo!
Manchmal ist es doch so, dass man beim Programmstart bestimmte Eigenschaften von Komponenten initialisiert. Diese Eigenschaften rufen aber Methoden auf, die beim Programmstart noch nicht ausgeführt werden dürfen. Also ich hab gerade zum Beispiel eine Scrollbar. Ich möchte beim Programmende die alte ScrollBar.Position speichern und beim Programmstart wiederherstellen. Dabei wird aber ScrollBar.OnChange() ausgelöst und dadurch krieg ich dann beim Start einen Fehler, weil OnChange() auf Variablen zugreift, die zu dem Zeitpunkt noch nicht initialisiert sind. Wie macht man das am geschicktesten? Ich kann jetzt eine globale Variable "Startup: Boolean" benutzen, die nur beim Programmstart True ist. Und dann muss ich in jede Methode, die solch ein Problem hat "if not Startup then begin [...] end" schreiben. Gibt es da vielleicht eine schönere Lösung? Grüße blablab |
AW: Komponenten initialisieren
Wann musst du denn spätestens die Scrollbar-Eigenschaft gesetzt haben?
Wenn die Form angezeigt wird - also macht man das im OnShow Event ;) |
AW: Komponenten initialisieren
Zitat:
|
AW: Komponenten initialisieren
Zitat:
|
AW: Komponenten initialisieren
Hmmm,
Delphi-Quellcode:
wird ja wesentlich häufiger als
OnActivate
Delphi-Quellcode:
gefeuert
OnShow
|
AW: Komponenten initialisieren
Zitat:
Delphi-Quellcode:
Manche Initialisierungen machten in OnShow Probleme, weil zu diesem Zeitpunkt noch nicht alle Units verfügbar sind, wie mir scheint. Daher mache ich seit Jahren alles in OnActivate. Siehst du darin ein Problem?
if not StartModus then exit;
|
AW: Komponenten initialisieren
Es gibt dann ein Problem, wenn die Form nicht aktiviert wird. Ist allerdings wohl mehr theoretisch, denn um das zu bewerkstelligen, muss man die Create-Parameter der Form entsprechend anpassen :)
BTW Bei OnShow sind alle Units da, aber die Form u.U. noch nicht sichtbar und das macht teilweise Probleme |
AW: Komponenten initialisieren
Zitat:
Ich kann's jetzt gerade nicht ausprobieren, weil auf meinem Entwicklungsrechner gerade ein Virenscan läuft, den ich nicht unterbrechen möchte – aber soweit ich mich erinnere, lassen sich auch Datenbank-Komponenten im Datenmodul nicht fehlerlos zum OnCreate-Zeitpunkt initialisieren. |
AW: Komponenten initialisieren
OnCreate (alt), OnCreate (neu), OnShow und OnActivte...
OnCreate (OldCreateOrder) wurde direkt im TForm.Constructor ausgelöst, also kurz nachdem die Form erstellt und die DFM geladen wurde OnCreate (NewCreateOrder) wird im TFormAfterConstruction ausgelöst, also nachdem alles erstellt wurde (eigentlich sollte man hier alles initialisieren, außer es gibt wirklich Probleme) OnShow wird kurz vor dem Anzeigen ausgeführt, aber unmittelbar vor dem ersten OnActivate, wenn die Form mit Visible=True erstellt/geladen wurde OnActivte wird jedesmal ausgeführt, wenn die Form den Eingabefokus bekommt und wenn die Form schon sichtbar ist. Es kann unter Umständen stören, wenn sich wärend des Arbeitens (Form bekommt Fokus) und auch wärend des Ladens (kurz danach, aber optisch dazugehörend) sich die Form nochmals verändert. OnTimer, der im OnCreate aktiviert und beim ersten Aufruf wieder deaktiviert wird: entweder "kurz" nach dem OnActivate und auch, wenn die Form nicht sichtbar ist, aber nachdem definitiv alles geladen wurde (außer jemand pfuscht mit Application.ProcessMessages rum) |
AW: Komponenten initialisieren
Mit folgendem Ansatz kann man ziemlich sicher sein, daß das Form sichtbar ist und der Init-Code nur einmal aufgerufen wird.
Delphi-Quellcode:
const
WM_INITIALIZE = WM_USER + 1; type TForm177 = class(TForm) procedure FormCreate(Sender: TObject); protected procedure WMInitialize(var Message: TMessage); message WM_INITIALIZE; public end; ... procedure TForm177.FormCreate(Sender: TObject); begin ... PostMessage(Handle, WM_INITIALIZE, 0, 0) ... end; procedure TForm177.WMInitialize(var Message: TMessage); begin inherited; { hier Initialisierungscode } end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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 by Thomas Breitkreuz