![]() |
Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Die Fensterposition und -größe zu speichern ist absolut kein Problem.
Jetzt wäre ich noch gerne in der Lage zu speichern und laden, auf welchem Monitor das Formular zuletzt war. Ich habe schon ein bisschen mit Screen.Monitors[] rumgespielt aber das bringt mich nicht weiter, da ich weder laden noch speichern kann. Mein Grundgedanke: beim Speichern
Delphi-Quellcode:
um den Monitor zu bekommen.
X := Screen.MonitorFromWindow(FormHandle... )
showmessage( X.MonitorNum.ToString ); Aber wie lade ich das nun und zeige das Formular auch auf diesem Monitor wieder an? Solche Sachen wie "MonitorLinks.Breite + ....." und sowas kann man ja total vergessen. Denn nicht jeder hat die Monitore nebeneinander. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Delphi-Quellcode:
arbeitet auch mit der Fensterposition bzw. genauer gesagt "The MonitorFromWindow function retrieves a handle to the display monitor that has the largest area of intersection with the bounding rectangle of a specified window".
MonitorFromWindow
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Das heißt ich speichere aktuell falsch. Aktuell speichere ich einfach nur X und Y vom "Monitor" und achte gar nicht drauf welcher.
Aktuell übergebe ich meiner Funktion schlicht
Delphi-Quellcode:
und speichere das in 4 ini idents ab.
aForm.Width, aForm.Height, aForm.Left, aForm.Top
Wie müsste man das denn abspeichern, um MultiMonitor-Support zu gewährleisten? |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Edit: Du hast grade editiert. So wie du es machst, sollte es "automatisch" schon passen :) |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Leider nicht. Ich speichere X, Y Höhe und Breite ganz normal.
Beim Laden gehe ich so vor
Delphi-Quellcode:
_Screen := Screen.MonitorFromWindow(frmMain.Handle);
if IniFrm.ValueExists('window_options', 'x') and IniFrm.ValueExists('window_options', 'y') then begin x := IniFrm.ReadInteger('window_options', 'x', (_Screen.Width - frmOptions.Width) div 2); y := IniFrm.ReadInteger('window_options', 'y', (_Screen.Height - frmOptions.Height) div 2); end else begin x := (_Screen.Width - frmOptions.Width) div 2; y := (_Screen.Height - frmOptions.Height) div 2; end; frmOptions.Left := x; frmOptions.Top := y; |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Lass das ganze Gedöhns mit dem Screen einfach weg :P Einfach nur X, Y, Width, Height speichern und 1 zu 1 wieder laden. Auf dem richtigen Monitor landet das Fenster dann automatisch.
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Das Screens ist nur für die Ini-Default-Werte da, falls beim Auslesen was nicht klappt. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Was genau funktioniert beim Laden denn nicht? Die Positionen sind falsch? |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Hinweis: Das Laden/Setzen der Werte im OnShow. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Die Position vom Hauptfenster wird wohl korrekt geschrieben (rechter Monitor).
Delphi-Quellcode:
Beim Laden landet es aber auf Monitor 1 (also der linke)
[window_main]
x=2139 y=196 Ich setze Top und Left im OnCreate-Event. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Evtl. könnte man noch speichern, ob das Fenster maximiert ist usw.
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Also ich hab mir grade mal ein Testprogramm geschrieben und da funktioniert alles wie es soll. Muss ein Problem bei der Verarbeitung (Ini, etc.) vorliegen:
Delphi-Quellcode:
Edit:
uses
Clipbrd; procedure TForm2.Button1Click(Sender: TObject); var S: String; begin S := Left.ToString + ',' + Top.ToString + ',' + Width.ToString + ',' + Height.ToString; Clipboard.AsText := S; end; procedure TForm2.Button2Click(Sender: TObject); var A: TArray<String>; begin A := Clipboard.AsText.Split([',']); Left := A[0].ToInteger; Top := A[1].ToInteger; Width := A[2].ToInteger; Height := A[3].ToInteger; end; Der Hinweis von haentschman bezüglich OnShow ist wichtig, wenn es sich um das (aktuelle) eigene Fenster handelt. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Delphi-Quellcode:
- vielleicht steht da ja noch was anderes drin.
Position := poDesigned
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
poDesigned war schon gesetzt.
Der Tipp mit OnShow hat geholfen. Tatsächlich darf man wohl keine Fensterpositionen im OnCreate setzen. |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Aber Achtung: Das Fenster wird dorthin verschoben, egal, ob es die Position/den Monitor auch gibt + wird damit uU unsichtbar.
Haben wir immer wieder, wenn Benutzer den zweiten Monitor nicht aufdrehen oder von einem anderen Rechner mit nur einem Monitor aus arbeiten. :-/ |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Delphi-Quellcode:
sein - o.k. es funktioniert beides . . .
Position := poDefault
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Bei mir funktioniert es auch in
Delphi-Quellcode:
.
OnCreate
Zitat:
Delphi-Quellcode:
if Screen.MonitorFromWindow(Handle, mdNull) = nil then
Position := poScreenCenter; |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Moin...:P
Zitat:
|
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Zitat:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Position := poDesigned; Left := 2000; Top := 800; end; |
AW: Fensterposition sowie -größe auf zweitem Monitor speichern und laden
Unabhängig von der Anzahl der Monitore verwende ich schon sehr lange die folgenden INIs:
Beim Programmstart:
Delphi-Quellcode:
und wenn Fenster geschlossen werden, speichern der Fensterpositionen:
procedure p_IniRead(AForm : TCustomForm);
// INI Datei einlesen und Fensterpositionen bestimmen var Ini : TIniFile; tmpFormName : string; begin Ini := TIniFile.Create(ChangeFileExt( Application.ExeName, '.INI' ) ); try tmpFormName := AForm.Name; AForm.Top := Ini.ReadInteger(tmpFormName, 'Top', AForm.Top ); AForm.Left := Ini.ReadInteger(tmpFormName, 'Left', AForm.Left ); AForm.Height := Ini.ReadInteger(tmpFormName, 'Height', AForm.Height); AForm.Width := Ini.ReadInteger(tmpFormName, 'Width', AForm.Width); if Ini.ReadBool( tmpFormName, 'InitMax', false ) then AForm.WindowState := wsMaximized else AForm.WindowState := wsNormal; finally Ini.Destroy; end; if Screen.MonitorFromWindow(aForm.Handle, mdNull) = nil then begin // Form is outside of any monitor. Move to center of main monitor aForm.Top := (Screen.Monitors[0].Height - aForm.Height) div 2; aForm.Left := (Screen.Monitors[0].Width - aForm.Width) div 2; end; end;
Delphi-Quellcode:
Und durch die Weitergabe der Form klappt das auch mit beliebigen Fenstern in einem Programm. Und das Handling, wenn mal nur ein Monitor vorhanden ist, ist auch gleich enthalten (wurde aber oben ja auch schon gezeigt).
procedure TFrmMain.p_IniFormPosRead(AForm : TCustomForm);
// Position der Form merken var Ini : TIniFile; tmpFormName : string; begin Ini := TIniFile.Create(ChangeFileExt( Application.ExeName, '.INI' ) ); try tmpFormName := AForm.Name; AForm.Top := Ini.ReadInteger(tmpFormName, 'Top', AForm.Top ); AForm.Left := Ini.ReadInteger(tmpFormName, 'Left', AForm.Left ); AForm.Height := Ini.ReadInteger(tmpFormName, 'Height', AForm.Height); AForm.Width := Ini.ReadInteger(tmpFormName, 'Width', AForm.Width); if Ini.ReadBool( tmpFormName, 'InitMax', false ) then AForm.WindowState := wsMaximized else AForm.WindowState := wsNormal; finally Ini.Destroy; end; Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 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