Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Packed records  (Прочитано 10006 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Spender
Гость
« : 11-01-2006 16:45 » 

Существует некое множество:
States = set of (A, B, C, D );
Существует структура, которая в качестве одного из полей содержит текущее состояние
Params = packed record
  Name:      string;
  Number:      integer;
  curState:      States;
  Reserves:   array[0..85] of byte;
end;
Существует класс, который со всем этим работает. В частности функции чтения/записи данных
function TestClass.Save: boolean;
var
FullName: string;
    F: File;
    Version: Integer;
begin
DataPath := '.\Data\';
   if DirectoryExists(DataPath) or ForceDirectories(DataPath) then
       begin
          FullName := DataPath + IntToStr( Configuration.Number ) + '.tst';

          if FileExists(FullName) then
              DeleteFile(FullName);

          AssignFile(F, FullName);
          Rewrite(F, 1);

          Version := 843334230; // VBD2 signature

          BlockWrite(F, Version, sizeof(Version));
          BlockWrite(F, Configuration, sizeof(Configuration));

          CloseFile(F);
     end;

     Result := IOResult = 0;
end;
Вопрос заключается в том, что если я захочу добавить ещё одно состояние
States = set of (A, B, C, D, E );
то все перестает работать, так как размер меняется.
Почему так происходит, ведь я меню множество, при этом класс содержит текущее значение состояния, а не все множество.
Наличие packed является обязательным?!
« Последнее редактирование: 18-12-2007 21:42 от Алексей1153++ » Записан
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-01-2006 17:42 » 

Что-то я не понял. Т.е. ты в одной сессии программы создал запись и сохранил на диске параметры записи. По том изменил код программы, добавив во множество еще одно значение. И теперь с диска сохраненная запись не читается?
Может быть действительно из-за Packed. Только мне кажется это не тот путь. На этапе отладки, создания мне кажется такой проблемой не стоит зашиваться, тем более это не проблема, а просто доработка программы. Если же планируется или прогнозируется, что такое может быть в процессе эксплуатации (изменение например программного кода), то нужно проработать механизмы чтения и записи. Например отслеживать версию.
Записан

Ёжики, это не только ценные шкурки...
Spender
Гость
« Ответ #2 : 11-01-2006 20:06 » 

В том-то и дело, что программа давно функционирует. А текущая задача поменять базу данных. Просто не очень верится в то, что придется писать конвертер такой сложный. Ведь необходимо иметь информацию о старом множестве, новом множестве и аккуратно их поменять. Кто-нибудь знает выход попроще.
Записан
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-01-2006 05:07 » 

Именно БД? А при чем здесь запись в файл?
Записан

Ёжики, это не только ценные шкурки...
Spender
Гость
« Ответ #4 : 12-01-2006 06:50 » new

Ну база данных в смысле том, что это файл, в котором хранится информация. Да, реальные технолонии БД не применяются.
Записан
zubr
Гость
« Ответ #5 : 12-01-2006 07:48 » 

Цитата
Почему так происходит, ведь я меню множество, при этом класс содержит текущее значение состояния, а не все множество.
Наличие packed является обязательным?!
Размер множества поменяется, соответственно поменяется размер струтуры - ведь память выделяется под весь размер множества независимо от того сколько членов множества задействовано. Придется тебе как-то конвертировать файл, имхо.
Записан
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 12-01-2006 16:41 » 

Если тебе просто конвертнуть базу, то тут-то как раз проблем нет. Старая стуктура тебе известна, новая то-же.
Читаешь по старой структуре, преобразуешь в новую. Например две переменные recOld и recNew. В первую считываешь данные, во вторую  спреобразуешь и сохраняешь вторую в новый файл, а в конце файл переименовываешь.
Только вот меня терзают смутные сомнения, что та структура, что ты дал плюс намеки на БД и классы, что все тут не просто так. Возможна завязка межу записями в файле хитрая какая... Хотя это уже детали, выпадающие из общей темы...
Записан

Ёжики, это не только ценные шкурки...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines