![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Ребят, спасибо большое за ответ. Что-то из этого применю.
|