Текущий архив: 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.46 MB
Время: 0.041 c