2011-05-26 154 views
20

我在我的应用程序中需要返回一个数组的函数。我已经在几个地方发现了如何通过声明数组类型来实现这一点,例如如何从Delphi函数返回数组?

type 
    TStringArray = array of string; 

然后宣布我的功能

function SomeFunction(SomeParam: Integer): TStringArray; 

我的问题是试图在具有两个接口和实现形式进行此设置。我如何声明我的类型并在界面中使用该类型声明函数声明?

+5

“串的阵列”通常是在Delphi认为是“不惯用的”。 TStringList通常是首选。 – 2011-05-27 02:14:03

+1

为了区分动态数组和静态数组,我通常使用“DynArray”后缀命名这种类型定义:'TStringDynArray = string of array; TStringArray = array [0 ..(maxInt div sizeof(string)) - 1];但是没有官方公约。 – 2011-05-27 06:05:13

+2

@Warren P:请注意,新的'FileIO'单元使用的是XE RTL的一部分,广泛使用'TStringDynArray'。所以我不同意这不是惯用的。特别是如果你想返回数组并且使用枚举器遍历它,这是非常方便的(参见例如'TDirectory.GetFiles')。 – jpfollenius 2011-05-27 10:32:25

回答

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. 

金色的规则是,单元的接口部分描述了由单元使用的数据类型,和类型,类和驻留在单元的功能(它们的签名)。这是所有其他单位看到的。实现部分包含类和函数的实现。这对其他单位不可见。其他单位需要关心单位的界面,即本单位和外部单位签署的“合同”,而不是实施部分中的“实施细节”。

12

如果你的Delphi相当新,你不需要声明一个新类型,声明它为TArray<String>

实施例复制并从上面的答案粘贴:

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使用通用 – Johan 2011-05-27 12:53:44

+1

'TArray '(和泛型一般)虽然不是没有一些问题,所以要小心它。 – 2014-05-20 00:49:51