我有一些全局字符串变量。
我需要创建一个函数,可以将它们传递并存储在某个结构中。 之后,我需要枚举它们并检查它们的值。
如何轻松实现这一点?
(我认为我需要某种反射,或者存储指针数组)。 无论如何,任何帮助都将不胜感激。
谢谢!
我有一些全局字符串变量。
我需要创建一个函数,可以将它们传递并存储在某个结构中。 之后,我需要枚举它们并检查它们的值。
如何轻松实现这一点?
(我认为我需要某种反射,或者存储指针数组)。 无论如何,任何帮助都将不胜感激。
谢谢!
首先,您无法使用Delphi的RTTI来实现此目的,因为Delphi 7的RTTI仅涵盖类的已发布成员。即使您使用Delphi XE,全局变量仍然没有RTTI(因为RTTI与类型而非“单元”相关联)。
唯一可行的解决方法是创建自己的变量注册表,并使用名称和指向变量本身的指针注册全局变量。
示例:
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.
var
参数而不是指针会使调用者的接口更加友好。 - David HeffernanTStringList
变量来保存 名称-值对 列表。IniFiles
中的THashedStringList
或类似的后代。 - Ondrej KelleTStringList.Value[]
是一个字符串。这就是为什么我建议使用混合实现,其中TStringList
(或TStringHash
)仅用于索引,而使用基本类型的普通数组用于实际值存储。 - Cosmin Prund<string,variant>
键值对字典。