Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Способы хранения на диске большого кол-ва переменных НЕ в БД   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.06 c
3-1097867801
Zif
2004-10-15 23:16
2004.11.14
Как записать путь к файлу в БД, используя OpenDialog?


8-1092130763
dimon_programmer
2004-08-10 13:39
2004.11.14
Объясните про палитру


14-1098558826
CPUz80
2004-10-23 23:13
2004.11.14
Работа процессов в WIN32.


1-1099339331
Skiter
2004-11-01 23:02
2004.11.14
Работа с TImages


3-1097754510
Aleksandr.
2004-10-14 15:48
2004.11.14
Как проверить реальный тип данных поля в Парадоксе?