Я довольно новичок в дженериках, но думаю, что это может быть довольно аккуратным решением второй интерпретации (интерпретации Дэвида Хеффернана) вашей проблемы.
type
TRange<T> = record
MinVal: T;
MaxVal: T;
constructor Create(AMinVal, AMaxVal: T);
end;
TCharrange = TRange<Char>;
// TIntrange = TRange<Integer>;
// etc.
constructor TRange<T>.Create(AMinVal, AMaxVal: T);
begin
MinVal := AMinVal;
MaxVal := AMaxVal;
end;
Теперь вы можете сделать
procedure MyFunction(Char: TCharrange);
begin
ShowMessage(Char.MinVal);
ShowMessage(Char.MaxVal);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
r: TCharrange;
begin
r.Create('a', 'c');
MyFunction(r);
end;