2016-04-15 108 views
-1

我怎样才能动态值,我的组件的属性变量德尔福组件属性动态值

在我的部分,我有一个名为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; 

编辑:

我照下面所描述的汤姆但颜色没有改变根据全局变量,颜色停留当它遵守作为例如我的全球颜色是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

没有多大意义在'FDefaultColor'字段中,如果你想从另一个变量 – MBo

+0

中读取属性值,我看不到'ColorDefault'的任何属性声明,也没有'_V_TB_DefaultColor'的任何声明。请与您的标识符一致。这个问题与你最初提出的问题不同,并且变得一团糟。你读过关于房产的文档吗?如果你想改变一个属性,你必须为它分配一个新的值。 –

+0

如果您希望'ColorDefault'属性发生变化,只需更改'_V_TB_DefaultColor',答案是否定的,否则不会发生,不存在这样的automagic。我在我的回答中添加了一段关于此的内容。 –

回答

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方法,它将执行需要更新的所有组件的更新方法,或者向它们发送必要的通知,以便它们可以自行执行必要的更新。

如何实现这个?

一种方法是循环检查所有窗体组件的类型并执行必要的更新过程。但是,如果您有许多其他组件需要检查它们是否正确,那可能会很慢。

另一个可能更好的方法是将您的组件添加到单独的列表中,因此您不需要进行类型检查,因为您知道此列表仅包含正确的组件。

+0

谢谢,通过你的解释,我得到了关于如何在自定义组件中使用全局变量以及如何在组件上使用全局变量的想法,我必须使用funcitons来获取全局变量的值, (在运行时)被通知/应用新的值,当全局变量的值改变时,我必须使用触发器 –

0

您neeed审查文档中关于性能 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; 
+0

@Tom Brunberg关于'automagically change' - 我们可以把'Get readDefaultColor'当作自动切换,其中'GetDefaultColor'是读取全局变量的函数。但'FDefaultColor'字段变得毫无用处。 – MBo

+0

@MBo是的,但吸气剂仍然必须被触发。改变全球不会那样做。 –

+0

@Tom Brunberg目前还不清楚他是否使用FDefaultColor字段。如果没有,吸气剂可能会有所帮助。 – MBo

-1

感谢大家,

与所有建议,我要做的就是用一个函数来获取从全局变量的值,并使用Windows消息作为触发新的价值观适用于组件