我想使用属性向/从注册表读取/写入属性值。
我看过的所有示例都使用加载/保存功能来遍历所有属性并检查属性。我没有使用加载/保存例程,而是在读取或写入属性时从注册表中读取值。但是,我无法弄清楚如何在Read方法中找到当前属性的名称。
我知道我的属性可以有一行getter / setter,它将正确的字符串值传递给Read / Write方法。我希望我可以使用属性。然后,当我使用我想要保存和恢复的属性定义简单类时。我不需要为这些类编写任何代码。一切都将在基类中处理。
可能这是不可能的。
我以Robert Love的这个例子为出发点: http://robstechcorner.blogspot.de/2009/10/ini-persistence-rtti-way.html
type
RegValueAttribute = class(TCustomAttribute)
private
FName: string;
FDefaultValue: string;
published
constructor Create(const aName : string;const aDefaultValue : String = '');
property Name : string read FName write FName;
property DefaultValue : string read FDefaultValue write FDefaultValue;
end;
TRegBaseClass = class
protected
procedure WriteString(AValue: string);
function ReadString: string;
end;
TMyRegClass = class(TRegBaseClass)
public
[RegValueAttribute('MySavedProperty', 'DefaultValue')]
property MySavedProperty: string read ReadString write WriteString;
end;
///////////////////////////////////////////
function TRegBaseClass.ReadString: string;
begin
// ?? Is there any way to get the attributes for the property
// that got me here.
end;
procedure TRegBaseClass.ReadString(AValue: string);
begin
// ?? Is there any way to get the attributes for the property
// that got me here.
end;
答案 0 :(得分:3)
给定的getter / setter可用于多个属性。 getter / setter知道哪个属性是调用者的唯一方法是在属性声明中使用index
说明符,然后将其作为输入参数传递给getter / setter。然后,getter / setter可以使用RTTI遍历拥有对象的属性,查找具有指定index
的属性,然后根据需要使用该属性的属性。
答案 1 :(得分:0)
关系是该属性与getter和setter相关联。 getter / setter本身没有先验知识,它被用作getter / setter。例如,多个属性可以使用相同的getter / setter。
因此,您可以做的最好的事情就是迭代所有类型的属性,使用RTTI,将当前正在执行的方法作为属性getter / setter进行查找。这听起来不是很有趣。
我怀疑基于属性的最佳方法涉及将属性附加到getter / setter方法。