Главная страница
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.098 c
2-1169715505
ocean
2007-01-25 11:58
2007.02.11
Нет DBNavigator


2-1169198467
Mettt
2007-01-19 12:21
2007.02.11
Четность числа


15-1168979975
DevilDevil
2007-01-16 23:39
2007.02.11
Отказаться от обновления Рамблеровской Аськи?


15-1169284397
Piroxyline
2007-01-20 12:13
2007.02.11
Спам


1-1166611676
_ozzy_
2006-12-20 13:47
2007.02.11
Как запретить подтверждение на замену(удаление) Windows?