Comment retourner un tableau à partir d'un Delphi fonction?

J'ai une fonction dans mon application qui doit retourner un tableau. J'ai trouvé dans quelques endroits comment faire cela en déclarant le type du tableau, par exemple

type
  TStringArray = array of string; 

Et ensuite déclarer ma fonction

function SomeFunction(SomeParam: Integer): TStringArray;

Mon problème est d'essayer de mettre cela dans une forme qui est à la fois l'interface et la mise en œuvre. Comment dois-je déclarer mon type et avoir une déclaration de fonction de ce type dans l'interface ?

  • "Array de string" est généralement considéré comme "non idiomatique" en Delphi. TStringList est généralement préférée.
  • J'ai l'habitude d'utiliser le "DynArray" suffixe pour nommer ce type de définition, afin de faire une distinction entre une dynamique et un tableau statique: TStringDynArray = array of string; TStringArray = array[0..(maxInt div sizeof(string))-1] of string; Mais il n'existe pas de convention à ce sujet.
  • P: à Noter que la nouvelle FileIO unité utilise qui fait partie de la XE RTL utilise TStringDynArray largement. Donc, je ne suis pas d'accord qu'il n'est pas idiomatique. Surtout si vous souhaitez retourner un tableau et une boucle à l'aide d'un agent recenseur c'est très pratique (voir TDirectory.GetFiles pour un exemple).
  • P: Un point de plus: de retour d'un TStringList est encore moins idiomatiques, dans la mesure où il viole le "créateur est responsable de la destruction" principe
  • Généralement, j'aimerais passer dans une liste de chaînes au lieu de cela, Smasher. Cela signifie que je voudrais écrire SomeFunction(other_parameters; outData:TStringList):Boolean; ou SomeProcedure(other_parameters; outData:TStringList);. Il n'est également pas idiomatiques pour retourner un objet alloué, comme vous le dites. Donc, ne pas.
  • Qui utilise FileIO? Celui qui a écrit cela va à l'encontre d'une convention observée presque partout ailleurs dans le RTL et la VCL.
  • Quel est le point de cette convention? Je trouve for FileName in TDirectory.GetFiles do ... tellement plus élégant que StrList := TStringList.Create; try TDirectory.GetFiles (StrList); for FileName in StrList do ... finally StrList.Free; end; Sont les inconvénients de la matrice approche? Autrement il n'y a aucune raison de ne pas l'utiliser à mon humble avis
  • BTW: je parlais de IOUtils bien sûr

InformationsquelleAutor Joe | 2011-05-26