Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранение данных, древовидная структура 
:(
    Опции темы
Pavelbej
Дата 10.10.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6



Здравствуйте!

Так уж случилось, что моя тупость не позволила беспокоится о будущем развитии программы. И вот попал.
Не ожидая особой активности пользователей, начал опускать руки. Но не тут то было. Начали сыпится письма с просьбами о развитии, о добавлении новых фич и т.д.
И вот здесь и начались танцы с бубном. В программе использую всем известный VirtualStringTree. 
Использую примерно такой тип данных.
Код

type
  PBookmark = ^TBookmark;

  TBookmark = record
    Category, Description, Link, Location: WideString;
    Editable, isDir: Boolean;
    ImageIndex,  State : Integer;
  end;


Загружаю и храню данные соответственно через LoadNode и SaveNode:
Код

procedure TForm1.VTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Reader: TReader;
  NodeData: PBookmark;
begin
  Reader := TReader.Create(Stream, 8096);
  try
    NodeData := Sender.GetNodeData(Node);
    with NodeData^, Reader do
    begin
            Category := ReadWideString;
            Description := ReadWideString;
            Link := ReadWideString;
            Location := ReadWideString;
            Editable := ReadBoolean;
            isDir := ReadBoolean;
            ImageIndex := ReadInteger;
            State:=ReadInteger;
    end;
  finally
    FreeAndNil(Reader);
  end;
end;


Теперь возникла необходимость добавить новые данные в тип:
Код

type
  PBookmark = ^TBookmark;

  TBookmark = record
    Category, Description, Link, Location: WideString;
    Editable, isDir: Boolean;
    ImageIndex,  State : Integer;
    Tags...//Новые данные
    FavIcon...
    ...
  end;


И вот тут и возникает проблема. Из за отсутствия необходимых данных в старом файле, возникает ошибка при загрузке в новой программе. В связи с чем хотел бы узнать - можно ли игнорировать ошибки (чтобы прога не падала), отсутсвующие данные забить нулями например?
Если нет, тогда посоветуйте, в каком формате хранить двевовидную структуру с возможностью безболезненного расширения самой структуры файла от версии к версии. То есть как в последнем примере: добавил Tags, FavIcon... а в первом примере их нет. 
Базы данных не предлагать - очень медленно работают - уже ознакомился с Firefox 3.
PM MAIL   Вверх
Matematik
Дата 10.10.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



> посоветуйте, в каком формате хранить двевовидную структуру с возможностью безболезненного расширения самой структуры файла от версии к версии

XML, JSON, Bencode etc


PS

> Базы данных не предлагать - очень медленно работают - уже ознакомился с Firefox 3. 

Очень зря. FF3+SQLite неплохо работает
PM MAIL WWW ICQ   Вверх
aktuba
Дата 10.10.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Я делал в похожей ситуации следующее: в новой версии использовал другое название файла (или, в твоем случае, поменяй расширение. например, было .bsd, в новой версии сделай .bsd_2). Теперь при считывании смотри на расширение и считывай как надо ;)

P.S.: я бы внедрил в файл версию, чтобы в будущем не колдовать с расширениями.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Pavelbej
Дата 11.10.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6



aktuba, забавный выход из ситуации.


Это сообщение отредактировал(а) Pavelbej - 11.10.2008, 12:44
PM MAIL   Вверх
bems
Дата 11.10.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



если выполняется предположение что в старых файлах ImageIndex лежит в интервале [0..65535] то можно так:

Код

  PBookmark = ^TBookmark;
  TBookmark = packed record
    Category, Description, Link, Location: WideString;
    Editable, isDir: Boolean;
    case Boolean of
     false:(ImageIndexAndVersion,
            OldStyle_State:Integer);
      true:(ImageIndex:Word;
            MinorVersion,MajorVersion:Byte;
            State : Integer;
            Tags...//Новые данные
            FavIcon...
            ...);
  end;

procedure TForm1.VTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Reader: TReader;
  NodeData: PBookmark;
begin
  Reader := TReader.Create(Stream, 8096);
  try
    NodeData := Sender.GetNodeData(Node);
    with NodeData^, Reader do
    begin
            Category := ReadWideString;
            Description := ReadWideString;
            Link := ReadWideString;
            Location := ReadWideString;
            Editable := ReadBoolean;
            isDir := ReadBoolean;
            ImageIndexAndVersion := ReadInteger;
            State:=ReadInteger;
            if (MajorVersion=0) and
               (MinorVersion=0) then begin
                                     //версия записи 0.0 - присваиваем дефолтные значения
                                     end
                                else begin
                                       //поведения для остальных двадцати семи версий :)
                                       end; 
    end;
  finally
    FreeAndNil(Reader);
  end;
end;




Это сообщение отредактировал(а) bems - 11.10.2008, 18:46


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 11.10.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



и еще: действительно необходимо для каждого узла создавать новый TReader?
Цитата(bems @  11.10.2008,  17:59 Найти цитируемый пост)
если выполняется предположение что в старых файлах ImageIndex лежит в интервале [0..65535] то можно так:
а если не лежит, то наверное лежит State

Это сообщение отредактировал(а) bems - 11.10.2008, 18:55


--------------------
Обижено школьников: 8
PM MAIL   Вверх
aktuba
Дата 11.10.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(Pavelbej @  11.10.2008,  13:43 Найти цитируемый пост)
aktuba, забавный выход из ситуации.

забавный-не забавный, но действенный ;)


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.