Delphi:将记录参数分解为字段

时间:2017-08-24 13:22:08

标签: delphi parameter-passing records

我有记录类型

tLine = record
  X, Y, Count : integer;
  V : boolean;
end;

我有一个

function fRotate(zLine: tLine; zAngle: double): tLine;

我想传递zLine,但是Y字段减少1.是否有办法将记录分解为过程或函数中的特定字段?我试过了

NewLine:=fRotate((zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle);

哪个不起作用。 或者我必须这样做:

dec(zLine.Y);
NewLine:=fRotate(zLine, zAngle);
inc(zLine.Y);

TIA

2 个答案:

答案 0 :(得分:9)

你通常会为此做一个功能。在具有增强记录的现代Delphi中,我喜欢使用这样的静态类函数:

type
  TLine = record
  public
    X: Integer;
    Y: Integer;
    Count: Integer;
    V: Boolean;
  public
    class function New(X, Y, Count: Integer; V: Boolean): TLine; static;
  end;

class function TLine.New(X, Y, Count: Integer; V: Boolean): TLine;
begin
  Result.X := X;
  Result.Y := Y;
  Result.Count := Count;
  Result.V := V;
end;

然后你的函数调用变为:

NewLine := fRotate(TLine.New(zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle);

在旧版本的Delphi中,您必须使用全局范围的函数。

答案 1 :(得分:3)

为了便于阅读,我喜欢使用带记录操作符的替代解决方案,如下所示:请注意,这是根据Kobik的建议进行更新的

  tLine = record
    X, Y, Count : integer;
    V : boolean;
    class operator Subtract( a : tLine; b : TPoint ) : tLine;
  end;

class operator tLine.Subtract(a: tLine; b : TPoint): tLine;
begin
  Result.X := a.X - b.X;
  Result.Y := a.Y - b.Y;
  Result.Count := a.Count;
  Result.V := a.V;
end;

这允许这种类型的构造:

  fRotate( fLine - Point(0,1), fAngle );

我认为这是有道理的。你可以使用一个简单的整数而不是一个数组,如果你想做的就是递减Y,但是这允许X和/或Y一次递减。