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

8

我有一个记录类型

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

I have a

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个回答

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中,您必须使用全局范围内的函数。

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。


1
也许可以使用 TPoint 代替数组。例如:fRotate(fLine - Point(0, 1), fAngle) - kobik
嗨@kobik,我也想到了这个方法,但我不熟悉Point函数,所以你的解决方案更好。我会相应地更新我的答案。 - Dsm
谢谢你们两个。我主要想知道一个记录参数是否可以分解为其组成字段;显然不行,这是有用的知识。这节省了我寻找不存在的东西的努力。 - JRBleau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接