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

Вниз

Запись с вариациями   Найти похожие ветки 

 
Kyn66 ©   (2007-01-22 13:04) [0]

Уважаемые мастера, возникла такая ситуация. В программе использую запись по условию:

 TExpArray = packed record
      OSKod    : Integer;
      Case RK : Byte of
         1 : Case VI : Byte of
                0 : (PrihKol, RashKol, KolLc : Integer;
                     PrihSum, RashSum, SredOst, PolDoh : Single);
                1 : (PrihKol, ZachKol, RashKol, KolLc : Integer;
                     PrihSum, ZachSum, RashSum, SredOst, PolDoh : Single);
             end;{Case}
         2 : (Kol2_1, Kol2_2, Kol2_3, Kol2_4, Kol2_5 : Integer;
              Sum2_1, Sum2_2, Sum2_3, Sum2_4, Sum2_5,
              Doh2_1, Doh2_2, Doh2_3, Doh2_4, Doh2_5 : Single);
         3 : (Sum3_1, Sum3_2, Sum3_3, Sum3_4,
              Tar3_1, Tar3_2, Tar3_3, Tar3_4,
              Doh3_1, Doh3_2, Doh3_3, Doh3_4 : Single);
         4 : (Kol4_1, Kol4_2, Kol4_3, Kol4_4, Kol4_5, Kol4_6 : Integer);
         5 : (Kol5_1, Kol5_2 : Integer; Proc5_1 : Single);
....

Т.е. в зависимости от RK я применяю тот илииной набор. Сейчас изменилась структура данных для RK=1/ Как мне сделать правильно, чтобы запись осталась с тем-же именем, но в RK добавилось ешшо одно условие выбора? Как сейчас написано у меня в предложенном Вам коде - выдает ошибку при компиляции


 
Sapersky   (2007-01-22 13:59) [1]

Насколько я вижу, вариант с VI = 1 отличается от VI = 0 только несколькими добавленными полями. Ну так и используй всегда его. Никакой экономии от сокращённого числа полей в VI = 0 не получишь, т.к. память для записи выделяется по максимуму, чтобы все варианты влезли. И никакого "разграничения доступа" в зависимости от значении RK, VI в записях тоже нет (можно, кстати, писать просто Case Byte of) - в любой момент можно обратиться к любому полю.


 
jack128 ©   (2007-01-22 14:14) [2]

Kyn66 ©   (22.01.07 13:04)
               0 : (PrihKol, RashKol, KolLc : Integer;
                    PrihSum, RashSum, SredOst, PolDoh : Single);
               1 : (PrihKol, ZachKol, RashKol, KolLc : Integer;
                    PrihSum, ZachSum, RashSum, SredOst, PolDoh : Single);

Ну во первых: у тебя в двух вариантах одинаковые имена полей - это недопустимо.  
Во вторых: вариантные поля должны быть самыми последними в записи. То есть вариант RK = 1 у тебя должен декларироваться последним.


 
Kyn66 ©   (2007-01-22 14:42) [3]

Нет, Здесь RK имеет больший приоритет. А записи отличаются только добавлением полей. Не получается взять данные. Они почему-то не правильно присваиваются, нарушается порядок следования, когда старая запись(без новых двух полей) извлекается из файла и присваивается новой записи. Почему - не пойму.


 
Sapersky   (2007-01-22 16:53) [4]

При записи/чтении из файла (если оно делается Read(File, ...) или Stream.Read) компилятор не разбирает, какие там поля, а воспринимает запись просто как блок памяти длиной SizeOf(TExpArray).
Собственно, он (почти) всегда их так воспринимает. Имена полей суть просто удобное для программиста средство задать смещение внутри блока памяти, по которому нужно брать данные.
Т.о., если нужно сделать поддержку разных версии файлов, имеется 2 основных варианта:
1) С записями: добавлять новые поля только в конец, запись писать вместе с её размером (первое поле). При чтении читать размер, сравнивать с текущим и читать сколько нужно в данном случае. Ну или ещё какой-нибудь подобный трюк.
2) Использовать классы с их полями, RTTI и т.п.:
http://www.rsdn.ru/article/delphi/serialization.xml
Большая автоматизация ввода/вывода, но и больше мороки с описанием полей/свойств (+ см. присущие свойствам ограничения), работает несколько медленнее.


 
Cash ©   (2007-01-22 18:03) [5]

&qt; Kyn66 ©   (22.01.07 13:04)

        1 : Case VI : Byte of
               0 : (PrihKol, RashKol, KolLc : Integer;
                    PrihSum, RashSum, SredOst, PolDoh : Single);
               1 : (PrihKol, ZachKol, RashKol, KolLc : Integer;
                    PrihSum, ZachSum, RashSum, SredOst, PolDoh : Single);
            end;{Case}

...вот уж даже и не знаю.... два месяца уже за D не сидел... но!...
Этот Case разве не в скобках должен быть?


 
kyn66 ©   (2007-01-22 18:09) [6]

Короче, самый подходящий способ нашел 0 отлавливать старую запись и конвертить ее к новому виду. По другому пока никак.


 
Плохиш ©   (2007-01-22 18:14) [7]


> Как сейчас написано у меня в предложенном Вам коде - выдает
> ошибку при компиляции

Ну, скажем, далеко не одну ошибку и в ошибках всё подробненько расписано...



Страницы: 1 вся ветка

Текущий архив: 2007.02.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.099 c
4-1159027456
Чапаев
2006-09-23 20:04
2007.02.11
Запись строкового ресурса


15-1169407250
Chuk & Gek
2007-01-21 22:20
2007.02.11
Вопрос к тем, кто разбирается


2-1169504562
Raptoridze
2007-01-23 01:22
2007.02.11
выбрать в combobox


2-1169543020
vigo_
2007-01-23 12:03
2007.02.11
Печать по-русски


15-1169498250
DemonP
2007-01-22 23:37
2007.02.11
Системные сообщения при выходе из спящего режима