|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Пренадлежит ли значение перечислимому типу?
Коллеги, есть код:
Код:
type TMyList = (mlOne = 1, mlFive = 5); var iTmp: integer; ... iTmp := 2; var bFind := False; for var ml := Low(TMyList) to High(TMyList) - 1 do begin bFind := ord(ml) = iTmp; if bFind then Break; end; вот вопрос какого ляда bFind имеет значение true? следующая конструкция так же ошибок не даёт Код:
ShowMessage(IntToStr(integer(TMyList(2)))); вопрос: как проверить что integer есть в списке TMyList? |
#2
|
|||
|
|||
В таком виде ничего сделать нельзя, т.к. для подобных типов RTTI не генерируется, а pred и succ работают неправильно (они воспринимают данный тип не как enum, а как integer).
Зато есть workaround с минимальными добавлениями. Фактически, мы создаем рядом с типом константный массив и используем его для подобной проверки вместо самого типа: Код:
type TMyList = (mlOne = 1, mlFive = 5); const TMyListValues : Array [1..2] Of TMyList = (mlOne, mlFive); function BoolToStr(value : Boolean) : String; begin if Value then Result := 'true' else Result := 'false'; end; function isDefined(value : Integer) : Boolean; var I : Integer; begin for I := Low(TMyListValues) to High(TMyListValues) do begin Result := value = Ord(TMyListValues[i]); if Result then Break; end; end; procedure TForm1.Button1Click(Sender: TObject); var iTmp1, iTmp2: integer; begin iTmp1 := 2; iTmp2 := 1; ShowMessage('iTmp1 = ' + BoolToStr(isDefined(iTmp1)) + ', iTmp2 = ' + BoolToStr(isDefined(iTmp2))); end; В результате работы получаем следующее сообщение: Код:
iTmp1 = false, iTmp2 = true |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
zhirnov.ilya.lvovich (13.05.2023)
|
#3
|
|||
|
|||
А лучше вместо массива использовать set of TMyList = [mlOne, mlFive], если значения не превосходят 255. Хотя диапазон и не большой, но и перечисления со значениями больше чем 255 встречаются редко. Но если значения будут больше этого, тогда массив.
Код:
type TMyList = (mlOne = 1, mlFive = 5); const mlSet: set of TMyList = [mlOne, mlFive]; var iTmp: Integer; begin for iTmp := 0 to 9 do if TMyList(iTmp) in mlSet then WriteLn('True') else WriteLn('False'); ReadLn; end; Последний раз редактировалось xchgeaxeax, 13.05.2023 в 00:51. |
Этот пользователь сказал Спасибо xchgeaxeax за это полезное сообщение: | ||
zhirnov.ilya.lvovich (13.05.2023)
|
#4
|
|||
|
|||
Ребят, спасибо большое за ответ. Что-то из этого применю.
|