Пятница, 17.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Примеры Delphi

Расширение класса 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;

Получить ссылку на материал

Категория: Примеры Delphi | Добавил: Барон (12.12.2011)
Просмотров: 866 | Теги: объект, чтения, записи, TIniFile, Класс | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2024
Яндекс цитирования