Das mit dem "erst beim Beenden speichern" hatte ich vorher so gemacht. Aber wenn Größe und Position eines Formulars welches nicht das Hauptformular ist gespeichert werden soll gab das Probleme (falsche Werte usw). Daher speichere ich zwischen. Funktioniert wunderbar und die Zahlen sind immer aktuell.
Was spricht dagegen, erstens zwei private Methode zum Lesen und Speichern von Formulargrösse und -position einzubauen, in der direkt diese fünf Parameter in Registry, Datenbank oder Inidatei gespeichert werden?
Und was spricht zweitens dagegen, diese Methode dann in der OnClose-Ereignisbehandlung aufzurufen?
Ich mach das schon immer so und hatte damit noch nie Probleme. Hier ein Beispiel, wie man aus einer Datenbank (die vielleicht auch von mehreren Clients verwendet wird), die individuellen Daten zur Wiederherstellung der individuellen Programmoptionen ausliest und wieder zurückschreibt, der Einfachheit halber reduziert auf Fensterposition, -grösse und Windowstate:
Delphi-Quellcode:
Procedure FormSoundSo.FormParamsRead;
begin
Left := DM.QueryUser.FieldByName('SOUNDSO_LEFT').AsInteger;
Top := DM.QueryUser.FieldByName('SOUNDSO_TOP').AsInteger;
Width := DM.QueryUser.FieldByName('SOUNDSO_WIDTH').AsInteger;
Height := DM.QueryUser.FieldByName('SOUNDSO_HEIGHT').AsInteger;
if DM.QueryUser.FieldByName('SOUNDSO_MAX').AsBoolean then
Windowstate := wsMaximized else
Windowstate := wsNormal;
end;
Procedure FormSoundSo.FormParamsWrite;
var
Maxi : Boolean;
begin
Maxi := Windowstate = wsMaximized;
Windowstate := wsNormal;
DM.QueryUser.Edit;
DM.QueryUser.FieldByName('SOUNDSO_LEFT').AsInteger := Left;
DM.QueryUser.FieldByName('SOUNDSO_TOP').AsInteger Top;
DM.QueryUser.FieldByName('SOUNDSO_WIDTH').AsInteger := Width;
DM.QueryUser.FieldByName('SOUNDSO_HEIGHT').AsInteger := Height;
DM.QueryUser.FieldByName('SOUNDSO_MAX').AsBoolean := Maxi;
DM.QueryUser.Post;
end;
Procedure FormSoundSo.FormShow(Sender: TObject);
begin
FormParamsRead;
end;
Procedure FormSoundSo.FormClose(Sender : TObject; Var Action : TCloseAction);
begin
FormParamsWrite;
end;
Genauso (war mir jetzt zu aufwendig, das hier reinzutippen) würde man das beim Lesen von bzw. Schreiben in eine Inidatei oder Registry machen. Wenn du das jedesmal zwischenspeicherst, hast du das doppelt gespeichert. Ich weiß keinen Grund, diese Daten im Programm doppelt zu speichern.