Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
15-1168927372
Ega23
2007-01-16 09:02
2007.02.11
ММП? В пятницу?


2-1169724930
Raptoridze
2007-01-25 14:35
2007.02.11
спрятать скролбары в webbrowser


8-1150417347
h8394E
2006-06-16 04:22
2007.02.11
Текстура из TStream (D3D от JEDI)


15-1169482955
xayam
2007-01-22 19:22
2007.02.11
CSS


4-1159027456
Чапаев
2006-09-23 20:04
2007.02.11
Запись строкового ресурса





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