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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.005 c
15-1320351221
Leon-Z
2011-11-03 23:13
2012.02.26
Куда катится программирование ?


15-1320615148
KilkennyCat
2011-11-07 00:32
2012.02.26
TreeView для XE бесплатный,


2-1321092811
nick_delphi2010
2011-11-12 14:13
2012.02.26
Проблема с дебагером в Delphi 2010


15-1320741831
И. Павел
2011-11-08 11:43
2012.02.26
3D


2-1321130980
Евгений07
2011-11-13 00:49
2012.02.26
INDY сбивают ориентацию ADO





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