2015-06-27 19:33:50 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
|
|
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
2015-05-14 22:35:07 +03:00
|
|
|
|
unit IniFile;
|
|
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
|
|
uses System.Collections;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
TIniFile = class
|
|
|
|
|
|
fname: string;
|
|
|
|
|
|
sl: SortedList;
|
|
|
|
|
|
function IndexOfSection(Section: string): integer;
|
|
|
|
|
|
function IndexOfIdent(SectionNum: integer; Ident: string): integer;
|
|
|
|
|
|
public
|
|
|
|
|
|
constructor Create(name: string);
|
|
|
|
|
|
procedure Save;
|
|
|
|
|
|
property FileName: string read fname;
|
|
|
|
|
|
procedure WriteString(Section,Ident: string; Value: string);
|
|
|
|
|
|
function ReadString(Section,Ident: string; DefaultValue: string): string;
|
|
|
|
|
|
procedure WriteInteger(Section,Ident: string; Value: integer);
|
|
|
|
|
|
procedure WriteBoolean(Section,Ident: string; Value: boolean);
|
|
|
|
|
|
function ReadInteger(Section,Ident: string; DefaultValue: integer): integer;
|
|
|
|
|
|
function ReadBoolean(Section,Ident: string; DefaultValue: boolean): boolean;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
|
|
constructor TIniFile.Create(name: string);
|
|
|
|
|
|
var
|
|
|
|
|
|
f: text;
|
|
|
|
|
|
s,Section,Ident,Value: string;
|
|
|
|
|
|
p: integer;
|
|
|
|
|
|
sl1: SortedList;
|
|
|
|
|
|
begin
|
|
|
|
|
|
sl := new SortedList;
|
|
|
|
|
|
fname := name;
|
|
|
|
|
|
assign(f,fname);
|
|
|
|
|
|
if not FileExists(fname) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
rewrite(f);
|
|
|
|
|
|
closefile(f);
|
|
|
|
|
|
end
|
|
|
|
|
|
else
|
|
|
|
|
|
begin
|
|
|
|
|
|
try
|
|
|
|
|
|
Section := '';
|
|
|
|
|
|
reset(f);
|
|
|
|
|
|
while not eof(f) do
|
|
|
|
|
|
begin
|
|
|
|
|
|
readln(f,s);
|
|
|
|
|
|
s := Trim(s);
|
|
|
|
|
|
if Length(s)=0 then
|
|
|
|
|
|
continue;
|
|
|
|
|
|
if s[1]='[' then // Section
|
|
|
|
|
|
begin
|
|
|
|
|
|
section := Copy(s,2,Length(s)-2);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if IndexOfSection(Section)<0 then
|
|
|
|
|
|
sl.Add(Section,new SortedList);
|
|
|
|
|
|
end
|
|
|
|
|
|
else
|
|
|
|
|
|
begin
|
|
|
|
|
|
if Section = '' then
|
|
|
|
|
|
continue;
|
|
|
|
|
|
p := Pos('=',s);
|
|
|
|
|
|
if p=0 then
|
|
|
|
|
|
continue;
|
|
|
|
|
|
Ident := Copy(s,1,p-1);
|
|
|
|
|
|
Delete(s,1,p);
|
|
|
|
|
|
Value := s;
|
|
|
|
|
|
sl1 := SortedList(sl[Section]);
|
|
|
|
|
|
sl1[Ident] := Value;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
except
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
end;
|
|
|
|
|
|
close(f);
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TIniFile.IndexOfSection(Section: string): integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := sl.IndexOfKey(Section);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TIniFile.IndexOfIdent(SectionNum: integer; Ident: string): integer;
|
|
|
|
|
|
var sl1: SortedList;
|
|
|
|
|
|
begin
|
|
|
|
|
|
sl1 := SortedList(sl.GetByIndex(SectionNum));
|
|
|
|
|
|
Result := sl1.IndexOfKey(Ident);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure TIniFile.Save;
|
|
|
|
|
|
var
|
|
|
|
|
|
i,j: integer;
|
|
|
|
|
|
sl1: SortedList;
|
|
|
|
|
|
f: text;
|
|
|
|
|
|
begin
|
|
|
|
|
|
assign(f,fname);
|
|
|
|
|
|
rewrite(f);
|
|
|
|
|
|
for i:=0 to sl.Count-1 do
|
|
|
|
|
|
begin
|
|
|
|
|
|
writeln(f,'['+sl.GetKey(i)+']');
|
|
|
|
|
|
sl1 := SortedList(sl.GetByIndex(i));
|
|
|
|
|
|
for j:=0 to sl1.Count-1 do
|
|
|
|
|
|
writeln(f,sl1.GetKey(j)+'='+string(sl1.GetByIndex(j)));
|
|
|
|
|
|
writeln(f);
|
|
|
|
|
|
end;
|
|
|
|
|
|
close(f);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TIniFile.WriteString(Section,Ident: string; Value: string);
|
|
|
|
|
|
var
|
|
|
|
|
|
i: integer;
|
|
|
|
|
|
sl1: SortedList;
|
|
|
|
|
|
begin
|
|
|
|
|
|
i := IndexOfSection(Section);
|
|
|
|
|
|
if i<0 then
|
|
|
|
|
|
begin
|
|
|
|
|
|
// Create Section
|
|
|
|
|
|
sl1 := new SortedList;
|
|
|
|
|
|
sl1[Ident] := Value;
|
|
|
|
|
|
sl[Section] := sl1;
|
|
|
|
|
|
end
|
|
|
|
|
|
else
|
|
|
|
|
|
begin
|
|
|
|
|
|
sl1 := SortedList(sl.GetByIndex(i));
|
|
|
|
|
|
sl1[Ident] := Value
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TIniFile.ReadString(Section,Ident: string; DefaultValue: string): string;
|
|
|
|
|
|
var
|
|
|
|
|
|
i,j: integer;
|
|
|
|
|
|
sl1: SortedList;
|
|
|
|
|
|
begin
|
|
|
|
|
|
i := IndexOfSection(Section);
|
|
|
|
|
|
if i<0 then
|
|
|
|
|
|
Result := DefaultValue
|
|
|
|
|
|
else
|
|
|
|
|
|
begin
|
|
|
|
|
|
sl1 := SortedList(sl.GetByIndex(i));
|
|
|
|
|
|
j := IndexOfIdent(i,Ident);
|
|
|
|
|
|
if j<0 then
|
|
|
|
|
|
Result := DefaultValue
|
|
|
|
|
|
else Result := string(sl1.GetByIndex(j));
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TIniFile.WriteInteger(Section,Ident: string; Value: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
WriteString(Section,Ident,IntToStr(Value));
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TIniFile.WriteBoolean(Section,Ident: string; Value: boolean);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if Value then
|
|
|
|
|
|
WriteString(Section,Ident,'True')
|
|
|
|
|
|
else WriteString(Section,Ident,'False')
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TIniFile.ReadInteger(Section,Ident: string; DefaultValue: integer): integer;
|
|
|
|
|
|
var
|
|
|
|
|
|
s: string;
|
|
|
|
|
|
i,err: integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
s := ReadString(Section,Ident,IntToStr(DefaultValue));
|
|
|
|
|
|
Val(s,i,err);
|
|
|
|
|
|
if err=0 then
|
|
|
|
|
|
Result := i
|
|
|
|
|
|
else Result := 0;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TIniFile.ReadBoolean(Section,Ident: string; DefaultValue: boolean): boolean;
|
|
|
|
|
|
var s: string;
|
|
|
|
|
|
begin
|
|
|
|
|
|
if DefaultValue then
|
|
|
|
|
|
s := ReadString(Section,Ident,'True')
|
|
|
|
|
|
else s := ReadString(Section,Ident,'False');
|
|
|
|
|
|
Result := UpperCase(s) = 'TRUE'
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
end.
|