2010-06-08 97 views
6

在Delphi中使用case语句中使用类型常量的最优雅(或最不丑陋)方式是什么?Delphi在case语句中键入常量

也就是说,假设这个问题,你需要声明一个类型常量在

const 
    MY_CONST: cardinal = $12345678; 
    ... 

然后Delphi编译器将不接受

case MyExpression of 
    MY_CONST: { Do Something }; 
    ... 
end; 

,但你需要编写

case MyExpression of 
    $12345678: { Do Something }; 
    ... 
end; 

这是容易出错,难以更新,并不优雅。

是否有任何技巧可以让编译器插入常量的值(最好通过检查源代码中const下的常量值,但可能通过查找运行时的值)?我们假设在这里你不会在运行时改变“常量”的值。

+1

取出“:红衣主教”。问题解决了。你不需要使用TYPE DECLARATIONS,实际上你不需要使用它们。 – 2010-06-08 17:22:24

+0

是的,我知道。但我明确写道:“假设这个问题,你需要声明一个类型常量,如”...我知道 – 2010-06-08 17:30:39

回答

12

根据为什么你需要不断的进行输入,你可以尝试这样

const 
    MY_REAL_CONST = Cardinal($12345678); 
    MY_CONST: Cardinal = MY_REAL_CONST; 

case MyExpression of 
    MY_REAL_CONST: { Do Something }; 
    ... 
end; 
+1

+1是为了回答实际问题! – 2010-06-08 17:48:06

+1

@Andreas:如果你觉得这个答案比我的更好,你可以接受。 SO允许你改变接受的答案。 – 2010-06-09 12:45:21

+0

@梅森惠勒:你说得对。虽然我同意大多数问题都可以在没有键入常量的情况下完成(最终我使用正常常量重写了我的代码),但这是对实际问题的答案,所以我会接受它。 – 2010-06-09 14:54:17

4

如果你不会改变常量的值,那么你不需要它是一个类型常量。编译器可以获取你声明的数字,并将其正确放置到你分配给它的任何变量或参数中。类型常量是一种破解,它们实际上是作为变量实现的,因此编译器不能将它们用作需要在编译时修复其值的常量。

+0

。但是这并没有回答这个问题,因为我写过“假设这个问题,你需要声明一个类型常量”。但总的来说,我同意:我也会回答这样的问题:“为什么你需要使用类型常量?”。 – 2010-06-08 17:05:18

+0

但是,我越想到它,越是意识到如果这是一个问题,你应该“破解”其他东西... – 2010-06-08 17:12:13

+6

*如果你使用的是一个类型常量,因为你希望它是一个特定的类型(例如Cardinal在这个例子中),你可以声明为 MyConst = Cardinal($ FFFFFFFE); case MyExpression of MY_CONST:{Do Something}; ... end; – Remko 2010-06-08 17:22:48

0

键入的常量不能用在case语句中,因为键入的常量实际上更多是一个静态的变量(和assignable ...),因此不能用于需要常量的case语句中。

+0

我不会写“我们在这里假设你不会在运行时改变”常量“的值。”如果我不知道! :) – 2010-06-08 17:38:00

+0

太糟糕了,Delphi不会假设这一点,并允许改变类型常量。 – 2010-06-10 11:10:26