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