Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизСпособы хранения на диске большого кол-ва переменных НЕ в БД Найти похожие ветки
← →
_Kirill_ (2004-10-28 14:41) [0]Ситуация такова:
Есть несколько классов с большим кол-вом свойств типа integer или single, а также свойств-ссылок на подобные же классы.
Есть желание сохранять на диске и загружать все эти свойства при этом не используя БД.
Каким способом быстрее и эффективнее это сделать?
Спасибо.
← →
Digitman © (2004-10-28 15:06) [1]воспользуйся готовым streaming-механизмом
сделай свои классы наследниками TPersistent, а еще лучше - TComponent (если они таковыми у тебя не являются)
тогда для поточного сохранения/восстановления любого твоего объекта можно будет воспользоваться методами TStream.Read/WriteComponent
← →
_Kirill_ (2004-10-28 16:04) [2]Я так и сделал, но при этом не сохраняются свойства-ссылки на другие объекты.
Еще вопрос - каким методом можно обратиться ко всем свойствам объекта - т.е. получить имена и значения свойств.
← →
Digitman © (2004-10-28 16:21) [3]
> Я так и сделал, но при этом не сохраняются свойства-ссылки
> на другие объекты
не выдумывай.
все замечательно сохраняется.
на то есть TPersistent.Defineproperties()
← →
cae © (2004-10-28 16:35) [4]>каким методом можно обратиться ко всем свойствам объекта - т.е. получить имена и значения свойств
GetComponentProperties
или
GetPropList
← →
_Kirill_ (2004-10-28 16:56) [5]
> на то есть TPersistent.Defineproperties()
а можно примерчик маленький?
← →
Digitman © (2004-10-28 16:58) [6]
> можно примерчик маленький?
нельзя.
их ну просто навалом, в исх.текстах VCL
← →
_Kirill_ (2004-10-28 17:10) [7]
> нельзя.
>
> их ну просто навалом, в исх.текстах VCL
и на том спасибо
← →
Defunct © (2004-10-28 18:39) [8]_Kirill_ (28.10.04 14:41)
Кирил, скажите, а что вам запрещает у общего предка ввести процедуры: Load/Save. И ТУПО СОХРАНЯТЬ В ФАЙЛ ВСЕ СВОЙСТВА КАК ЕСТЬ?
Меня порой просто бесит нежелание некоторых просто немного подумать. Я вам даже пример могу дать:
Вот такой карты элемента достаточно для четкой идентификации объекта при восстановлении из файла:{ Карта настройки элемента библиотеки }
{ Derived from Ptives.pas v.1.153 }
PDataRecMap = ^TComponentMap;
TDataRecMap = packed Record
ObjectType : Byte; // Тип данного экземпляра
ObjectID : Cardinal; // Идентификационный номер
ObjectKey : Cardinal; // Уникальный ключ объекта
ObjectContainer : Cardinal; // Номер библиотеки поставщика
Rate : Cardinal; // Частота
Date : TDateTime; // Дата модификации объекта
Weight : Cardinal; // Вес
Value : Byte; // Значение
BitField : Byte; // Битовое поле, для хранения 8-ми состояний
CheckSum : Byte; // Контрольная сумма данных (для проверки)
ObjectName : ShortString;// Имя данного экземпляра
End;
Это сам опорный объект, в который вводятся методы сохранения/восстановления:
{ Элементарный элемент библиотек }
{ Derived from Ptives.pas v.1.153 (modified TComponent) }
TDataControl = Class(TDataObject)
Private
FIOStatus : Boolean;
... какие-то приватные поля и методы работы с ними
Private
// Инструментарий обслуживания модификаций и учета элементов
...
Public
ObjectMap : TDataRecMap;
Property Correct:Boolean Read FIOStatus;
... другие свойства, которые все размещены в ObjectMap
Constructor Create;Virtual;
Procedure ResetMap;Virtual;
Procedure Save(Stream: TMemoryStream);Virtual;
Procedure Load(Stream: TMemoryStream);Virtual;
Destructor Destroy;Override;
End;
Procedure TDataControl.Save;
Begin
ObjectMap.CheckSum := CheckSum;
Try
Stream.Write( ObjectMap, SizeOf(ObjectMap)-SizeOf(ObjectMap.ObjectName));
Stream.Write( ObjectMap.ObjectName[0], 1);
If Byte(ObjectMap.ObjectName[0])>0 Then
Stream.Write( ObjectMap.ObjectName[1], Byte(ObjectMap.ObjectName[0]));
Except
FIOStatus :=False;
End;
End;
Procedure TDataControl.Load;
Var NameSize: Byte;
Begin
Try
Stream.Read( ObjectMap, SizeOf(ObjectMap)-SizeOf(ObjectMap.ObjectName));
Stream.Read( NameSize, 1);
Stream.Read( ObjectMap.ObjectName[1], NameSize );
ObjectMap.ObjectName[0] := Chr(NameSize);
If CheckSum <> ObjectMap.CheckSum Then FIOStatus := False
Else FIOStatus := True;
Except
FIOStatus := False;
End;
{ If Not Correct Then
ShowMessage("Error reading DB file");}
Application.ProcessMessages;
End;
Все последующие наследники перекрывают процедуры Save/Load например так:
Procedure TDiscreteSignal.Save;
Var NValue : Byte;
Begin
Inherited;
NValue := NormalValue;
Stream.Write( NValue, 1);
End;
Procedure TDiscreteSignal.Load;
Var NValue : Byte;
Begin
Inherited;
Stream.Read( NValue, 1);
NormalValue := NValue;
End;
Вот собсно все потом созданный Stream записываем в файл. Точно также и восстанавливаем. Прочитали Stream из файла и начали создавать и настраивать объекты.
Причем так, создали TDataControl, прочитали из стрима его карту настройки (свойства), установили тип объекта, создали объект требуемого класса, выполнили Assign загруженного TDataControl к экземпляру вновь созданного экземпляра, и догрузили оставшиеся данные(свойства) характерные для созданного экземпляра класса. И т.д. пока стрим не пуст.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c