2011-05-26 29 views
20

Tengo una función en mi aplicación que necesita devolver una matriz. He encontrado en un par de lugares cómo hacerlo al declarar el tipo de matriz, p.¿Cómo devolver una matriz desde una función Delphi?

type 
    TStringArray = array of string; 

Y luego declarar mi función

function SomeFunction(SomeParam: Integer): TStringArray; 

Mi problema es tratar de configurar esto en un formulario que tiene interfaz y la implementación. ¿Cómo declaro mi tipo y tengo una declaración de función con ese tipo en la interfaz?

+5

"Matriz de cadena" se considera generalmente como "no idiomática" en Delphi. TStringList generalmente es preferido. –

+1

Normalmente utilizo el sufijo "DynArray" para nombrar dicha definición de tipo, para hacer una distinción entre una matriz dinámica y estática: 'TStringDynArray = array of string; TStringArray = array [0 .. (maxInt div sizeof (string)) - 1] of string; 'Pero no hay una convención oficial al respecto. –

+2

@Warren P: Tenga en cuenta que la nueva unidad 'FileIO' utiliza que es parte de la XE RTL utiliza' TStringDynArray' ampliamente. Entonces no estoy de acuerdo con que no sea idiomático. Especialmente si desea devolver el conjunto y recorrerlo usando un enumerador, esto es muy conveniente (para obtener un ejemplo, consulte 'TDirectory.GetFiles'). – jpfollenius

Respuesta

30
unit Unit1; 

interface 

uses SysUtils; 

type 
    TStringArray = array of string; 

function SomeFunction(SomeParam: integer): TStringArray; 

... 

implementation 

function SomeFunction(SomeParam: integer): TStringArray; 
begin 
    SetLength(result, 3); 
    result[0] := 'Alpha'; 
    result[1] := 'Beta'; 
    result[2] := 'Gamma'; 
end; 

... 

end. 

La regla de oro es que la sección de interfaz de una unidad se describen los tipos de datos utilizados por la unidad, y los tipos, clases y funciones (sus firmas) que residen en la unidad. Esto es lo que todas las unidades otras ven. La sección de implementación contiene la implementación de las clases y funciones. Esto no es visible para unidades adicionales. Otras unidades deben preocuparse por la interfaz de la unidad, el 'contrato' firmado por esta unidad y la unidad externa, no los 'detalles de implementación' que se encuentran en la sección de implementación.

12

Si Delphi es bastante reciente, no necesita declarar un nuevo tipo, declarándolo como TArray<String>.

Ejemplo copiado y pegado de la respuesta anterior:

unit Unit1; 

interface 

function SomeFunction(SomeParam: integer): TArray<String>; 

implementation 

function SomeFunction(SomeParam: integer): TArray<String>; 
begin 
    SetLength(result, 3); 
    result[0] := 'Alpha'; 
    result[1] := 'Beta'; 
    result[2] := 'Gamma'; 
end; 

end. 
+0

+1 para usar – Johan

+1

genérico' TArray '(y genéricos en general) no sin algunos problemas, así que tenga cuidado con él . –

Cuestiones relacionadas