delphi组件属性动态值

时间:2016-04-15 03:07:03

标签: delphi variables components

如何获取组件属性变量的动态值

在我的组件中我有一个名为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.

3 个答案:

答案 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消息作为触发器将新值应用于组件