Главная страница
    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.034 c
11-1082719819
BolikDimon
2004-04-23 15:30
2004.11.14
Использование KOL в БД-приложениях


14-1098872047
ArMellon
2004-10-27 14:14
2004.11.14
Бесплатные коллекции MP3 для скачиванивания


14-1098881227
Snip
2004-10-27 16:47
2004.11.14
Права в NTFS


1-1099216609
saNat
2004-10-31 12:56
2004.11.14
Чтение файлов Word


1-1099031587
Devel
2004-10-29 10:33
2004.11.14
Unicode





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