Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Position von Programmfenster in *.ini speichern? (https://www.delphipraxis.net/10216-position-von-programmfenster-%2A-ini-speichern.html)

Tim.exe 14. Okt 2003 09:33


Position von Programmfenster in *.ini speichern?
 
Hallo,

ich versuche gerade die geänderte Position eines Formulars in eine *.ini zu speichern.
Das speichern an sich ist auch kein Problem und funktioniert, nur bei einem erneuten Aufruf soll das Programm wieder an der Position angezeigt werden an der es das letzte Mal beendet wurde und das tut es nicht.

Vielleicht kann man die Position "left" und "top" direkt in eine *.ini schreiben, ich bin aber den Umweg über 2 Edits gegangen die die Position auslesen und speichern.

Code:

Delphi-Quellcode:

procedure TForm1.FormCreate(Sender: TObject);
var savestat: TIniFile;
begin
savestat := TIniFile.Create(ExtractFilepath(Application.Exename)+'settings.ini');
try
Edit1.Text := savestat.ReadString('Left','Status1',Edit1.Text);
Edit2.Text := savestat.ReadString('Top','Status1',Edit2.Text);
finally
savestat.Free;
end;

If RadioBox1.Checked then
Form1.Left := StrToInt(Edit1.Text);
Form1.Top := StrToInt(Edit2.Text);

end;

procedure TForm1.FormDestroy(Sender: TObject);
var savestat: TIniFile;
begin
Edit1.Text := IntToStr(Form1.Left);
Edit2.Text := IntToStr(Form1.Top);
savestat := TIniFile.Create(ExtractFilepath(Application.Exename)+'settings.ini');
try
savestat.WriteString('Left','Status1',Edit1.Text);
savestat.WriteString('Top','Status1',Edit2.Text);
finally
savestat.Free;
end;

end;

APP 14. Okt 2003 09:50

Re: Position von Programmfenster in *.ini speichern?
 
Hallo Tim,

global
Delphi-Quellcode:
CONST
...
  SectionSystem         = 'System';
  KeyFormLeft           = 'FormLeft';
  KeyFormTop            = 'FormTop';
...
(fMain = Hauptformular)

schreiben (z.B. in FormDestroy/Close)
Delphi-Quellcode:
  IniFile.WriteInteger(SectionSystem, KeyFormLeft, fMain.Left);
  IniFile.WriteInteger(SectionSystem, KeyFormTop, fMain.Top);
lesen (z.B. in FormCreate)
Delphi-Quellcode:
  fMain.Left:= IniFile.ReadInteger(SectionSystem, KeyFormLeft, 0);
  fMain.Top:= IniFile.ReadInteger(SectionSystem, KeyFormTop, 0);

sakura 14. Okt 2003 09:56

Re: Position von Programmfenster in *.ini speichern?
 
Das Widerherstellen der Position kann nicht im OnCreate Ereignis erledigt werden, weiche einfach auf das OnActivate Ereignis aus, dann sollte es klappen.

...:cat:...

Tom 14. Okt 2003 09:59

Re: Position von Programmfenster in *.ini speichern?
 
Zitat:

Zitat von sakura
Das Widerherstellen der Position kann nicht im OnCreate Ereignis erledigt werden,

Wieso?
Delphi-Quellcode:
  form1.Left := 1;
  form1.Top := 1;
Kein Problem unter D6 im OnCreate-Ereignis.

APP 14. Okt 2003 10:02

Re: Position von Programmfenster in *.ini speichern?
 
Hallo,
bei mir funkts auch (D7Ent).

Tim.exe 14. Okt 2003 10:05

Re: Position von Programmfenster in *.ini speichern?
 
Hallo,

klappt leider immer noch nicht. Wobei ich sagen muss das Form1.Position auf "poDesktopCenter" steht.

Wenn ich die Position auf "poDesigned" stelle, wird es auch nicht an der geänderten Position angezeigt sondern bei Left: 1 / Top: 1 (obwohl es im Designmodi ca. in der Mitte steht)

Tom 14. Okt 2003 10:08

Re: Position von Programmfenster in *.ini speichern?
 
Zitat:

Zitat von Tim.exe
klappt leider immer noch nicht. Wobei ich sagen muss das Form1.Position auf "poDesktopCenter" steht.

Sehr witzig ...

Zitat:

Wenn ich die Position auf "poDesigned" stelle, wird es auch nicht an der geänderten Position angezeigt sondern bei Left: 1 / Top: 1 (obwohl es im Designmodi ca. in der Mitte steht)
Hast Du die Variante von Armin übernommen?

Tim.exe 14. Okt 2003 10:19

Re: Position von Programmfenster in *.ini speichern?
 
Ja hab ich, und das OnCreate ist jetzt das OnActivate Ereignis. Form1.Pos ist auf "poDesigned" gestellt. Fenster wird aber immer wie designed angzeigt, auch wenn die Position geändert wurde.

Tom 14. Okt 2003 10:29

Re: Position von Programmfenster in *.ini speichern?
 
Erstelle ein neues leeres Projekt. Mach ein Doppelklick auf onCreate und schreibe
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.Left := 100;
  form1.Top := 100;
end;
und drücke F9. Wie ist das Ergebnis?

Tim.exe 14. Okt 2003 10:37

Re: Position von Programmfenster in *.ini speichern?
 
Ergebnis ist:

vom linken Bildschirmrand: 100
vom oberen Bildschirmrand 100

Tom 14. Okt 2003 10:41

Re: Position von Programmfenster in *.ini speichern?
 
Prima. Dann Zeige dem Volk mal Deine überarbeitete Version, die INI auszulesen und zu speichern. Bitte aber vergewissern, dass die INI geschrieben und gefunden wird.

Tim.exe 14. Okt 2003 10:49

Re: Position von Programmfenster in *.ini speichern?
 
OK, haltet euch fest, hier kommt es:

Delphi-Quellcode:
...
const
  SectionSystem         = 'System';
  KeyFormLeft           = 'FormLeft';
  KeyFormTop            = 'FormTop';
...

procedure TForm1.FormCreate(Sender: TObject);
begin
        Form1.Left := 100;
        Form1.Top := 100;
end;


procedure TForm1.FormDestroy(Sender: TObject);
var savestat: TIniFile;
begin
savestat := TIniFile.Create(ExtractFilepath(Application.Exename)+'settings.ini');
try
savestat.WriteInteger(SectionSystem, KeyFormLeft, Form1.Left);
savestat.WriteInteger(SectionSystem, KeyFormTop, Form1.Top);
finally
savestat.Free;
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
var savestat: TIniFile;
begin
savestat := TIniFile.Create(ExtractFilepath(Application.Exename)+'settings.ini');
try
Form1.Left:= savestat.ReadInteger(SectionSystem, KeyFormLeft, 0);
Form1.Top:= savestat.ReadInteger(SectionSystem, KeyFormTop, 0);
finally
savestat.Free;
end;
end;

Tom 14. Okt 2003 10:54

Re: Position von Programmfenster in *.ini speichern?
 
Wieso jetzt OnActivate? OnCreatewar doch richtig. Ansonsten: Wird die verdammte INI-Datei geschrieben? Hat diese den richtigen Inhalt? Setze doch mal ein Breakpoint und schaue nach was passiert.

Nachtrag: Was soll jetzt die Zuweisung in OnCreate?

Tim.exe 14. Okt 2003 11:07

Re: Position von Programmfenster in *.ini speichern?
 
Upsi,

das mit OnCreate und OnActivate war ein Missverständnis.

Es klappt jetzt sehr gut, bis auf einen kleinen Schönheitsfehler:

Beim aller ersten Start (wenn noch keine *.ini geschrieben wurde) wird das Programm am absoluten linken, oberen Bildschirmrand angezeigt, DesktopCenter wäre aber schöner... :roll:

Lonki 14. Okt 2003 11:11

Re: Position von Programmfenster in *.ini speichern?
 
Versuchs doch mal mit:

Delphi-Quellcode:
  if savestat.SectionExists(SectionSystem) then
  begin
    Form1.Left:= savestat.ReadInteger(SectionSystem, KeyFormLeft, 0);
    Form1.Top:= savestat.ReadInteger(SectionSystem, KeyFormTop, 0);
  end;

Christian Seehase 14. Okt 2003 11:12

Re: Position von Programmfenster in *.ini speichern?
 
Moin Tim,

logisch, dass dann das Programmfenster in der linken oberen Ecke hängt.
Du hast ja als Defaultwert beim ReadInteger 0 angegeben.

Wenn Du das mal auf

(Screen.Width-self.Width) div 2

änderst (für die obere Kante entsprechend) sollte das Formular in der Mitte erscheinen.


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