AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult mrOK
Thema durchsuchen
Ansicht
Themen-Optionen

Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult mrOK

Ein Thema von Kidi · begonnen am 25. Jan 2017 · letzter Beitrag vom 26. Jan 2017
Antwort Antwort
Seite 1 von 3  1 23      
Kidi

Registriert seit: 14. Okt 2005
Ort: Niederkassel
54 Beiträge
 
Delphi 10.3 Rio
 
#1

Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult mrOK

  Alt 25. Jan 2017, 10:06
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
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#2

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 10:10
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);
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 11:07
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.
Warum in einem Array zwischenspeichern wenn du die Werte direkt beim Beenden abrufen kannst? So wie du es jetzt machst läufst du nur unnötig Gefahr, dass du, aus welchem Grund auch immer, mal ein solches Event verpasst und deine Werte nicht mehr stimmen.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#4

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 11:12
Warum in einem Array zwischenspeichern wenn du die Werte direkt beim Beenden abrufen kannst? So wie du es jetzt machst läufst du nur unnötig Gefahr, dass du, aus welchem Grund auch immer, mal ein solches Event verpasst und deine Werte nicht mehr stimmen.
Das mit dem "erst beim Beenden speichern" hatte ich vorher so gemacht. Aber wenn Größe und Position eines Formulars welches nicht das Hauptformular ist gespeichert werden soll gab das Probleme (falsche Werte usw).
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

Geändert von a.def (25. Jan 2017 um 11:17 Uhr)
  Mit Zitat antworten Zitat
Slipstream
(Gast)

n/a Beiträge
 
#5

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 12:13
Das mit dem "erst beim Beenden speichern" hatte ich vorher so gemacht. Aber wenn Größe und Position eines Formulars welches nicht das Hauptformular ist gespeichert werden soll gab das Probleme (falsche Werte usw). Daher speichere ich zwischen. Funktioniert wunderbar und die Zahlen sind immer aktuell.
Was spricht dagegen, erstens zwei private Methode zum Lesen und Speichern von Formulargrösse und -position einzubauen, in der direkt diese fünf Parameter in Registry, Datenbank oder Inidatei gespeichert werden?

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:
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;
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.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 12:33
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:

procedure 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;
Nicht vergessen: frm.Helper in Uses

Ist jetzt zwar mit Stream, aber das Prinzip ist sicher erkennbar.

Frank
Angehängte Dateien
Dateityp: pas frm.Helper.pas (2,6 KB, 21x aufgerufen)
Frank Reim
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#7

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 12:41
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;
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
297 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 13:51
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:
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;
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.
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
297 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 13:54
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.
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Formular Position speichern, Generell wenn geschlossen wird oder bei ModalResult

  Alt 25. Jan 2017, 13:56
Ich benutze für sowas MSDN-Library durchsuchenGetWindowPlacement/MSDN-Library durchsuchenSetWindowPlacement. Damit erspart man sich z.B. die Prüfung auf zwischenzeitlich nicht mehr vorhandene Monitore etc. Aufrufen tue ich das normalerweise im OnShow/OnHide.
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;
Uli Gerhardt

Geändert von uligerhardt (25. Jan 2017 um 14:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
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