2008-10-29 141 views
2

我想要做这样的事情:是否有可能做声明一个包含另一个常量数组的常量数组?

const 

    MyFirstConstArray: array[0..1] of string = ('Hi', 'Foo'); 
    MySecondConstArrayWhichIncludesTheFirstOne: array[0..2] of string = 
    MyFirstConstArray + ('Bar'); 

基本上我想要的结果如下:

MyFirstConstArray -> ('Hi', 'Foo'); 
MySecondConstArrayWhichIncludesTheFirstOne -> ('Hi', 'Foo', 'Bar'); 

是否有可能以某种方式?

回答

2

AFAIK,你不能那样做。
但是,如果我们的目标是确保你宣布你的实际字符串常量只有一次,我建议你申报的个人字符串,然后将它们分组在阵列:

const 
    MyConst1 = 'Hi'; 
    MyConst2 = 'Foo'; 
    MyConst3 = 'Bar'; 
    MyFirstConstArray: array[0..1] of string = (MyConst1, MyConst2); 
    MySecondConstArrayWhichIncludesTheFirstOne: array[0..2] of string = 
    (MyConst1, MyConst2, MyConst3); 

顺便说一句,你的语法不正确,你必须精确数组元素的类型。

+0

我已经这样做了,但我真正想要的是避免在第一个项目中添加新项目时更新每个数组的麻烦。但是,如果没有办法做到这一点,那么这是无法帮助的。 – 2008-10-29 18:44:19

0

我不这么认为。你必须在代码中完成。如果这些是全局常量,则可以在单元的“初始化”部分进行初始化。

1

其实,你可以用记录来做。我大量使用这种技术为我的软件中的某些实体行为创建定义。这是一个非常强大的技术:

type 
     TPerson=record 
     // generally you'd put all kinds of addition stuff here including enums, 
     // sets, etc 
     saPets:array[0..2] of string; 
     end; 

const 
    scDog='Dog'; 

    MyPeople:array[0..1] of TPerson= 
    ((saPets:(scDog, 'Cat', 'Fish');), 
    (saPets:('Iguana', 'Tarantula', '');)); 

begin 
    ShowMessage(MyPeople[0].saPets[0]); 

end; 

你不能用它做的一件事是引用资源字符串。因此任何翻译都必须由检索值的代码完成。我通常使用枚举将它们索引 - 这样做,我可以使软件更易于更改,因为如果我留下了一些重要的东西,它将无法编译。

1

如果订单不相关,则使用枚举集合。

type 
    TMyConsts = (tConstFoo, tConstHi, TConstBar); 
const 
    MyFirstConstSet = [tConstFoo, tConstHi]; 
    MySecondConstSet = MyFirstConstSet + [TConstBar]; 
    MyConstStrings: array[TMyConsts] of string = ('Foo', 'Hi', 'Bar'); 

可以使用MyConstStrings阵列解决您的枚举转换为字符串,如果你想要的。取决于你的目标。

相关问题