如何通过名称(字符串)访问变量?

时间:2011-07-18 08:38:01

标签: delphi rtti

我有一些全局字符串变量。

我必须创建我可以传递的功能&将它们存放在某种结构中。 后来我需要枚举它们并检查它们的值。

如何轻松实现这一目标?

(我想我需要某种反射,或存储指针数组)。 无论如何,任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:7)

首先,您不能将Delphi的RTTI用于此目的,因为Delphi 7的RTTI仅涵盖已发布的类成员。即使您使用的是Delphi XE,仍然没有全局变量的RTTI(因为RTTI与类型相关联,而不是“单位”)。

唯一可行的解​​决方案是创建自己的变量注册表并使用名称和指向var本身的指针注册全局变量。

示例:

unit Test;

interface

var SomeGlobal: Integer;
    SomeOtherGlobal: string;

implementation
begin
  RegisterGlobal('SomeGlobal', SomeGlobal);
  RegisterGlobal('SomeOtherGlobal', SomeOtherGlobal);
end.

是否需要在某处定义RegisterXXX类型,可能在自己的单元中,如下所示:

unit GlobalsRegistrar;

interface

procedure RegisterGlobal(const VarName: string; var V: Integer); overload;
procedure RegisterGlobal(const VarName: string; var V: String); overload;
// other RegisterXXX routines

procedure SetGlobal(const VarName: string; const Value: Integer); overload;
procedure SetGlobal(const VarName:string; const Value:string); overload;
// other SetGlobal variants

function GetGlobalInteger(const VarName: string): Integer;    
function GetGlobalString(const VarName:string): string;
// other GetGlobal variants

implementation

// ....

end.

答案 1 :(得分:7)

您还可以拥有一个全局TStringList变量,其中包含name-value pairs列表。

答案 2 :(得分:2)

在Delphi 7上,我会遵循Cosmin对接口的想法,对于实现,我会使用基于Julian Bucknall的Delphi优秀数据结构代码的字典类型ezDSL

像XE这样的delphi版本不仅具有更高级的RTTI,它们还包含一个非常棒的字典类型,使用泛型,因此字典可以包含您喜欢的任何类型。 esDSL字典非常易于使用,但由于它是基于指针的,因此它不像delphi泛型字典那样安全。

因为您需要做的是在非常快的时间内查找字符串“变量名称”(我们喜欢称之为O(1)),您需要的是字符串到变量字典。您可以使用字符串作为键,将Variants作为字典中的值,然后摆脱原始的全局变量,或者您可以尝试一些相当复杂的指针 - 全局逻辑,但我真的认为你会更好关闭<string,variant>键,值元组的简单字典。