Форум: "Начинающим";
Текущий архив: 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