type
textendedinifile = class (tinifile)
public
procedure writeobject (aobject: tobject; const section: string);
procedure readobject (aobject: tobject; const section: string);
end;
implementation
{$r *.dfm}
uses typinfo;
type
tpropinfo = record
name: string;
kind: ttypekind;
end;
tpropinfoarray = array of tpropinfo;
function getpropertynames (aclass: tclass): tpropinfoarray;
var
i,cnt: integer;
pti: ptypeinfo;
pproplst: pproplist;
begin
pti := ptypeinfo(aclass.classinfo);
getmem (pproplst,high(tproplist));
try
cnt := getproplist(
pti,
[tkinteger, tkchar, tkenumeration, tkfloat, tkstring,
tkset, tkwchar, tklstring, tkwstring,tkint64],
pproplst
);
setlength(result,cnt);
for i := 0 to cnt-1 do
begin
result[i].name := pproplst^[i].name;
result[i].kind := pproplst^[i].proptype^.kind;
end;
finally
freemem (pproplst);
end;
end;
{ textendedinifile }
procedure textendedinifile.readobject(aobject: tobject; const section: string);
var
i: integer;
props: tpropinfoarray;
v: variant;
begin
props := getpropertynames(aobject.classtype);
for i := 0 to high(props) do
begin
case props[i].kind of
tkinteger,tkint64:
setordprop(aobject,props[i].name,readinteger(section,props[i].name,0));
tkstring,tklstring,tkwstring,tkchar,tkwchar:
setstrprop(aobject,props[i].name,readstring(section,props[i].name,''));
tkfloat:
setfloatprop(aobject,props[i].name,readfloat(section,props[i].name,0));
tkenumeration:
setenumprop(aobject,props[i].name,readstring(section,props[i].name,''));
tkset:
setsetprop(
aobject,
props[i].name,
readstring (section,props[i].name,'')
);
end;
end;
end;
procedure textendedinifile.writeobject(aobject: tobject; const section: string);
var
i: integer;
props: tpropinfoarray;
v: variant;
begin
props := getpropertynames(aobject.classtype);
for i := 0 to high(props) do
begin
v := getpropvalue(aobject,props[i].name);
case props[i].kind of
tkinteger,tkint64:
writeinteger (section,props[i].name,v);
tkstring,tklstring,tkwstring,tkchar,tkwchar:
writestring (section,props[i].name,v);
tkfloat:
writefloat (section,props[i].name,v);
tkenumeration:
writestring (section,props[i].name,
getenumprop(aobject,props[i].name));
tkset:
begin
writestring(
section,
props[i].name,
getsetprop(aobject,props[i].name,true)
);
end;
else
begin
// Этого не должно случиться
// ибо в getpropertynames мы фильтруем
// только нужные нам типы свойств
assert (false,'unsupported property type');
end;
end;
end;
end;
Использование.
// запись объекта
var
ini: textendedinifile;
begin
ini := textendedinifile.create('d:\form.ini');
try
// Сохраняем, что угодно
ini.writeobject(self,'form');
ini.writeobject(font,'font');
finally
ini.free;
end;
end;
// чтение объекта
var
ini: textendedinifile;
begin
ini := textendedinifile.create('d:\form.ini');
try
ini.readobject(font,'font');
ini.readobject(self,'form');
finally
ini.free;
end;
end;
|