Hola Delfino.
Coincido con lo dicho por
mamcx y
roman sobre la consecutividad de los elementos, de no ser así hay que recorrerlos.
También muy acertada la pregunta de
Casimiro. Si se trata de tipos enumerados de elementos consecutivos y siendo divisible en subconjuntos, podrías hacer:
Código Delphi
[-]
type
TEnum = Byte;
TSet = set of TEnum;
function GetPosEnum(const aSet: TSet; const aEnum: TEnum; const aPaso: Byte): Integer;
begin
if not(aEnum in aSet) then
Result := -1
else if Ord(aEnum) mod aPaso = 0 then
Result := aPaso
else
Result := Ord(aEnum) mod aPaso;
end;
Ejemplo de uso:
Código Delphi
[-]
...
var
s : TSet;
e : TEnum;
n : Integer;
begin
s := [1,2,3,4,5,6,7,8,9,10,11,12];
e := 11;
n := GetPosEnum(s, e, 4); if n <> -1 then
ShowMessage(Format('Posición de %d: %d',[e, n])) else
ShowMessage('valor no encontrado')
end;
Saludos