2017-08-24 35 views
8

mam typ rekorduDelphi: łamanie parametr rekord w dół do pola

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

mam

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

Chcę przekazać zLine, ale z jego pola Y zmniejszoną o 1. Czy istnieje sposób na zapisanie zapisu w jego określonych polach w procedurze lub funkcji? Wypróbowałem

która nie działa. Albo muszę zrobić w następujący sposób:

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

TIA

Odpowiedz

9

Można by utworzyć funkcję typowo dla tego produktu. We współczesnej Delphi z rozszerzonych rejestrów, lubię używać statycznego funkcję klasy tak:

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; 

Potem rozmowa staje się funkcja:

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

W starszych wersjach Delphi trzeba by użyć funkcja w zasięgu globalnym.

3

Dla czytelności Lubię używać alternatywnego rozwiązania z operatorami płytowych, tak: pamiętać, że jest zaktualizowany zgodnie z sugestią Kobik za

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; 

Pozwala to ten typ konstrukcji:

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

co moim zdaniem ma sens. Można oczywiście użyć prostej całkowitej, a nie tablicy, jeśli wszystko, co kiedykolwiek chciałeś zrobić, to zmniejszanie Y, ale to pozwala na jednoczesne zmniejszanie X i/lub Y.

+1

Może użyć 'TPoint' zamiast tablicy. na przykład 'fRotate (fLine - Point (0, 1), fAngle)' – kobik

+0

Hi @kobik Pomyślałem o tym pierwszy, ale nie znałem funkcji Point, więc tak, twoje rozwiązanie jest znacznie lepsze. Odpowiednio zaktualizuję swoją odpowiedź. – Dsm

+0

Dziękuję wam obu. Interesowało mnie głównie to, czy parametr rekordu może zostać podzielony na jego pola składowe; najwyraźniej nie, a to jest przydatna wiedza. Oszczędza mi to wysiłku poszukiwania wysokich i niskich rzeczy, których nie ma. – JRBleau