![]() |
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 |
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:
heisst so viel wie:
Height := Ini.ReadInteger( 'Form', 'Height', 100 );
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. |
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:
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.
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; |
Re: Formkoordinaten speichern
vielen Dank an euch beide und für die nette Begrüßung :D
ich probiers gleich mal aus ^^
Delphi-Quellcode:
ich geh mal davon aus die hast die ":=" (anstatt "=")nur vergessen oder? denn mein Programm meckert da ;)
if Ini.ReadBool( 'Form', 'InitMax', false ) then
WindowState := wsMaximized else WindowState := wsNormal; ansonsten klappt bisher alles vielen dank nochmal. Was genau is der Unterschied zwischen dem von Ichbins und Hansa? Mfg Q-Dog |
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. ;) |
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:
Im Endeffekt ist die Ini dann so aufgebaut :
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; [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. |
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:
FormClose:
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;
Delphi-Quellcode:
Also das funktioniert!!
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; 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