如何在Delphi中传递作为参数的范围?

时间:2011-02-11 12:30:49

标签: delphi range

在Delphi中,我可以定义一系列字符或整数,如下所示:

var
  a,i: integer;
  b: char;
  intrange: 1..9;
  charrange: 'α' .. 'ζ';

begin

  for a := low(IntRange) to high(IntRange) do
  begin
    Memo1.Lines.Add('Integer Range Iteration = ' + intToStr(a) ) ;
  end;

  i:=0;
  for b := low(charrange) to high(charrange) do
  begin
    i := i + 1;
    Memo1.Lines.Add('Character Range Iteration = ' + intToStr(i) + ',   value = ' + b +'  ord '+ inttostr(ord(b))) ;
  end;
end;

如何将范围作为参数传递给函数?

5 个答案:

答案 0 :(得分:13)

您可以使用subrange types

type
  TCharrange = 'α' .. 'ζ';

procedure MyFunction(Char: TCharrange);

现在你可以做到

MyFunction('γ');

,而

MyFunction('a');

无效。

答案 1 :(得分:4)

据我所知,你想要传递范围而不是某个指定范围内的字符。如果这是一个正确的理解,那么你需要传递两个参数(最小和最大)或者可能将它们包装在一个记录中。

答案 2 :(得分:3)

您可以在某些情况下尝试设置,例如:

type
  TMyRange = 1..5;
  TMyRangeSet = Set of TMyRange;

procedure A(const V: TMyRangeSet);
var X : TMyRange;
begin
  for X := Low(TMyRange) to High(TMyRange) do
    if X in V then { included } 
end;

begin
  A([3..4]);
end.

答案 3 :(得分:2)

我相信您需要先将其定义为类型,例如:

type
  TMyRange = 1..2;

然后:

function Whatver(Range: TMyRange): Boolean;
begin

end;

答案 4 :(得分:2)

我对仿制药比较陌生,但我认为这可能是对你的问题的第二种解释(David Heffernan解释)的一个相当简洁的解决方案。

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;