Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fensterposition persistent machen (https://www.delphipraxis.net/195841-fensterposition-persistent-machen.html)

EWeiss 30. Mär 2018 20:31

AW: Fensterposition persistent machen
 
Zitat:

ich würde die Daten im initialization Abschnitt aus der ini-Datei oder Registry einlesen und in globalen Variablen speichern.
Ich glaube einige Leute schreiben nur um des schreiben willens und lesen tun sie auch nicht.

Er hat doch geschrieben das er die werte speichert darum geht es doch gar nicht.
Sondern darum das die eingelesenen werte beim setzen in OnShow ignoriert werden und Delphi tut was es will.

gruss

himitsu 30. Mär 2018 20:33

AW: Fensterposition persistent machen
 
Neee, erstmal ist es egal wann die Daten gelesen werden, denn es hängt beim Zuweisen und nicht beim Auslesen.
Und nein, es funktioniert nicht immer.

Je nach TForm.Position werden Monitor, Größe und Top/Left zu unterschiedlichen Zeitpunkten von der VCL gesetzt.
Wenn man also seine Zuweisung macht und anschließend die VCL das wieder überschreibt, dann hat man ein Problemchen.

Einiges wird z.B. schon im Constructor ausgeführt, Anderes im OnShow (aber noch bevor das eigene Event behandelt wird) und wieder Anderes erst danach.
Und wann OnCreate ausgeführt wird, dass kann sich auch noch entscheidend auswirken. (Delphi-Referenz durchsuchenOldCreateOrder)

EWeiss 30. Mär 2018 20:38

AW: Fensterposition persistent machen
 
werfe die VCL weg und mache es von Hand.

Delphi-Quellcode:
    SetRect(rc, 0, 0, XMIN_SIZE, YMIN_SIZE);
    AdjustWindowRectEx(rc, dwStyle, False, dwExStyle);

    X := MAX((GetSystemMetrics(SM_CXSCREEN) - rc.Right - rc.Left) div 2, 0);
    Y := MAX((GetSystemMetrics(SM_CYSCREEN) - rc.Bottom - rc.top) div 2, 0);

    MainHandle := CreateWindowEx(dwExStyle, myClass, myTitle, dwStyle, X, Y, rc.Right - rc.Left,
      rc.Bottom - rc.top, 0, 0, wc.hInstance, nil);
gruss

ghubi01 30. Mär 2018 20:53

AW: Fensterposition persistent machen
 
Zitat:

Zitat von EWeiss (Beitrag 1397695)
Ich glaube einige Leute schreiben nur um des schreiben willens und lesen tun sie auch nicht.

Er hat doch geschrieben das er die werte speichert darum geht es doch gar nicht.
Sondern darum das die eingelesenen werte beim setzen in OnShow ignoriert werden und Delphi tut was es will.

gruss

Danke gleichfalls.

Ich bin davon ausgegangen, dass man anhand des Beispiels erkennt welchen Weg man zur Lösung des Problems noch gehen könnte.
Dabei sollte die Positionszuweisung (Top und Left) in OnCreate der eigentliche Hinweis sein.

bernau 30. Mär 2018 21:01

AW: Fensterposition persistent machen
 
Zitat:

Zitat von ghubi01 (Beitrag 1397702)
Dabei sollte die Positionszuweisung (Top und Left) in OnCreate der eigentliche Hinweis sein.

Und eben das funktioniert ja nicht bei Ihm. Hat er ja im ersten Post geschrieben.

ghubi01 30. Mär 2018 21:03

AW: Fensterposition persistent machen
 
Zitat:

Zitat von himitsu (Beitrag 1397696)
Neee, erstmal ist es egal wann die Daten gelesen werden, denn es hängt beim Zuweisen und nicht beim Auslesen.
Und nein, es funktioniert nicht immer.

Je nach TForm.Position werden Monitor, Größe und Top/Left zu unterschiedlichen Zeitpunkten von der VCL gesetzt.
Wenn man also seine Zuweisung macht und anschließend die VCL das wieder überschreibt, dann hat man ein Problemchen.

Einiges wird z.B. schon im Constructor ausgeführt, Anderes im OnShow (aber noch bevor das eigene Event behandelt wird) und wieder Anderes erst danach.
Und wann OnCreate ausgeführt wird, dass kann sich auch noch entscheidend auswirken. (Delphi-Referenz durchsuchenOldCreateOrder)

OK. Wann die Daten eingelesen werden ist wirklich egal.

Zu deiner zweiten Aussage: Lässt sich das irgendwie reproduzieren?

EWeiss 30. Mär 2018 21:05

AW: Fensterposition persistent machen
 
Zitat:

Je nach TForm.Position werden Monitor, Größe und Top/Left zu unterschiedlichen Zeitpunkten von der VCL gesetzt.
Ich sag doch wirf sie weg ;)

Zitat:

Danke gleichfalls.
In wie fern?

Ich habe keine Probleme bei allen meinen Anwendungen die x, y Position zu setzen.
Das tue ich schon da existiert noch gar kein Window .. und bevor es angezeigt wird.

Nebenbei sag mir was du testen willst.. ich brauche keine VCL.
Um den Shot klein zu halten NUR 6 meiner Programme.
Und wunder sie sitzen da wo sie sitzen sollen.

gruss

ghubi01 30. Mär 2018 21:08

AW: Fensterposition persistent machen
 
Zitat:

Zitat von bernau (Beitrag 1397704)
Und eben das funktioniert ja nicht bei Ihm. Hat er ja im ersten Post geschrieben.

Stimmt. Sorry hatte ich falsch gelesen. :oops:

bernau 30. Mär 2018 21:16

AW: Fensterposition persistent machen
 
Zitat:

Zitat von ghubi01 (Beitrag 1397694)
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.

Jetzt muss ich mal blöd fragen. Was hast du davon? Im OnCreate wird die Fensterposition benötigt. Dann lese ich die dort auch aus und nicht vorher in der Initialization.

Würde bei der Mainform keinen Unterschied machen. Aber in einem weiteren erzeugte Fenster (FormB) passt das irgenwie gar nicht. Du liest die Position beim Programmstart ein. Dann öffnest du das FormB schiebst es an eine andere Position und schliesst es wieder. Dann erwarte ich eigentlich, dass dieses FormB bei erneutem Aufruf an der zuletzt geschlossenen Position wieder erscheint. Wird es aber nicht, weil die Position im Initialization beim Start des Programms eingelesen wurde. Hhhmm?

ghubi01 30. Mär 2018 21:22

AW: Fensterposition persistent machen
 
Zitat:

Zitat von bernau (Beitrag 1397708)
Würde bei der Mainform keinen Unterschied machen. Aber in einem weiteren erzeugte Fenster (FormB) passt das irgenwie gar nicht. Du liest die Position beim Programmstart ein. Dann öffnest du das FormB schiebst es an eine andere Position und schliesst es wieder. Dann erwarte ich eigentlich, dass dieses FormB bei erneutem Aufruf an der zuletzt geschlossenen Position wieder erscheint. Wird es aber nicht, weil die Position im Initialization beim Start des Programms eingelesen wurde. Hhhmm?

Für ein weiteres erzeugtes Fenster würde ich das auch so nicht machen. Das Beispiel sollte auch nur für die Mainform gelten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Seite 2 von 3     12 3      

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