2010-09-20 15 views
4

Je voudrais savoir si cela est possible dans Delphi (ou s'il y a une manière propre autour):valeur du paramètre par défaut pour un TSomething dans Delphi

type 
TSomething = record 
    X, Y : Integer; 
end; 

GetSomething(x, y) -> Retourne record avec ces valeurs.

... et vous avez cette fonction avec TSomething en tant que paramètre, et vous voulez le défaut comme

function Foo(Something : TSomething = GetSomething(1, 3); 

Le compilateur recrache une erreur ici, mais je ne sais pas s'il y a un moyen de contourner il!

Est-ce que cela peut être fait?

Répondre

3

La meilleure façon est d'utiliser des procédures surchargées:

program TestOverloading; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

type 
    TSomething = record 
    X,Y : integer; 
    end; 

const 
    cDefaultSomething : TSomething = (X:100; Y:200); 

procedure Foo(aSomething : TSomething); overload; 
begin 
    writeln('X:',aSomething.X); 
    writeln('Y:',aSomething.Y); 
end; 

procedure Foo; overload; 
begin 
    Foo(cDefaultSomething); 
end; 

begin 
    Foo; 
    readln; 
end. 
3

Utilisez une classe au lieu d'un disque et quelque chose comme ça le ferait:

TSomething = class 
public 
    X: integer; 
    Y: integer 
end; 

procedure Foo(Something: TSomething = nil); 
begin 
    if (Something = nil) then 
    Something := GetSomething(1, 3); 
    ... 
end; 
+0

Pour exclure certains frais généraux RTTI, X et Y pourraient être déclarés comme 'public' au lieu de 'publié' implicite – mjn

+0

Merci à @mjustin de le signaler. Mon hypothèse implicite était, que la directive pour contrôler la génération de RTTI est définie à la valeur par défaut: '{$ M-}'. ;-) – splash

10

utiliser la surcharge:

procedure Foo(const ASomething: TSomething); overload; 
begin 
    // do something with ASomething 
end; 

procedure Foo; overload; 
begin 
    Foo(GetSomething(1, 3)); 
end; 
0

Si vous utilisez un pointeur au lieu du type d'enregistrement une utilisation nil comme valeur par défaut:

type 
    TSomething = record 
    X, Y : Integer; 
    end; 

    PSomething = ^TSomething; 

function Foo(Something: PSomething = nil); 

En fait, passant des pointeurs comme paramètres est généralement plus rapide, car il évite la copie des blocs de mémoire.