![]() |
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; |
Re: Position von Programmfenster in *.ini speichern?
Hallo Tim,
global
Delphi-Quellcode:
(fMain = Hauptformular)
CONST
... SectionSystem = 'System'; KeyFormLeft = 'FormLeft'; KeyFormTop = 'FormTop'; ... schreiben (z.B. in FormDestroy/Close)
Delphi-Quellcode:
lesen (z.B. in FormCreate)
IniFile.WriteInteger(SectionSystem, KeyFormLeft, fMain.Left);
IniFile.WriteInteger(SectionSystem, KeyFormTop, fMain.Top);
Delphi-Quellcode:
fMain.Left:= IniFile.ReadInteger(SectionSystem, KeyFormLeft, 0);
fMain.Top:= IniFile.ReadInteger(SectionSystem, KeyFormTop, 0); |
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:... |
Re: Position von Programmfenster in *.ini speichern?
Zitat:
Delphi-Quellcode:
Kein Problem unter D6 im OnCreate-Ereignis.
form1.Left := 1;
form1.Top := 1; |
Re: Position von Programmfenster in *.ini speichern?
Hallo,
bei mir funkts auch (D7Ent). |
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) |
Re: Position von Programmfenster in *.ini speichern?
Zitat:
Zitat:
|
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.
|
Re: Position von Programmfenster in *.ini speichern?
Erstelle ein neues leeres Projekt. Mach ein Doppelklick auf onCreate und schreibe
Delphi-Quellcode:
und drücke F9. Wie ist das Ergebnis?
procedure TForm1.FormCreate(Sender: TObject);
begin form1.Left := 100; form1.Top := 100; end; |
Re: Position von Programmfenster in *.ini speichern?
Ergebnis ist:
vom linken Bildschirmrand: 100 vom oberen Bildschirmrand 100 |
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.
|
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; |
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? |
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: |
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; |
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 10:22 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-2025 by Thomas Breitkreuz