I have a record type
tLine = record
X, Y, Count : integer;
V : boolean;
end;
I have a
function fRotate(zLine: tLine; zAngle: double): tLine;
I want to pass zLine, but with its Y field reduced by 1. Is there a way to break a record down into its specific fields in a procedure or function? I tried
NewLine:=fRotate((zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle);
which does not work. Or do I have to do as follows:
dec(zLine.Y);
NewLine:=fRotate(zLine, zAngle);
inc(zLine.Y);
TIA
You would typically make a function for this. In modern Delphi with enhanced records, I like to use a static class function like this:
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;
Then your function call becomes:
NewLine := fRotate(TLine.New(zLine.X, zLine.Y-1, zLine.Count, zLine.V), zAngle);
In older versions of Delphi you'd have to use a function at global scope.
For readability I like to use an alternative solution with record operators, like this: Note that this is updated in line with Kobik's suggestion
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;
This allows this type of construct:
fRotate( fLine - Point(0,1), fAngle );
which I think makes sense. You could obviously use a simple integer rather than an array if all you ever wanted to do was decrement Y, but this allows X and/or Y to be decremented at once.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With