ich habe versucht - und es eigentlich auch geschafft

Ich brauche so eine Art "kaskadierende" .INI-Datei.
"Gestern hat es noch alles funktioniert."

Kann mir bitte jemand einen Tipp geben, warum das nicht funktioniert? Ich seh' den Wald anscheinend vor lauter Bäumen nicht, obwohl der Wald hier extrem übersichtlich ist.
System: Win 10 22H2
Lazarus V 2.2.6, FPC 3.2.2 X86_64-win64-win32/win64
Code: Alles auswählen
unit MergedINIFiles;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, INIFiles;
type
{ TMergedINIFile }
TMergedINIFile = Class (TINIFile)
private
FFiles : TStringArray;
FOverwrite : Boolean;
public
constructor Create(FilesToMerge : TStringArray; DoOverwrite : Boolean = false; AOptions : TIniFileOptions = []); overload;
constructor Create(FilesToMerge : TStrings; DoOverwrite : Boolean = false; AOptions : TIniFileOptions = []); overload;
procedure Reload;
property Files : TStringArray read FFiles write FFiles;
property Overwrite : Boolean read FOverwrite write FOverwrite;
end;
implementation
{ TMergedINIFile }
constructor TMergedINIFile.Create(FilesToMerge: TStringArray; DoOverwrite: Boolean; AOptions: TIniFileOptions);
begin
inherited Create ('', AOptions);
FOverwrite := DoOverwrite;
FFiles := Copy (FilesToMerge, 1);
Reload;
end;
constructor TMergedINIFile.Create(FilesToMerge: TStrings; DoOverwrite: Boolean; AOptions: TIniFileOptions);
begin
Create (FilesToMerge.ToStringArray, DoOverwrite, AOptions);
end;
procedure TMergedINIFile.Reload;
var
ti : TINIFile;
sl : TStrings;
vl : TStrings;
f : Integer;
s : Integer;
v : Integer;
begin
// if the files array is empty leave
if Length(FFiles) = 0 then Exit;
try
// sectionlist
sl := TStrings.Create;
// valuelist
vl := TStrings.Create;
// remove old sections on reload
ReadSections(sl);
For s := 0 to sl.Count -1 do
EraseSection(sl[s]);
// cycle through the files
for f := Low(FFiles) to High(FFiles) do
begin
if FileExists(FFiles[f]) then
try
// open file
ti := TINIFile.Create (FFiles[f], Self.Options);
// get the sections
ti.ReadSections(sl);
For s := 0 to sl.Count -1 do
begin
// for each section get the values
ti.ReadSection(sl[s], vl);
For v := 0 to vl.Count -1 do
// if overwrite is true or value does not exist write the value to the merged ini
if FOverwrite or ((not FOverwrite) and (not ValueExists(sl[s], vl[v]))) then
WriteString(sl[s], vl[v], ti.ReadString(sl[s], vl[v], ''));
end;
finally
// remove the current file from memory
ti.Free;
end;
end;
finally
// remove the section and value lists
sl.Free;
vl.Free;
end;
end;
end.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, MergedINIFiles;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
i : TMergedINIFile;
begin
i := TMergedINIFile.Create(['a.ini','b.ini','c.ini']);
end;
end.