123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- {$mode objfpc}
- {$h+}
- unit inicol;
- interface
- Uses SysUtils,Classes,Inifiles;
- Type
- TIniCollectionItem = Class(TCollectionItem)
- protected
- function GetSectionName: String; virtual; abstract;
- procedure SetSectionName(const Value: String); virtual; abstract;
- Public
- Procedure SaveToIni(Ini: TCustomInifile; Section : String); Virtual; Abstract;
- Procedure LoadFromIni(Ini: TCustomInifile; Section : String); Virtual; Abstract;
- Procedure SaveToFile(FileName : String; Section : String);
- Procedure LoadFromFile(FileName : String; Section : String);
- Property SectionName : String Read GetSectionName Write SetSectionName;
- end;
- TIniCollection = Class(TCollection)
- private
- FFileName: String;
- FGlobalSection: String;
- protected
- FPrefix: String; // Descendent must set this.
- FSectionPrefix : String; // Descendent must set this too.
- Public
- Procedure Load;
- Procedure Save;
- Procedure SaveToIni(Ini: TCustomInifile; Section : String); virtual;
- Procedure SaveToFile(AFileName : String; Section : String);
- Procedure LoadFromIni(Ini: TCustomInifile; Section : String); virtual;
- Procedure LoadFromFile(AFileName : String; Section : String);
- Property Prefix : String Read FPrefix;
- Property SectionPrefix : String Read FSectionPrefix;
- Property FileName : String Read FFileName Write FFileName;
- Property GlobalSection : String Read FGlobalSection Write FGlobalSection;
- end;
- EIniCol = Class(Exception);
- Const
- KeyCount = 'Count';
- SGlobal = 'Global';
- implementation
- { TIniCollectionItem }
- resourcestring
- SErrNoFileName = '%s: Geen bestandsnaam gespecifieerd.';
- SErrNoSection = '%s: Geen [global] sectie gespecifieerd.';
- procedure TIniCollectionItem.LoadFromFile(FileName, Section: String);
- Var
- Ini : TMemInifile;
- begin
- Ini:=TMemInifile.Create(FileName);
- Try
- LoadFromIni(Ini,Section);
- Finally
- Ini.Free;
- end;
- end;
- procedure TIniCollectionItem.SaveToFile(FileName, Section: String);
- Var
- Ini : TMemInifile;
- begin
- Ini:=TMemInifile.Create(FileName);
- Try
- SaveToIni(Ini,Section);
- Ini.UpdateFile;
- Finally
- Ini.Free;
- end;
- end;
- { TIniCollection }
- procedure TIniCollection.Load;
- begin
- If (FFileName='') then
- Raise EIniCol.CreateFmt(SErrNoFileName,[ClassName]);
- If (GlobalSection='') then
- Raise EIniCol.CreateFmt(SErrNoSection,[ClassName]);
- LoadFromFile(FFileName,GlobalSection)
- end;
- procedure TIniCollection.LoadFromFile(AFileName, Section: String);
- Var
- Ini : TMemIniFile;
- begin
- Ini:=TMemInifile.Create(AFileName);
- Try
- LoadFromIni(Ini,Section);
- FFileName:=AFileName;
- FGlobalSection:=Section;
- Finally
- ini.Free;
- end;
- end;
- procedure TIniCollection.LoadFromIni(Ini: TCustomInifile; Section: String);
- Var
- ACount,I : Integer;
- N,SP : String;
- begin
- Clear;
- SP:=FSectionPrefix;
- If (SP<>'') then
- SP:=SP+'_';
- ACount:=Ini.ReadInteger(Section,KeyCount,0);
- For I:=1 to ACount do
- begin
- N:=Ini.ReadString(Section,Prefix+IntToStr(I),'');
- If (N<>'') then
- With Add as TIniCollectionItem do
- begin
- SectionName:=N;
- LoadFromIni(Ini,SP+N);
- end;
- end;
- end;
- procedure TIniCollection.Save;
- begin
- If (FFileName='') then
- Raise EIniCol.CreateFmt(SErrNoFileName,[ClassName]);
- If (GlobalSection='') then
- Raise EIniCol.CreateFmt(SErrNoSection,[ClassName]);
- SaveToFile(FFileName,GlobalSection)
- end;
- procedure TIniCollection.SaveToFile(AFileName, Section: String);
- Var
- Ini : TMemIniFile;
- begin
- Ini:=TMemInifile.Create(AFileName);
- Try
- Ini.CacheUpdates:=True;
- SaveToIni(Ini,Section);
- Ini.UpdateFile;
- finally
- Ini.Free;
- end;
- end;
- procedure TIniCollection.SaveToIni(Ini: TCustomInifile; Section: String);
- Var
- S,V,SP : String;
- I : Integer;
- CI : TIniCollectionItem;
- begin
- SP:=FSectionPrefix;
- if (SP<>'') then
- SP:=SP+'_';
- Ini.WriteInteger(Section,KeyCount,Count);
- For I:=0 to Count-1 do
- begin
- CI:=(Items[i]) as TIniCollectionItem;
- With CI do
- begin
- V:=SectionName;
- S:=Prefix+IntToStr(I+1);
- Ini.WriteString(Section,S,V);
- CI.SaveToIni(Ini,SP+V);
- end;
- end;
- end;
- end.
|