创建一个字符串常量数组。

48

在Delphi中是否有一种声明字符串数组的方法,例如下面这个数组?

{'first','second','third'}
4个回答

62
在XE7中,您可以像这样声明动态数组常量:
const
  MyArray: TArray<String> = ['First','Second','Third'];

1
请注意,由于RSP-21151中记录的编译器错误,这在目前对于类常量不起作用(出现E2086 Type 'TArray<T>' is not yet completely defined错误),除非您在单元中添加一个额外的:type TStringArray = TArray<string>;。(请注意,必须在单独的type部分中才能防止该错误,并且这种解决方法似乎无法解决泛型类的问题。有关所有详细信息,请参见工单。) - Marcus Mangelsdorf

59

试试这个

Const
Elements =3;
MyArray  : array  [1..Elements] of string = ('element 1','element 2','element 3');

2
谢谢,尽管我希望避免使用Elements并让Delphi计算数组的大小。 - none
5
你可以避免使用元素常量,但是仍需要声明数组的大小。你可以使用"简写"数组[x],其中x是一个枚举类型,从类型的第一个到最后一个元素创建一个数组。编译器不支持array[] = (1,2,3)计算数组大小并自动设置0..2边界。 - user160694
1
太棒了,一直以为这是不可能的 :D - Jerry Dodge

22

你可以使用动态数组并尝试这样做:

var
  FMyArray: TArray<string>;

function MyArray: TArray<string>;
begin
  if Length(FMyArray) = 0 then
    FMyArray := TArray<string>.Create('One', 'Two', 'Three');
  Result := FMyArray;
end;

虽然这段代码在堆上对动态数组进行了运行时初始化,但它也展示了Delphi支持动态数组上的“伪构造函数”,允许原地初始化。(注意:以上代码不是线程安全的)。

现在你只需要使用Length()标准函数来查找数组的长度,或使用Low()和High()标准函数来查找允许的索引范围。

如果您使用的是较旧版本的Delphi,请替换TArray为您自己的动态数组字符串类型,例如:

type
  TStringArray = array of string;

1
是的,那是有效的,但它需要是常量而不是运行时的。 - none
1
元素是恒定的,只有数组不是。除了启动成本之外,几乎没有运行时开销。它仅仅因为传统需要被声明为const吗?还是因为您的情况需要特定的const声明? - Allen Bauer
3
如果数组不是常量,那么数组可能会改变。这不符合要求。不过,这个想法很好。 - none

2
你可以通过间接的方式实现这个目标。创建一个如下的函数:
```python def indirect(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper ```
procedure assignStringArray(var rasVelden: ArrayOfString; const asVeldenIn: Array Of String);
var
   iLengte, iT1: Integer;
begin
   iLengte := Length(asVeldenIn);
   SetLength(rasVelden, iLengte);
   for iT1 := iLengte-1 downto 0 do
      rasVelden[iT1] := asVeldenIn[iT1];
end;

并像这样调用此函数:

assignStringArray(asVelden, ['String1', 'String2', 'String3']);

where:

asVelden: ArrayOfString; 

在实际操作中看到这样的数组字面量是不可或缺的。 - Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接