| | | | |
Перечислимые типы данных, определяемые пользователем | Полный текст материала
Другие публикации автора: Andrew Fionik
Цитата или краткий комментарий: «... В данной лекции мы познакомимся с перечислимыми типами данных. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[Перечислимые типы]
Отслеживать это обсуждение
Всего сообщений: 615-08-2005 04:04А зачем цикл для определения значения по номеру?
Ведь можно обойтись двумя сравнениями и приведением типа:
If ColorIndex < Ord(Low(TRainBow)) then Raise Exception.create(.....);
If ColorIndex > Ord(High(TRainBow)) then Raise Exception.create(.....); либо ColorIndex :=Ord(High(TRainBow))) в зависимости от условий.
Color:= TRainBow(ColorIndex);
|
|
28-07-2005 07:02сообщение от автора материала TRainbow(0) будет = Red
Читайте внимательнее предыдущие посты. Что будет TRainbow(10000) ?
WriteLn(GetEnumName(TypeInfo(TRainbow),Ord(Color))
Это конечно интересно, но до RTTI эти лекции еще пока что не дошли. Кроме того есть разница между тем как называется идентификатор и тем что хочется вывести пользователю. Быть может в программе идентификаторы будут такие:
TRainbow=(rcRed, rcOrange, rcYellow, rcGreen, rcAzure, rcBlue, rcViolet);
...а выводить хочется именно "Red", а не "rcRed". |
|
27-07-2005 01:11Проблема состоит в том, что не существует стандартной функции библиотеки, позволяющей получить значение перечислимого типа по его порядковому номеру.
Элементарно: TRainbow(0) будет = Red
Вместо case Color of
Red: WriteLn('Red');
Orange: WriteLn('Orange');
Yellow: WriteLn('Yellow');
Green: WriteLn('Green');
Azure: WriteLn('Azure');
Blue: WriteLn('Blue');
Violet: WriteLn('Violet');
end;
хорошо использовать
WriteLn(GetEnumName(TypeInfo(TRainbow),Ord(Color))
|
|
21-07-2005 00:47сообщение от автора материала Данный пример затрагивает уже следующую тему, про массивы, но вот эта программа сломается на WriteLn(RC[Color]) хотя не должна, бы.
program ordinaltypes;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TRainbow=(Red, Orange, Yellow, Green, Azure, Blue, Violet);
TRainbowColors=array[TRainbow] of String;
const
RC:TRainbowColors=('Red','Orange','Yellow','Green','Azure','Blue','Violet');
var
Color:TRainbow;
begin
Color:=TRainbow(100);
WriteLn(RC[Color]);
ReadLn;
end. |
|
21-07-2005 00:35Потому что при таком присваивании его корректность не проверяется. Например:
Color := TRainbow(100);
... синтаксически корректен и будет выполнен, но при этом, скажем, выражение (Color>=Low(TRainbow)) and (Color<=High(TRainbow)) будет ложным, чего не должно быть в принципе.
Сообщение не подписано |
|
20-07-2005 15:47
Color := TRainbow(ColorIndex); Хммм... А я всегда пользуюсь вместо цикла приведением типов. Объясните мне почему я не прав, пожалуйста...
|
|
|
|