如何获取组件属性变量的动态值
在我的组件中我有一个名为ColorDefault的字段,我希望能够在程序中动态设置其值。
原始代码
var // global
_V_TB_DefaultColor: TColor
type
TMyClass = class
...
property ColorDefault: tcolor read _V_TB_DefaultColor write FDefaultColor;
//[dcc32 Error] MyButton.pas(85): E2168 Field or method identifier expected
...
end;
编辑:
我按照Tom所描述的那样做了,但是颜色没有根据全局变量而变化,颜色保持与编译时一样,例如我的全局颜色是clyellow并且我遵守了我的组件并将其放在表单上,之后我将全局颜色变量更改为clwhite,当我运行程序时,它仍然是clyellow
type
TTestClass = class(TPanel)
private
{ Private declarations }
protected
{ Protected declarations }
FColorDefault:tcolor;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetGlobalColorVariable:TColor;
published
{ Published declarations }
property DefaultColor:TColor read GetGlobalColorVariable write FColorDefault;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyComponents', [TTestClass]);
end;
constructor TTestClass.Create(AOwner: TComponent);
begin
ColorInitiate;
inherited;
color:=DefaultColor;
end;
destructor TTestClass.Destroy;
begin
inherited;
end;
function TTestClass.GetGlobalColorVariable: TColor;
begin
result:=_V_TB_DefaultColor;
end;
end.
答案 0 :(得分:0)
您需要查看有关属性的文档 http://docwiki.embarcadero.com/RADStudio/XE7/en/Properties
您的代码
property ColorDefault:tcolor read _V_TB_DefaultColor write FDefaultColor;
未经编译器批准,因为_V_TB_DefaultColor
不是您班级的字段或方法。该属性应该声明为:
property ColorDefault:tcolor read FDefaultColor write FDefaultColor;
将FDefaultColor
设置为等于您需要的全局变量_V_TB_DefaultColor
MyClass.ColorDefault := _V_TB_DefaultColor;
在您的代码中的适当位置,在您的类的构造函数中的f.ex。
注意,要更改组件的颜色,需要为ColorDefault
属性分配新值。更改全局变量_V_TB_DefaultColor
的值不会自动更改属性的值。
在修改后的代码中添加了
function TTestClass.GetGlobalColorVariable: TColor;
begin
result:=_V_TB_DefaultColor;
end;
如果你不将函数的结果赋给某个东西,那么这将不会做任何事情。由于该函数是TTestCalss
的成员,我相信你想要的
直接在此函数中设置Color
属性:
function TTestClass.GetGlobalColorVariable: TColor;
begin
Color:=_V_TB_DefaultColor;
end;
如果是这种情况,您可以将其更改为procedure
,因为您不使用返回值:
procedure TTestClass.GetGlobalColorVariable;
begin
Color:=_V_TB_DefaultColor;
end;
答案 1 :(得分:0)
看着你的问题,你似乎正在处理两个问题。
第一个问题是如何使用属性访问某些全局变量。
您可以使用属性的Getter方法执行此操作:
type
TTestClass = class(TPanel)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
function GetDefaultColor: TColor;
published
{ Published declarations }
property DefaultColor: TColor read GetDefaultColor;
end;
var // global
_V_TB_DefaultColor: TColor
implementation
function TTestClass.GetGlobalColorVariable: TColor;
begin
result := _V_TB_DefaultColor;
end;
就像你在编辑问题中所做的那样。这将始终使DefaultColor属性返回与存储在全局_V_TB_DefaultColor变量中相同的值。
但请注意,这不会检测_V_TB_DefaultColor变量何时更改。因此,如果您想在更改后更新组件,则需要自己为每个组件执行一些更新过程。
还要记住,使用像这样的全局变量不是一个好习惯。
如果您希望所有组件的某些属性具有相同的值,那么将该属性声明为类属性会更好,如下面的代码所示。
type
TTestClass = class(TPanel)
private
{ Private declarations }
class var FDefaultColor: TColot;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
class function GetDefaultColor: TColor;
published
{ Published declarations }
class property DefaultColor: TColor read FDefaultColor write FDefaultColor;
end;
现在,在一个组件中更改DefaultColor将更改同一类的所有组件的DefaultColor。但请记住,您仍需要为每个组件执行正确的过程以进行更新。这不会自动完成。
现在你的第二个问题是检测DefaultColor变量的变化并相应地更新你的组件。
现在,如果使用全局变量,则没有机制来检测它。但是,如果您正在使用类过程,那么您至少可以编写一个setter方法,该方法将执行需要更新的所有组件的更新方法,或者向它们发送必要的通知,以便它们可以自己执行必要的更新。
如何实现?
一种方法是遍历所有表单组件,检查其类型并执行必要的更新过程。但如果您有许多其他组件需要检查它们是否正确,那么这可能会非常慢。
另一种可能更好的方法是将您的组件添加到单独的列表中,这样您就不需要进行类型检查,因为您知道这样的列表只包含正确的组件。
答案 2 :(得分:-1)
谢谢大家,
我所做的所有建议是使用函数从全局变量中获取值并使用Windows消息作为触发器将新值应用于组件