Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Это интересно. Сохранение форм, компоентов...   Найти похожие ветки 

 
Вуаа   (2004-04-20 22:35) [0]

У меня не отработало. Я любитель, может Вы разберетесь?

uses TypInfo;

{ Определяем тип-набор для доступа к битам целого. }
const

BitsPerByte = 8;
type

TIntegerSet = set of 0..SizeOf(Integer)*BitsPerByte - 1;

{ Сохраняем набор свойств в виде подключа. Каждый элемент перечислимого типа -

отдельная логическая величина. Истина означает что элемент включен в набор,
Ложь - элемент в наборе отсутствует. Это позволит пользователю
с помощью редактора ресурсов (REGEDIT) легко изменять конфигурацию. }
procedure SaveSetToRegistry(const Name: string; Value: Integer;

TypeInfo: PTypeInfo; Reg: TRegistry);
var

OldKey: string;
I: Integer;
begin

TypeInfo := GetTypeData(TypeInfo)^.CompType;
OldKey := "\" + Reg.CurrentPath;
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[Name]);

{ Организуем цикл для всех элементов перечислимого типа. }
with GetTypeData(TypeInfo)^ do
for I := MinValue to MaxValue do
{ Записываем логическую величину для каждого установленного элемента. }
Reg.WriteBool(GetEnumName(TypeInfo, I), I in
TIntegerSet(Value));

{ Возвращаем родительский ключ. }
Reg.OpenKey(OldKey, False);
end;

{ Сохраняем объект в регистрах в отдельном подключе. }
procedure SaveObjToRegistry(const Name: string; Obj: TPersistent;

Reg: TRegistry);
var

OldKey: string;
begin

OldKey := "\" + Reg.CurrentPath;
{ Открываем подключ для объекта. }
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[Name]);

{ Сохраняем свойства объекта. }
SaveToRegistry(Obj, Reg);

{ Возвращаем родительский ключ. }
Reg.OpenKey(OldKey, False);
end;

{ Сохраняем в регистрах метод путем записи его имени. }
procedure SaveMethodToRegistry(const Name: string; const Method:
TMethod;

Reg: TRegistry);
var

MethodName: string;
begin

{ Если указатель на метод содержит nil, сохраняем пустую строку. }
if Method.Code = nil then
MethodName := ""
else
{ Находим имя метода. }
MethodName := TObject(Method.Data).MethodName(Method.Code);
Reg.WriteString(Name, MethodName);
end;

{ Сохраняем в регистре каждое свойство в виде значения текущего
ключа. }
procedure SavePropToRegistry(Obj: TPersistent; PropInfo: PPropInfo;
Reg: TRegistry);
begin

with PropInfo^ do
case PropType^.Kind of
tkInteger,
tkChar,
tkWChar:
{ Сохраняем порядковые свойства в виде целочисленного значения. }
Reg.WriteInteger(Name, GetOrdProp(Obj, PropInfo));
tkEnumeration:
{ Сохраняем имена перечислимых величин. }
Reg.WriteString(Name, GetEnumName(PropType, GetOrdProp(Obj,
PropInfo)));

tkFloat:
{ Сохраняем реальные числа как Doubles. }
Reg.WriteFloat(Name, GetFloatProp(Obj, PropInfo));
tkString,
tkLString:
{ Сохраняем строки как строки. }
Reg.WriteString(Name, GetStrProp(Obj, PropInfo));
tkVariant:
{ Сохраняем вариантные величины как строки. }
Reg.WriteString(Name, GetVariantProp(Obj, PropInfo));
tkSet:
{ Сохраняем набор как подключ. }
SaveSetToRegistry(Name, GetOrdProp(Obj, PropInfo), PropType,
Reg);

tkClass:
{ Сохраняем класс как подключ, а его свойства
в виде значений подключа. }
SaveObjToRegistry(Name, TPersistent(GetOrdProp(Obj, PropInfo)),
Reg);

tkMethod:
{ Сохраняем в регистрах метод путем записи его имени. }
SaveMethodToRegistry(Name, GetMethodProp(Obj, PropInfo), Reg);
end;
end;

{ Записываем объект в регистр, сохраняя опубликованные свойства. }
procedure SaveToRegistry(Obj: TPersistent; Reg: TRegistry);
var

PropList: PPropList;
PropCount: Integer;
I: Integer;
begin

{ Получаем список опубликованных свойств. }
PropCount := GetTypeData(Obj.ClassInfo)^.PropCount;
GetMem(PropList, PropCount*SizeOf(PPropInfo));
try
GetPropInfos(Obj.ClassInfo, PropList);
{ Сохраняем каждое свойство в виде значения текущего ключа. }
for I := 0 to PropCount-1 do
SavePropToRegistry(Obj, PropList^[I], Reg);
finally
FreeMem(PropList, PropCount*SizeOf(PPropInfo));
end;
end;

{ Сохраняем опубликованные свойства в виде значения данного ключа.

Корневой улей - HKEY_CURRENT_USER. }
procedure SaveToKey(Obj: TPersistent; const KeyPath: string);
var

Reg: TRegistry;
begin

Reg := TRegistry.Create;
try
if not Reg.OpenKey(KeyPath, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[KeyPath]);

SaveToRegistry(Obj, Reg);
finally
Reg.Free;
end;
end;


 
Вуаа   (2004-04-20 22:35) [0]

У меня не отработало. Я любитель, может Вы разберетесь?

uses TypInfo;

{ Определяем тип-набор для доступа к битам целого. }
const

BitsPerByte = 8;
type

TIntegerSet = set of 0..SizeOf(Integer)*BitsPerByte - 1;

{ Сохраняем набор свойств в виде подключа. Каждый элемент перечислимого типа -

отдельная логическая величина. Истина означает что элемент включен в набор,
Ложь - элемент в наборе отсутствует. Это позволит пользователю
с помощью редактора ресурсов (REGEDIT) легко изменять конфигурацию. }
procedure SaveSetToRegistry(const Name: string; Value: Integer;

TypeInfo: PTypeInfo; Reg: TRegistry);
var

OldKey: string;
I: Integer;
begin

TypeInfo := GetTypeData(TypeInfo)^.CompType;
OldKey := "\" + Reg.CurrentPath;
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[Name]);

{ Организуем цикл для всех элементов перечислимого типа. }
with GetTypeData(TypeInfo)^ do
for I := MinValue to MaxValue do
{ Записываем логическую величину для каждого установленного элемента. }
Reg.WriteBool(GetEnumName(TypeInfo, I), I in
TIntegerSet(Value));

{ Возвращаем родительский ключ. }
Reg.OpenKey(OldKey, False);
end;

{ Сохраняем объект в регистрах в отдельном подключе. }
procedure SaveObjToRegistry(const Name: string; Obj: TPersistent;

Reg: TRegistry);
var

OldKey: string;
begin

OldKey := "\" + Reg.CurrentPath;
{ Открываем подключ для объекта. }
if not Reg.OpenKey(Name, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[Name]);

{ Сохраняем свойства объекта. }
SaveToRegistry(Obj, Reg);

{ Возвращаем родительский ключ. }
Reg.OpenKey(OldKey, False);
end;

{ Сохраняем в регистрах метод путем записи его имени. }
procedure SaveMethodToRegistry(const Name: string; const Method:
TMethod;

Reg: TRegistry);
var

MethodName: string;
begin

{ Если указатель на метод содержит nil, сохраняем пустую строку. }
if Method.Code = nil then
MethodName := ""
else
{ Находим имя метода. }
MethodName := TObject(Method.Data).MethodName(Method.Code);
Reg.WriteString(Name, MethodName);
end;

{ Сохраняем в регистре каждое свойство в виде значения текущего
ключа. }
procedure SavePropToRegistry(Obj: TPersistent; PropInfo: PPropInfo;
Reg: TRegistry);
begin

with PropInfo^ do
case PropType^.Kind of
tkInteger,
tkChar,
tkWChar:
{ Сохраняем порядковые свойства в виде целочисленного значения. }
Reg.WriteInteger(Name, GetOrdProp(Obj, PropInfo));
tkEnumeration:
{ Сохраняем имена перечислимых величин. }
Reg.WriteString(Name, GetEnumName(PropType, GetOrdProp(Obj,
PropInfo)));

tkFloat:
{ Сохраняем реальные числа как Doubles. }
Reg.WriteFloat(Name, GetFloatProp(Obj, PropInfo));
tkString,
tkLString:
{ Сохраняем строки как строки. }
Reg.WriteString(Name, GetStrProp(Obj, PropInfo));
tkVariant:
{ Сохраняем вариантные величины как строки. }
Reg.WriteString(Name, GetVariantProp(Obj, PropInfo));
tkSet:
{ Сохраняем набор как подключ. }
SaveSetToRegistry(Name, GetOrdProp(Obj, PropInfo), PropType,
Reg);

tkClass:
{ Сохраняем класс как подключ, а его свойства
в виде значений подключа. }
SaveObjToRegistry(Name, TPersistent(GetOrdProp(Obj, PropInfo)),
Reg);

tkMethod:
{ Сохраняем в регистрах метод путем записи его имени. }
SaveMethodToRegistry(Name, GetMethodProp(Obj, PropInfo), Reg);
end;
end;

{ Записываем объект в регистр, сохраняя опубликованные свойства. }
procedure SaveToRegistry(Obj: TPersistent; Reg: TRegistry);
var

PropList: PPropList;
PropCount: Integer;
I: Integer;
begin

{ Получаем список опубликованных свойств. }
PropCount := GetTypeData(Obj.ClassInfo)^.PropCount;
GetMem(PropList, PropCount*SizeOf(PPropInfo));
try
GetPropInfos(Obj.ClassInfo, PropList);
{ Сохраняем каждое свойство в виде значения текущего ключа. }
for I := 0 to PropCount-1 do
SavePropToRegistry(Obj, PropList^[I], Reg);
finally
FreeMem(PropList, PropCount*SizeOf(PPropInfo));
end;
end;

{ Сохраняем опубликованные свойства в виде значения данного ключа.

Корневой улей - HKEY_CURRENT_USER. }
procedure SaveToKey(Obj: TPersistent; const KeyPath: string);
var

Reg: TRegistry;
begin

Reg := TRegistry.Create;
try
if not Reg.OpenKey(KeyPath, True) then
raise ERegistryException.CreateFmt("Не могу создать ключ: %s",
[KeyPath]);

SaveToRegistry(Obj, Reg);
finally
Reg.Free;
end;
end;


 
Sun bittern ©   (2004-04-21 06:29) [1]

ReadComponent/WriteComponent ?

P.S. Из реестра видать, делать помойку уже стало модно :(


 
Sun bittern ©   (2004-04-21 06:29) [1]

ReadComponent/WriteComponent ?

P.S. Из реестра видать, делать помойку уже стало модно :(



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
7-1080119578
Начинающий веб-дизайнер
2004-03-24 12:12
2004.05.09
Программное извлечение диска.


7-1080554218
BALU1111
2004-03-29 13:56
2004.05.09
TListView


14-1082439726
bar
2004-04-20 09:42
2004.05.09
Народ. Правда, что студентов лишат отсрочек от армии?


1-1082724306
ivn
2004-04-23 16:45
2004.05.09
TGridDrawInfo?


14-1082473786
Undert
2004-04-20 19:09
2004.05.09
нЕ подскажете что за кодировка ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский