Как в Delphi проверить попадает ли значение в набор значений меньших чем 0 и/или больших чем 255?

Иногда бывает нужно проверить, равно ли значение переменной одной из нескольких констант. Если констант всего пара штук то это не проблема. Если их побольше, но они имеют значения в диапазоне 0..255, то синтаксис с a in [..] тоже работает отлично. Проблема, если значения констант выходят за рамки этого диапазона:

procedure TForm1.FormCreate(Sender: TObject);
const
  something20 = 20;
  something255 = 255;
  something2600 = 2600;
  somethingNeg = -20;
begin
  var a := 90;

  // Набор со значениями до 255
  if (a = something20) or (a = something255) then Caption := 'Ok';
  if a in [something20, something255] then Caption := 'Ok';

  // Набор со значениями больше 255
  if (a = something20) oor (a = something255) or (a = something2600) then Caption := 'Ok';
  if a in [something20, something255, something2600] then Caption := 'E1012 Constant expression violates subrange bounds';

  // Набор со значениями меньше 0
  if (a = something20) or (a = something255) or (a = somethingNeg) then Caption := 'Ok';
  if a in [something20, something255, somethingNeg] then Caption := 'E1012 Constant expression violates subrange bounds';
end;

Попробовал увеличить в настройках компилятора Minimum enum size до Word, но к сожалению это не помогло (хотя казалось бы сходная вещь).

Так как же удобно проверить попадает ли значение в набор значений которые могут быть меньше 0 или больше 255? Есть ли какие-то стандартные приёмы в языке или стандартной библиотеке? Хотелось бы обойтись без написания своих методов типа ValueInSet(.., [..]) или многострочных костылей типа case .. of .


Текущий лидер - ValueInSet, но неудобно, что его придется подключать во все проекты:

function ValueInSet(aValue: Integer; const Values: array of Integer): Boolean;
begin
  Result := False;
  for var I := Low(Values) to High(Values) do
    if aValue = Values[I] then
      Exit(True);
end;

  if ValueInSet(a, [something20, something255, somethingNeg]) then Caption := 'Ok';

Второй кандидат - case .. of, но он громоздок и плохо сочетается с другими условиями:

case a of
  something20, something255, somethingNeg: Caption := 'Ok';
end;

Ответы (0 шт):