![]() |
Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult mrOK
Hallo alle zusammen,
wie die Überschrift sagt, beschäftigt es mich wann die Formular Position gespeichert werden soll. Wie handhabt ihr das, ich bin da ziemlich unsicher was der bessere Fall ist. Mfg Didi |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Ich handhabe das so, dass die Größe und Position bei Resize oder Move meines Formulares in ein Array geschrieben wird.
Diese vier Werte speichere ich dann im OnClose. Dazu kann man z.B. verwenden
Delphi-Quellcode:
procedure WMFormMoved(var msg: TWMMove); message WM_MOVE;
// und procedure FormResize(Sender: TObject); |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Zitat:
|
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Zitat:
Daher speichere ich zwischen. Funktioniert wunderbar und die Zahlen sind immer aktuell. Edith sagt Man muss die alten Werte ja eh aus der Konfiguration auslesen und irgendwo zuweisen. Also ist das Zwischenspeichern kein Beinbruch :P |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Zitat:
Und was spricht zweitens dagegen, diese Methode dann in der OnClose-Ereignisbehandlung aufzurufen? Ich mach das schon immer so und hatte damit noch nie Probleme. Hier ein Beispiel, wie man aus einer Datenbank (die vielleicht auch von mehreren Clients verwendet wird), die individuellen Daten zur Wiederherstellung der individuellen Programmoptionen ausliest und wieder zurückschreibt, der Einfachheit halber reduziert auf Fensterposition, -grösse und Windowstate:
Delphi-Quellcode:
Genauso (war mir jetzt zu aufwendig, das hier reinzutippen) würde man das beim Lesen von bzw. Schreiben in eine Inidatei oder Registry machen. Wenn du das jedesmal zwischenspeicherst, hast du das doppelt gespeichert. Ich weiß keinen Grund, diese Daten im Programm doppelt zu speichern.
Procedure FormSoundSo.FormParamsRead;
begin Left := DM.QueryUser.FieldByName('SOUNDSO_LEFT').AsInteger; Top := DM.QueryUser.FieldByName('SOUNDSO_TOP').AsInteger; Width := DM.QueryUser.FieldByName('SOUNDSO_WIDTH').AsInteger; Height := DM.QueryUser.FieldByName('SOUNDSO_HEIGHT').AsInteger; if DM.QueryUser.FieldByName('SOUNDSO_MAX').AsBoolean then Windowstate := wsMaximized else Windowstate := wsNormal; end; Procedure FormSoundSo.FormParamsWrite; var Maxi : Boolean; begin Maxi := Windowstate = wsMaximized; Windowstate := wsNormal; DM.QueryUser.Edit; DM.QueryUser.FieldByName('SOUNDSO_LEFT').AsInteger := Left; DM.QueryUser.FieldByName('SOUNDSO_TOP').AsInteger Top; DM.QueryUser.FieldByName('SOUNDSO_WIDTH').AsInteger := Width; DM.QueryUser.FieldByName('SOUNDSO_HEIGHT').AsInteger := Height; DM.QueryUser.FieldByName('SOUNDSO_MAX').AsBoolean := Maxi; DM.QueryUser.Post; end; Procedure FormSoundSo.FormShow(Sender: TObject); begin FormParamsRead; end; Procedure FormSoundSo.FormClose(Sender : TObject; Var Action : TCloseAction); begin FormParamsWrite; end; |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
Ich finde es nützlich, die NormalPosition zu sichern und den State und zu prüfen, ob das Formular außerhalb des Screen ist. ich habe dazu einen Form - Helper (Anlage). Aufruf dann (z.B. in Datei speichern, bei mir landet das in der DB):
Delphi-Quellcode:
Nicht vergessen: frm.Helper in Usesprocedure TfrmMain.AfterConstruction; Var AStream: TMemoryStream; begin inherited; AStream := TMemoryStream.Create; try if FileExists(SFsBin) then begin AStream.LoadFromFile(SFsBin); LoadFormState(AStream); end; finally AStream.Free; end; end; procedure TfrmMain.BeforeDestruction; Var AStream: TMemoryStream; begin AStream := TMemoryStream.Create; try SaveFormState(AStream); AStream.SaveToFile(SFsBin); finally AStream.Free; end; inherited; end; Ist jetzt zwar mit Stream, aber das Prinzip ist sicher erkennbar. Frank |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Guck mal hier. So kann man auch auf außerhalb-des-sichtbaren-Bereichs prüfen.
Delphi-Quellcode:
procedure checkFormPosition(aFormToSetPos: TForm);
begin if Screen.MonitorFromWindow(aFormToSetPos.Handle, mdNull) = nil then begin // Form is outside of any monitor. Move to center of main monitor aFormToSetPos.Top := (Screen.Monitors[0].Height - aFormToSetPos.Height) div 2; aFormToSetPos.Left := (Screen.Monitors[0].Width - aFormToSetPos.Width) div 2; end; end; |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Hi Kidi,
ich verwende 2 Proceduren, mit denen ich die Werte in INI-Dateien schreibe (neben all den anderen Werten, die man so braucht):
Delphi-Quellcode:
Den p_IniRead lese ich im OnCreate der Form und den p_IniWrite führe ich im OnClose aus. Und wenn Du die Positionen von weiteren Fenstern benötigst, dann erweiterst Du dir das entsprchend.
procedure TfrmMain.p_IniRead;
{------------------------------------------------------------------------------- INI Datei einlesen -------------------------------------------------------------------------------} var Ini : TIniFile; begin Ini := TIniFile.Create(ChangeFileExt( Application.ExeName, '.INI' ) ); try Top := Ini.ReadInteger( 'Windows Form Settings', 'Top', 100 ); Left := Ini.ReadInteger( 'Windows Form Settings', 'Left', 100 ); Height := Ini.ReadInteger( 'Windows Form Settings', 'Height', 100); Width := Ini.ReadInteger( 'Windows Form Settings', 'Width', 100); if Ini.ReadBool( 'Windows Form Settings', 'InitMax', false ) then WindowState := wsMaximized else WindowState := wsNormal; finally Ini.Destroy; end; end; procedure TfrmMain.p_IniWrite; {------------------------------------------------------------------------------- INI Datei wegschreiben -------------------------------------------------------------------------------} var Ini : TIniFile; begin Ini := TIniFile.Create(ChangeFileExt( Application.ExeName, '.INI' ) ); try Ini.WriteDateTime('Userdata', 'LastLogOut', now()); Ini.WriteInteger( 'Windows Form Settings', 'Top', Top); Ini.WriteInteger( 'Windows Form Settings', 'Left', Left); Ini.WriteInteger( 'Windows Form Settings', 'Height', Height); Ini.WriteInteger( 'Windows Form Settings', 'Width', Width); Ini.WriteBool( 'Windows Form Settings', 'InitMax', WindowState = wsMaximized ); finally Ini.Destroy; end; end; |
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Ein großer Vorteil einer Ini-Datei ist, dass man ganz einfach z. B. den Form1.LEFT Wert ändern kann, und damit bei einer 2-Schirm Lösung das Programm von einem Bildschirm auf den anderen schieben kann, auch dann wenn man die Form nach dem Programmstart nicht sieht, weil sie außerhalb des Bildschirmes gelandet ist.
|
AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult
Ich benutze für sowas
![]() ![]() Hier mal die Schreib-Routine als Beispiel:
Delphi-Quellcode:
procedure WriteWindowPlacement(AIni: TCustomIniFile; const Section, NamePrefix: string; Form: TCustomForm);
var wp: TWindowPlacement; sl: TStringList; s: string; begin wp.length := SizeOf(TWindowPlacement); GetWindowPlacement(Form.Handle, @wp); sl := TStringList.Create; sl.Capacity := 9; try sl.Append(IntToStr(wp.showCmd)); sl.Append(IntToStr(wp.ptMinPosition.X)); sl.Append(IntToStr(wp.ptMinPosition.Y)); sl.Append(IntToStr(wp.ptMaxPosition.X)); sl.Append(IntToStr(wp.ptMaxPosition.Y)); sl.Append(IntToStr(wp.rcNormalPosition.Left)); sl.Append(IntToStr(wp.rcNormalPosition.Top)); sl.Append(IntToStr(wp.rcNormalPosition.Right)); sl.Append(IntToStr(wp.rcNormalPosition.Bottom)); s := EncodeDelimitedText('(', ';', ')', sl); // Hier "sl" irgendwie in einen einzeiligen String wandeln (sl.DelimitedText oder so). finally sl.Free; end; AIni.WriteString(Section, NamePrefix + 'WindowPlacement', s); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 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