![]() |
Fensterposition persistent machen
Hallo!
Ich habe grad sowas wie ein Anfängerproblem bzw. steh wohl auf dem Schlauch ^^ Ich möchte die Größe, Position und WindowState eines Forms in einer Ini speichern und beim Programmstart wiederherstellen. Das Speichern klappt wunderbar, nur beim Wiederherstellen gibts Probleme. Zwar kann ich die gespeicherten Werte korrekt auslesen. Das mache ich im OnCreate des MainForm. BoundsRect und WindowState lassen sich hier problemlos setzen, aber nicht Left und Top. Die werden ignoriert und im Anschluss durch die Werte überschrieben, die in der DFM hinterlegt sind bzw. falls Position = poScreenCenter eingestellt ist, dann wird das Fenster zentriert. Eigentlich müsste ja schon das Zuweisen vom BoundsRect die Position verändern, aber auch da wird Left und Top ignoriert und wieder überschrieben. Selbst wenn ich das Zuweisen von Left und Top später mache, z.B. in einem OnShow/WM_AFTERSHOW-Konstrukt, ändert sich an dem Problem nichts. Wie lässt sich das lösen? Grüße Cody |
AW: Fensterposition persistent machen
Hallo,
Formactivate? |
AW: Fensterposition persistent machen
Ohne es ausprobiert zu haben: Versuche doch als letztes noch einmal
Delphi-Quellcode:
statt
OnActivate
Delphi-Quellcode:
.
OnShow
|
AW: Fensterposition persistent machen
Doppelt hält in dem Fall auch nicht besser. Wird dort genauso wieder überschrieben. Wenn ich ein ShowMessage an der Stelle einbaue, so rein zu Testzwecken WANN das Ereignis kommt, dann erscheint das Meldungsfenster immer noch bevor das Hauptfenster erscheint. Daher vermute ich, dass es auf die Zuweisung von Left und Top immer noch nicht spät genug erfolgt.
|
AW: Fensterposition persistent machen
Das funtioniert nur, wenn Position auf poDesigned steht.
Dann werden die von Dir gewünschten Werte genommen, andernfalls, die jeweils entsprechend zu berechnenden Werte. ScreenCenter widerspricht (in der Regel) nun mal Top 47 und Left 11. Was sollte bei der Einstellung poScreenCenter denn dann genommen werden: Die Bildschirmmitte oder 47 und 11? |
AW: Fensterposition persistent machen
Zitat:
ABER ja nach Position wird das zu unterschiedlichen Zeitpunkten ausgewertet ... Top/Left hier und Width/Height dort/dann. Probier da mal bissl rum (hab's jetzt nicht im Kopf), aber einige der Position werden "komplett" vor dem OnShow behandelt und schon kannst du alles im OnShow überschreiben. |
AW: Fensterposition persistent machen
Zitat:
|
AW: Fensterposition persistent machen
In meinen Programmen speichere ich schon seit Jahren die Position, Breite und Höhe (und vieles andere) in der Registry. Das geht analog auch in 'ner INI.
Es funktioniert nur, wenn Position auf poDesigned steht. Alles andere ist dauerhaft, über die Jahre und Delphiversionen, gescheitert. Wenn Du die Position selbst bestimmen willst, ist es doch nicht erforderlich die Position automatisch bestimmen zu lassen und dann nach irgend 'nem Weg zu suchen, der die eigene Bestimmung der Position doch noch ermöglicht. Und wenn im Objektinspektor schon unbeding Position auf poScreenCenter stehen muss, dann versuch' doch mal, ob (sinngemäß) sowas funktioniert:
Delphi-Quellcode:
// Irgendwo 'ner Prozedur vom Formular.
Self.Position := poDesigned; Self.Left := ini.ReadInteger('Left',Self.Name,Self.Left); Self.Top := ini.ReadInteger('Top',Self.Name,Self.Top); ... Self.Position := poScreenCenter; |
AW: Fensterposition persistent machen
Setze die MainForm.Position auf einen der Defaultwerte (poDefault,..). Im erstmaligen Aufruf von FormShow werden Top, Left, Width und Height auf die Werte aus der Ini-Datei gesetzt und dann eventuell noch korrigiert, also Anpassen an Bildschirmgröße etc. Anschließend setze ich WindowState auf den gespeicherten Wert. Klappt einwandfrei mit Delphi2010 auf allen Windows-Systemen.
|
AW: Fensterposition persistent machen
Hallo,
ich würde die Daten im initialization Abschnitt aus der ini-Datei oder Registry einlesen und in globalen Variablen speichern. Danach im FormCreate-Ereignis setzen. Ich hab folgendes ausprobiert und es funktioniert:
Delphi-Quellcode:
var
Form1: TForm1; x1,y1: integer; procedure TForm1.FormCreate(Sender: TObject); begin Top:=x1; Left:=y1; end; initialization // Das Einlesen aus der INI oder Registry habe ich mir hier gespart // Die eingelesen Werte werden hier den globalen Variablen übergeben x1:=30; y1:=100; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 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-2025 by Thomas Breitkreuz