AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formkoordinaten speichern

Ein Thema von Q-Dog · begonnen am 13. Apr 2006 · letzter Beitrag vom 13. Apr 2006
Antwort Antwort
Q-Dog

Registriert seit: 15. Okt 2005
24 Beiträge
 
#1

Formkoordinaten speichern

  Alt 13. Apr 2006, 00:36
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
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 00:53
Hallo und willkommen in der Delphi-Praxis!


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
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.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 03:15
@Ichbins : lege Dir mal einen identifizierbaren Namen zu. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Q-Dog

Registriert seit: 15. Okt 2005
24 Beiträge
 
#4

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 09:21
vielen Dank an euch beide und für die nette Begrüßung

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
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 09:43
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 14:02
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#7

Re: Formkoordinaten speichern

  Alt 13. Apr 2006, 14:12
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
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:58 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