2017-08-24 13 views
8

Tôi có một loại bản ghiDelphi: phá vỡ kỷ lục tham số xuống ruộng

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

Tôi có một

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

Tôi muốn vượt qua zLine, nhưng với lĩnh vực Y của nó giảm 1. Có một cách để phá vỡ một kỷ lục vào các lĩnh vực cụ thể của nó trong một thủ tục hoặc chức năng? Tôi đã thử

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

không hoạt động. Hoặc làm tôi phải làm như sau:

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

TIA

Trả lời

9

Bạn thường sẽ làm cho một chức năng cho việc này. Trong Delphi hiện đại với hồ sơ nâng cao, tôi thích sử dụng một chức năng lớp tĩnh như thế này:

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; 

Sau đó gọi hàm của bạn trở thành:

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

Trong các phiên bản cũ của Delphi bạn sẽ phải sử dụng một chức năng ở phạm vi toàn cầu.

3

Đối với khả năng đọc Tôi thích sử dụng một giải pháp thay thế với những hoạt động kỷ lục, như thế này: Lưu ý rằng điều này được cập nhật phù hợp với đề nghị Kobik của

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; 

này cho phép loại cấu trúc:

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

mà tôi nghĩ là hợp lý. Bạn rõ ràng có thể sử dụng một số nguyên đơn giản hơn là một mảng nếu tất cả những gì bạn muốn làm là giảm Y, nhưng điều này cho phép X và/hoặc Y được giảm đi cùng một lúc.

+1

Có thể sử dụng 'TPoint' thay vì mảng. ví dụ. 'fRotate (fLine - Point (0, 1), fAngle)' – kobik

+0

Xin chào @kobik Tôi đã nghĩ về điều đó trước nhưng tôi không quen thuộc với hàm Point, vì vậy có, giải pháp của bạn tốt hơn nhiều. Tôi sẽ cập nhật câu trả lời của tôi cho phù hợp. – Dsm

+0

Nhờ cả hai bạn. Tôi chủ yếu quan tâm đến việc biết liệu tham số bản ghi có thể được chia nhỏ thành các trường thành phần của nó hay không; rõ ràng là không, và đây là kiến ​​thức hữu ích. Nó giúp tôi tiết kiệm công sức tìm kiếm cao và thấp cho những thứ không có ở đó. – JRBleau

Các vấn đề liên quan