Code: Alles auswählen
IniF:=TIniFile.Create(pfad2prg+prgname);
Liebe Grüße und danke schon mal für Beiträge
Code: Alles auswählen
IniF:=TIniFile.Create(pfad2prg+prgname);
Code: Alles auswählen
procedure TFrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
// Abfrage, ob Datensatz zuvor noch gespeichert werden soll
case QuestionDlg('Vor Beenden Datensatz speichern?',strExit,mtInformation,
[mbYes,'Ja',mbNo,'Nein',mbIgnore,'Doch nicht beenden'],0) of
mrYes: begin
savedbf; // Speichern der Daten
CopyFile(dbfPfad+'archiv.dbf',dbfPfad+'archiv.dbf.bkp');
CopyFile(dbfPfad+'archiv.mdx',dbfPfad+'archiv.mdx.bkp');
iniF.WriteInteger('FrmMainPos','Left',Self.Left);
iniF.WriteInteger('FrmMainPos','Top',Self.Top);
iniF.WriteString('DB','dbPfad',dbfArchiv.FilePathFull);
iniF.UpdateFile;
InhaltListe.Free;
dbfArchiv.Exclusive:=False;
dbfArchiv.Close;
dbfArchiv.Active:=False;
dbfArchiv.Free;
iniF.Free;
end;
...
Offenbar nicht, denn sonst hättest du kein Speicherleck. Und an den Interna von TIniFile liegt es sicher nicht.and4more hat geschrieben:...also für alles was so erzeugt wird rufe ich am Schluss auch .Free auf
Code: Alles auswählen
function GetIniName: String;
begin
Result := ChangeFileExt(GetAppConfigFile(true), '.ini');
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ReadIni;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if CanClose then
try
WriteIni;
except
// Platte voll? ini-Datei durch anderen Prozess gesperrt? Diskette nicht eingelegt?
if MessageDlg('Fehler beim Schreiben der ini-Datei. Trotzdem beenden?', mtConfirmation, [mbYes, mbNo, mbcancel], 0) <> mrYes then
CanClose := false;
end;
end;
procedure TForm1.ReadIni;
var
ini: TIniFile;
begin
ini := TIniFile.Create(GetIniname);
try
Left := iniF.ReadInteger('FrmMainPos', 'Left' Left);
// etc.
finally
ini.Free;
end;
end;
procedure TForm1.WriteIni;
var
ini: TIniFile;
begin
ini := TIniFile.Create(GetIniName);
try
iniF.WriteInteger('FrmMainPos', 'Left', Left);
// etc.
finally
ini.Free;
end;
end;
Bei "Ja" räumst du auf und bei "Nein"?and4more hat geschrieben:Nachtrag: Automatisch heißt ich rufe alles explizit auf.Code: Alles auswählen
procedure TFrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin // Abfrage, ob Datensatz zuvor noch gespeichert werden soll case QuestionDlg('Vor Beenden Datensatz speichern?',strExit,mtInformation, [mbYes,'Ja',mbNo,'Nein',mbIgnore,'Doch nicht beenden'],0) of mrYes: begin .... iniF.Free; end; ...
Code: Alles auswählen
...
private
{ private declarations }
public
{ public declarations }
IniF:TIniFile;
blDBisDa:Boolean;
...
Code: Alles auswählen
...
IniF:=TIniFile.Create(IniPfad+'ORC'+ext);
...
Ich würde jedem Formular ein eigenes Readini und Writeini geben, so dass sich jedes Formular lokal eine TIniFile erzeugt, sich die benötigten Informationen rausholt (bzw. reinschreibt) und dann wieder freigibt. So bleibt alles kompakt und übersichtlich. Der Mehraufwand, die Ini-Datei jedesmal neu einzulesen, ist vernachlässigbar. Ich habe zahllose Programme. die nach diesem Schema mit Konfigurationsdaten umgehen. Wenn Parameter von mehreren Formularen gebraucht werden, deklariere ich üblicherweise einen globalen Record TSettings, der vom Hauptformular aus der Ini-Datei gelesen wird. TSettings ist in einer "Mehrzweck"-Unit mit allgemeinen Deklarationen, Konstanten und Variablen deklariert, die von allen in Frage kommenden Formularen eingebunden wird. Dadurch wird verhindert, dass ein Formular ein anderes benötigt, was früher oder später Probleme macht.and4more hat geschrieben:Nachtrag: @wp_xyz: hab' grad gesehen, es geht doch nicht so modular, da die INI-Datei zur Laufzeit von verschiedenen Fenstern bzgl. verschiedener Dinge abgefragt wird, wie z. B. an welcher Position das betreffende Fenster zuletzt geöffnet wurde, dann Pfad und Name der Datenbank und verschiedene andere Werte mit denen einzelne Units arbeiten, sodass Read und Write-Funktionen nicht in dieser Form modularisierbar sind. Verwenden könnte man allerdings die GetIniName Funktion, aber macht das Sinn wenn der Name der Ini-Datei feststeht und sich eh nicht ändert? Die Dateiendung läuft bei mir aus Kompatibilitätsgründen zu Linux als Variable "ext" (.ini bzw..conf mit Pragma {$MSWINDOWS bzw. UNIX)
Die Ini-Datei wird nur in der Main-Unit erzeugt und dort auch wieder freigegeben, alle anderen Units beziehen sich auf die dort erzeugte Instanz.