Показать сообщение отдельно
  #2  
Старый 12.05.2023, 20:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В таком виде ничего сделать нельзя, т.к. для подобных типов 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
Ответить с цитированием