delphi 组件 属性 动态值

delphi component property dynamic value

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

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

您需要查看有关属性的文档 http://docwiki.embarcadero.com/RADStudio/XE7/en/Properties

您的代码

property ColorDefault:tcolor read _V_TB_DefaultColor write FDefaultColor;

未被编译器批准,因为 _V_TB_DefaultColor 不是您的 class 的 字段或方法 。 属性 应该声明为:

property ColorDefault:tcolor read FDefaultColor write FDefaultColor;

要将 FDefaultColor 设置为等于全局变量 _V_TB_DefaultColor,您需要

MyClass.ColorDefault := _V_TB_DefaultColor;

在代码中的合适位置,f.ex 在 class 的构造函数中。

请注意,要更改组件的颜色,您需要为 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,因为您不使用 return 值:

procedure TTestClass.GetGlobalColorVariable;
begin
  Color:=_V_TB_DefaultColor;
end;

从你的问题来看,你似乎在处理两个问题。

第一个问题是如何使用属性访问一些全局变量。

您可以使用 属性 的 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 属性 到 return 与存储在全局 _V_TB_DefaultColor 变量中的值相同。

但请注意,这不会检测 _V_TB_DefaultColor 变量何时更改。因此,如果您想在更改后更新您的组件,您需要自己为每个组件执行一些更新过程。

另外请记住,像这样使用全局变量不是一个好习惯。

如果您希望所有组件中的某些 属性 具有相同的值,那么将 属性 声明为 class 属性 会更好在下面的代码中。

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 class。但请记住,您仍然需要为每个组件执行适当的程序以进行自我更新。这不会自动完成。


现在你的第二个问题是检测你的 DefaultColor 变量的变化并相应地更新你的 component/s。

现在,如果您使用全局变量,则没有检测到这一点的机制。但是,如果您正在使用 class 过程,那么您至少可以编写一个 setter 方法,该方法将执行所有需要更新的组件的更新方法,或者向它们发送必要的通知,以便它们可以执行必要的操作自行更新

如何实现?

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

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

谢谢大家,

根据所有建议,我所做的是使用一个函数从全局变量中获取值,并使用 windows 消息作为触发器将新值应用到组件