我有记录类型
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
答案 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一次递减。