Расширение класса TIniFile для записи/чтения объектов


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;  
Теги:
TIniFile
Добавлено: 26 Июля 2018 20:57:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...