Optionen speichern?

Hi, Delphi Freaks,

Ich hab da ein Problem:

Wie sag ich meinem Programm, dass es Optionen (Fensterpositionen, Checkboxes usw.) speichert und beim nächsten Start des Programms dieselben wieder geladen werden?

Also, angenommen das Fenster ist standartmäßig in der Bildschirmmitte. Ich ziehe es aber zum rechten Bildschirmrand.
schließ ich es, ist es beim nächsten Start wieder in der Mitte.
Es soll aber wieder ab rechten Bildschirmrand sein.
Das Programm muss also beim Beenden seine Daten in eine Datei/in die Registry schreiben.

Wer kann helfen?
Ich denke mal, es ist so etwas einfaches, dass man nicht darauf kommt…

Ich danke schonmal
gruß Christoph.

Hallo Christoph,

Wie sag ich meinem Programm, dass es Optionen
(Fensterpositionen, Checkboxes usw.) speichert und beim
nächsten Start des Programms dieselben wieder geladen werden?

die einfachste Lösung ist die Verwendung einer INI-Datei. Darin lassen sich boolsche Werte, Integer-Zahlen und Strings sehr bequem speichern und wieder laden, weil Delphi für das Schreiben in bzw. Lesen aus einer INI-Datei eine eigene Klasse zur Verfügung stellt. Sie heißt „TINIFile“. Die nötigen Gebrauchshinweise dazu findest Du in der Online-Hilfe.

Statt einer INI-Datei kannst Du auch die Registry bemühen. Der Die für den Zugriff auf die Registry zuständige Delphi-Klasse heißt „TRegistry“. Die Benutzung der Registry gestaltet sich aber (etwas) komplizierter und aufwendiger als das Arbeiten mit INI-Dateien.

Noch etwas: Bei INI-Dateien bietet sich an, sie im selben Verzeichnis wie die EXE-Programmdatei Deiner Anwendung zu speichern. Das bedeutet aber, daß Du irgendwo im Code das Verzeichnis auslesen mußt, in dem sich die EXE-Programmdatei befindet. Dieses Verzeichnis kannst Du abfragen mit „ExtractFilePath(Application.ExeName)“.

In Deinem Code steht dann so etwas in der Art („INIFileName“ ist vom Typ „TFileName“:

INIFileName := ExtractFilePath(Application.ExeName)
+‚MYPROG.INI‘;

und mit diesem INIFileName creatierst Du dann Dein INIFile-Objekt

INIFile := TINIFile.Create(INIFileName)

Ich hoffe, das war verständlich.

Mit freundlichem Gruß
Martin

Eine Frage noch…
Hi,
Danke für deine Hilfe. Hab die Registry verwendet. Ein Problem habe ich aber noch:
In die Registry schreibt er sauber die richtigen Daten an den richtigen Ort.
Wie meistere ich es, dass er sie auch wieder aufruft?
mein Code ist:

Für FormCreate setze ich ReadReg ein, für Form1.Close WriteReg.


var
Reg: TRegistry;

Procedure TForm1.ReadReg;
begin
If Reg.OpenKey(‚Software\MyApplication‘,True) then
begin
Reg := TRegistry.Create;
Form1.Left := // Wert aus der Registry auslesen (s. WriteReg)
Form1.Top := // Wert aus der REgistry auslesen (s. WriteReg)
Reg.Free;
end;
end;

Procedure TForm1.WriteReg;
begin
Reg := TRegistry.Create;
if Reg.OpenKey(‚Software\MyApplication‘, True) then
begin
Reg.WriteString(‚MainWindowHPosition‘,IntToStr(Form1.Left)); // speichert horizontale Position des Fensters
Reg.WriteString(‚MainWindowVPosition‘,IntToStr(Form1.Top)); // speichert Vertikale Position des Fensters
Reg.CloseKey;
end;
Reg.Free;
end;

christoph

Hallo,

Für FormCreate setze ich ReadReg ein, für Form1.Close
WriteReg.

Achtung, aufpassen: Das Gegenstück zu TForm.Create ist TForm.Destroy, nicht TForm.Close. In Deinem Fall funktioniert es zwar auch mit TForm.Close, aber nichtsdestotrotz solltest Du das Destroy- und das Close-Event zu unterscheiden wissen (für den Fall, daß Du mal was programmierst, wo es nicht egal ist).

Fehlt in Deinem Code nicht irgendwo noch ein „Reg.CreateKey“? Oder läßt Du die Erzeugung des Schlüssels vom Installationsprogramm erledigen?

Die Klasse TRegistry verfügt auch über eine Methode namens „WriteInteger“, die Dir den Umweg über Strings a la „IntToStr(Form1.Top)“ etc. ersparen würde. Lesen kannst Du die Integer-Werte mit der Methode „ReadInteger“. Weitere Infos, Details, Gebrauchshinweise, Demos etc. pp. siehe Online-Hilfe (deren effiziente Benutzung zu erlernen ich jedem nur wärmstens ans Herz legen kann: Cursor im Quellcode per Maus auf das Wort „TRegistry“ setzen und dann Taste „F1“ drücken).

MfG
Martin

Problem gelöst!
Ich konnte mein Problem mit folgendem Text lösen:

Procedure TForm1.ReadReg;
begin
Reg := TRegistry.Create;
If Reg.OpenKey(’\Software\CS-Software\Example’,True) then
begin
try
Edit1.Text := Reg.ReadString(‚Edit1Text‘); // String
Form1.Left := Reg.ReadInteger(‚WindowLeft‘); // Integer
CheckBox1.Checked :=Reg.WriteBool(‚IsCheckBox1Checked‘); // Boolean
finally
Reg.Free;
inherited;
end;
end;
end;

Danke an alle, die geholfen haben!

Gruß, Christoph