Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.081 c
14-1098805148
Сайбель Алексей
2004-10-26 19:39
2004.11.14
Клещ


6-1094656877
xmrz
2004-09-08 19:21
2004.11.14
IHTMLInputFileElement value?


1-1099041836
Tom
2004-10-29 13:23
2004.11.14
Рисую на форме в Run Time...


14-1098875375
alles
2004-10-27 15:09
2004.11.14
Трабл с Default


1-1098949317
Ricko
2004-10-28 11:41
2004.11.14
Поток или Таймер





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский