2017-08-24 5 views
8

j'ai un type d'enregistrementDelphi: briser le paramètre d'enregistrement vers le bas dans les champs

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

J'ai un

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

Je veux passer zline, mais avec son champ Y réduit de 1. Y at-il un moyen de décomposer un enregistrement dans ses champs spécifiques dans une procédure ou une fonction? J'ai essayé

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

qui ne fonctionne pas. Ou dois-je faire comme suit:

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

TIA

Répondre

9

Vous généralement faire une fonction pour cela. Dans Delphi moderne avec des documents améliorés, je préfère utiliser une fonction de classe statique comme ceci:

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; 

Ensuite, votre appel de fonction devient:

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

Dans les anciennes versions de Delphi que vous auriez à utiliser fonctionner à l'échelle mondiale.

3

Pour faciliter la lecture, je préfère utiliser une solution de rechange avec des opérateurs de disques, comme ceci: Notez que ceci est mis à jour conformément à la suggestion de SCOCI

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; 

Cela permet ce type de construction:

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

ce qui me semble logique. Vous pourriez évidemment utiliser un entier simple plutôt qu'un tableau si tout ce que vous avez voulu faire était de décrémenter Y, mais cela permet de décrémenter X et/ou Y en une fois.

+1

Peut-être utiliser un 'TPoint' à la place du tableau. par exemple. 'fRotate (fLine - Point (0, 1), fAngle)' – kobik

+0

Salut @kobik J'ai pensé à cela en premier mais je n'étais pas familier avec la fonction Point, alors oui, votre solution est bien meilleure. Je vais mettre à jour ma réponse en conséquence. – Dsm

+0

Merci à vous deux. Je voulais surtout savoir si un paramètre d'enregistrement peut être décomposé en ses champs de composants; apparemment pas, et c'est une connaissance utile. Cela me sauve l'effort de chercher haut et bas pour quelque chose qui n'est pas là. – JRBleau