Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Formkoordinaten speichern (https://www.delphipraxis.net/67314-formkoordinaten-speichern.html)

Q-Dog 13. Apr 2006 00:36


Formkoordinaten speichern
 
Hallo,

ich würde gerne wissen ob es eine Möglichkeit gibt, die Formkoordinaten eines Programmes beim Beenden zu speichern, so dass beim Neustart das Formular an der gleichen Stelle ist.

z.B.
Start:
-Top: 450
-Left: 210

dann verschiebt man das Forumlar auf:
-Top: 350
-Left: 250

wenn man das Programm nun beendet sollen diese neuen Koordinaten gespeichert werden und beim Neustart soll das Formular an dieser Stelle erscheinen.



Mfg Q-Dog

ichbins 13. Apr 2006 00:53

Re: Formkoordinaten speichern
 
Hallo und willkommen in der Delphi-Praxis! :party:


am besten nimmst du dir eine INI-Datei. Das ist mit Abstand die einfachste Lösung. In der Delphi7-Hilfe steht da schon genau als Beispiel drin wie man das mit der Formgröße macht: (leicht abgeändert)

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Top    := Ini.ReadInteger( 'Form', 'Top', 100 );
    Left   := Ini.ReadInteger( 'Form', 'Left', 100 );
    Width    := Ini.ReadInteger( 'Form', 'Width', 100 );
    Height   := Ini.ReadInteger( 'Form', 'Height', 100 );
    if Ini.ReadBool( 'Form', 'InitMax', false ) then
      WindowState = wsMaximized
    else
      WindowState = wsNormal;
  finally
    Ini.Free;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Ini.WriteInteger( 'Form', 'Top', Top);
    Ini.WriteInteger( 'Form', 'Left', Left);
    Ini.WriteInteger( 'Form', 'Width', Width);
    Ini.WriteInteger( 'Form', 'Height', Height);
    Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
  finally
    Ini.Free;
  end;
end;

noch ne Erklärung einer Zeile:

diese Zeile
Delphi-Quellcode:
Height := Ini.ReadInteger( 'Form', 'Height', 100 );
heisst so viel wie:
Aus der Ini wird ein Integer gelesen. Dazu wird der Wert Height aus der Section Form verwendet. Der Alternativwert (falls der Wert Height nicht gefunden wurde) ist 100.

Hansa 13. Apr 2006 03:15

Re: Formkoordinaten speichern
 
@Ichbins : lege Dir mal einen identifizierbaren Namen zu. :mrgreen: Ich bin das nämlich nicht. Der Tip ist trotzdem ganz gut, aber warum nicht gleich richtig ?

Delphi-Quellcode:
procedure Tfrm.FormShow(Sender: TObject);
var FensterIni : TIniFile;
begin
  inherited;
  Caption := 'MeinProgramm';
  try
    FensterIni := TIniFile.Create(FensterDateiName);
    Left  := FensterIni.ReadInteger(Name,'Left',Left);
    Top   := FensterIni.ReadInteger(Name,'Top',Top);
    Width := FensterIni.ReadInteger(Name,'Width',Width);
    Height := FensterIni.ReadInteger(Name,'Height',Height);
  finally
    FensterIni.Free;
  end;
end;
Bei Ichbins wird ein fester Name verwendet. Im Beispiel ist der völlig egal und bezieht sich auf jede Form. Bist Du so schlau und verwendest OOP oder einfach nur die Objektablage, dann kann man diese Prozedur mal prinzipiell einbauen und hat sie automatisch immer verfügbar ! Die Formen verwalten sich quasi selbst. Siehe die Caption. Nun kann man noch weiter gehen und den Dateinamen für jeden User im Userverzeichnis speichern und schon hat jeder User seine eigenen Programmkoordinaten.

Q-Dog 13. Apr 2006 09:21

Re: Formkoordinaten speichern
 
vielen Dank an euch beide und für die nette Begrüßung :D

ich probiers gleich mal aus ^^

Delphi-Quellcode:
    if Ini.ReadBool( 'Form', 'InitMax', false ) then
      WindowState := wsMaximized
    else
      WindowState := wsNormal;
ich geh mal davon aus die hast die ":=" (anstatt "=")nur vergessen oder? denn mein Programm meckert da ;)

ansonsten klappt bisher alles vielen dank nochmal.

Was genau is der Unterschied zwischen dem von Ichbins und Hansa?




Mfg Q-Dog

Elvis 13. Apr 2006 09:43

Re: Formkoordinaten speichern
 
Was man vlt noch beachten sollte ist, dass die Speicherung von Formularpositionen mehr Probleme schafft als sie an Vorteilen bringen könnte.
Das Speichern der Größe ist aber absolut unproblematisch. Wenn du im OI als Position ScreenCenter eingibst wird es auch auf Multi-Monitorsystem keine Probleme geben falls dort jemand mal den rechten Moni zum primären macht. ;)

Hansa 13. Apr 2006 14:02

Re: Formkoordinaten speichern
 
Wo der Unterschied ist ? Wenn ich "Form1" statt "Name" schreibe, dann gilt es eben nur für Form1. Jede Form hat aber einen Namen und den weiß sie selber. Die Ini muß ja nicht nur gelesen, sondern bei Bedarf auch geändert und das dann abgespeichert werden. Was liegt da näher, als das beim FormClose zu machen ?

Delphi-Quellcode:
procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
var FensterIni : TIniFile;
begin
  inherited;
  if not CDStart then begin
    try
      FensterIni := TIniFile.Create(FensterDateiName);
      FensterIni.WriteInteger(Name,'Left',Left);
      FensterIni.WriteInteger(Name,'Top',Top);
      FensterIni.WriteInteger(Name,'Width',Width);
      FensterIni.WriteInteger(Name,'Height',Height);
    finally
      FensterIni.Free;
    end;
  end;
  Action := caFree;
end;
Im Endeffekt ist die Ini dann so aufgebaut :

[frmTest]
Left=230
Top=143
Width=482
Height=511

Der kleine aber feine Unterschied besteht in der Praxis z.B. darin, daß mein Code C+P geeigneter ist. Ich brauche nämlich nur den procedure-body in die eigenen FormShow/FormClose zu kopieren. Oder, wie gesagt : ab mit solchem Zeugs in die Objektablage und statt TForm eben TMeineForm benutzen. Siehe die Variable CDStart. Die war am Anfang noch nicht vorhanden. Nachträgliches Ergänzen hätte bedeutet, zig Forms damit bestücken zu müssen. Ähnliches gilt für das caFree. Wie schnell hat man sowas mal vergessen.

SnuffMaster23 13. Apr 2006 14:12

Re: Formkoordinaten speichern
 
Hi,

ich hab das da oben jetz nicht so recht gelesen, aber ich hab sowas mal mit der Registry gemacht, ich posts jetz einfach mal:
FormCreate:
Delphi-Quellcode:
  Reg.OpenKey('\Software\DeinName\ProgrammName', true);
    if Reg.ValueExists('Left') then Form1.Left := Reg.ReadInteger('Left');
    if Reg.ValueExists('Top') then Form1.Top := Reg.ReadInteger('Top');
    if Reg.ValueExists('Width') then Form1.Width := Reg.ReadInteger('Width');
    if Reg.ValueExists('Height') then Form1.Height := Reg.ReadInteger('Height');
    if Reg.ValueExists('Maximized') then
      if Reg.ReadBool('Maximized') then
         Form1.WindowState := wsMaximized;
    if Reg.ValueExists('Standard') then ToolButton1.Tag := Reg.ReadInteger('Standard');
  Reg.CloseKey;
FormClose:
Delphi-Quellcode:
  Reg.OpenKey('\Software\DeinName\ProgrammName', true);
    if not (Form1.WindowState = wsMaximized) then
    begin
      Reg.WriteInteger('Left', Form1.Left);
      Reg.WriteInteger('Top', Form1.Top);
      Reg.WriteInteger('Width', Form1.Width);
      Reg.WriteInteger('Height', Form1.Height);
    end;
    Reg.WriteBool('Maximized', Form1.WindowState = wsMaximized);
    Reg.WriteInteger('Standard', ToolButton1.Tag);
  Reg.CloseKey;
Also das funktioniert!!

Viel Spaß,
Snuffi


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 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