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

Вниз

Проверка принадлежности перечислимому типу.   Найти похожие ветки 

 
TeaNick   (2011-11-18 13:08) [0]

Есть свой тип

TObjType = (otUnknown,otHeader,otBind);

Как проверить переменную на принадлежность этому типу

Что-то типа var1 is TObjType.

Можно конечно

var1 in [otUnknown,otHeader,otBind] но это довольно громоздко.


 
Сергей М. ©   (2011-11-18 13:16) [1]


> Как проверить переменную на принадлежность этому типу


Если ты объявил переменную var1: TObjType, то как она может иметь тип отличный от TObjType ?


> Можно конечно
>
> var1 in [otUnknown,otHeader,otBind]


Для этого делают еще один тип - множественный.

TObjTypeSet = set of TObjType;

И вот теперь :

var
MyObjTypeSet: TObjTypeSet;
var1: TObjType;
..
if var1 in MyObjTypeSet then ..


 
Dimka Maslov ©   (2011-11-18 13:17) [2]

У нас тут дельфи. Тип переменной указывается строго при её объявлении и не может быть изменён.


 
Омлет ©   (2011-11-18 13:29) [3]


> Dimka Maslov ©   (18.11.11 13:17) [2]
> У нас тут дельфи. Тип переменной указывается строго при
> её объявлении и не может быть изменён.

Variant?


 
Медвежонок Пятачок ©   (2011-11-18 13:34) [4]

и вариант тоже


 
Медвежонок Пятачок ©   (2011-11-18 13:36) [5]

var1 in [otUnknown,otHeader,otBind] но это довольно громоздко.
это не громоздко.

но не отвечает на поставленный вопрос.


 
OW ©   (2011-11-18 13:37) [6]

type
 TObjType = (otUnknown,otHeader,otBind);
 TSETObjType = Set of TObjType;
var
 v1 : TObjType;
 v2 : TSETObjType;
begin
 v2 := [otUnknown] + [otHeader] + [otBind];
 v1 := otUnknown;
 if v1 in v2 then ShowMessage( "");

изящнее, наверное, никак в общем случае
если только тип будет паблишет, и для него получится RTTI взять


 
Медвежонок Пятачок ©   (2011-11-18 13:48) [7]

какая изящная ересь.


 
TeaNick   (2011-11-18 13:51) [8]

Не все так просто

Есть

TObjType = (otUnknown,otHeader,otBind);

TvNode = packed record
   Level:integer;
   ObjType:TObjType;
end;

есть
 F:file of TvNode;
 VNode:TvNode;

 while not eof(F) do begin
     read(F,VNode);
 .......
Так вот надо проверить VNode.ObjType на принадлежность TObjType, иначе
неверный формат файла.

Само чтение никакого исключения не вызывает, а поле ObjType совершенно спокойно читается из бинарного файла как целочисленное.
В вочлисте VNode.ObjType просто пишет (out of bound) - 47 или любой другое число (больше 2-х).
Логично что перечислимые типы сохряняются в бинарном файле как целочисленные, но вот такая проблема при чтении.


 
Медвежонок Пятачок ©   (2011-11-18 13:54) [9]

0 <= ord(x) <= otBind


 
Медвежонок Пятачок ©   (2011-11-18 13:56) [10]

в бинарном файле как целочисленные

Итого:
все сводится не к медитации над тем какого оно типа, а к банальной проверке что оно между нулем и максимальным значением перечисления включая границы.


 
OW ©   (2011-11-18 14:01) [11]

type
 TObjType = (otUnknown, otHeader, otBind );
 TSETObjType = Set of TObjType;
var
 v1 : TObjType;
 v2 : TSETObjType;
 v3 : integer;
begin
 v2 := [otUnknown] + [otHeader] + [otBind];
 v1 := otUnknown;
 if v1 in v2 then ShowMessage( "v1 in v2");
 v3 := 5;
 if TObjType(v3) in v2 then ShowMessage( "v3 := 5 in v2");
 v3 := 2;
 if TObjType(v3) in v2 then ShowMessage( "v3 := 2 in v2");

или
TObjType = (otUnknown = 34, otHeader=45, otBind=85 );


 
Anatoly Podgoretsky ©   (2011-11-18 14:01) [12]


> Так вот надо проверить VNode.ObjType на принадлежность TObjType,
>  иначе
> неверный формат файла.

В файле уже нет пользовательских типов, там только значение допустимые или нет.


 
OW ©   (2011-11-18 14:03) [13]


> а к банальной проверке что оно между нулем и максимальным
> значением перечисления включая границы.

TObjType = (otUnknown =3, otHeader =5, otBind=65 );
testvalue = 57
3<57<65
но мимо


 
Медвежонок Пятачок ©   (2011-11-18 14:04) [14]

>[11]
если бы еще вспомнить что (по дефолту) перечислимое это тупо физически тупо байт.


 
TeaNick   (2011-11-18 14:36) [15]

Всем спасибо за варианты.
Придумал еще такое решение

uses TypInfo;

....................

var i:integer;
    s:string;

............
    read(F,VNode);

     i:=integer(VNode.ObjType);
     s:=GetEnumName(TypeInfo(TObjType),i);
     if s=EmptyStr then
     raise
       Exception.Create("load error!");

немного поизвращенски, но работает

Экспериментальным путем установлено что

     if GetEnumName(TypeInfo(TObjType),integer(VNode.ObjType))=EmptyStr then
     raise
       Exception.Create("load error!");

работать не хочет и при включенной оптимизации и без


 
Dimka Maslov ©   (2011-11-18 14:41) [16]


> Variant?


Вариант это способ организации хранения данных. Сама переменная как имела тип вариант, так и будет его иметь.


 
Сергей М. ©   (2011-11-18 15:03) [17]

> немного поизвращенски

Эт точно)
Вот обязательно нужно выковыривать из недр RTTI строки, вместо того чтобы сделать простейшую проверку [9]


 
Dennis I. Komarov ©   (2011-11-18 15:18) [18]


> немного поизвращенски, но работает

почему "немного"?


 
TeaNick   (2011-11-18 15:37) [19]

Согласен. Хватит извращений на сегодня.

  if not (VNode.ObjType in [Low(TObjType)..High(TObjType)]) then
  raise Exception.Create("load error!");


Всем спасибо.



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
15-1320674537
mvconf
2011-11-07 17:02
2012.02.26
Разработка системы видеоконференцсвязи


15-1320870602
Юрий
2011-11-10 00:30
2012.02.26
С днем рождения ! 10 ноября 2011 четверг


15-1320861739
Вспученный
2011-11-09 22:02
2012.02.26
Как посмотреть видео в контакте с ошибкой доступа?


2-1321131467
Laguna
2011-11-13 00:57
2012.02.26
Изменить курсор вне модальной формы


2-1321451267
Scott Storch
2011-11-16 17:47
2012.02.26
Библиотека типов (COM)