【问题标题】:Styling components by extending their class通过扩展它们的类来设置组件的样式
【发布时间】:2011-03-25 22:00:28
【问题描述】:

来自这个问题Passing object in reference / one place to style objects

我只是在想,如果我为我正在设计的项目创建一个后代类会怎么样。

例如(请原谅糟糕的代码,不在 ide 中,但你应该明白我的意思)

TStyledButton = class(TButton)
  public 
     constructor Create; //This overrides the main TButton
end;

constructor TStyledButton.Create;
begin
   inherited;
   self.Color := clRed;
end;

然后在我的表单中,我只是将 Button1 作为 TStyledButton。

这将删除表单创建中的所有额外代码以处理设置样式/调用函数来设置样式。

唯一的问题是,这将如何在设计视图中进行,我是否必须注册此对象(组件?)以便它实际上像往常一样显示在设计视图中。

【问题讨论】:

  • 拥有自己的一套源自标准 VCL 组件的组件和控件会带来很多好处,但代价是需要额外的管道。至于如何让这些组件进入设计器,我记得都是有据可查的。

标签: delphi object styling


【解决方案1】:

在了解Delphi packages 组件编写者的同时,您可以使用 IDE 专家创建新组件,并在创建新设计时包时自动将其添加到组件面板中:

首先使用 IDE 专家在 Component/New 组件中创建它:

出现提示时,选择安装到新包

提供包(文件)名称和描述

瞧!你的调色板中有你的新组件:

试试这个代码:

  TMyButton = class(TButton)
  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation
uses Graphics;

{ TMyButton }

constructor TMyButton.Create(AOwner: TComponent);
begin
  inherited;
  Font.Style := [fsBold];
  Caption := 'Click me!';
end;

你会得到这个:

【讨论】:

  • 在这里遇到了一个主要问题 :( 当您将组件放在表单上时,它会运行组件“创建”方法,该方法不会在运行时重新运行......这意味着任何样式更改后在扩展对象创建方法中调整的组件已放置在表单上,​​这将不起作用。这几乎就像我需要在运行时重新运行创建方法一样!
  • 对不起,看起来它的 Create 是运行的,但是之后会插入 IDE/Object Inspector 中的设置。是否有在运行 dfm 值之后运行的方法。
  • 解决方案:需要重写Loaded方法。因此,创建一个名为whatever 的新产品,然后在您覆盖的Create 和Loaded 方法中,在Inherited 调用这个新过程之后。像魅力一样工作!
  • 不,Wizzard,您不需要在 Loaded 中执行任何操作。可以在构造函数运行后应用存储的属性。存储的属性与您在构造函数中设置的值相同,因此无论是重新应用它们还是用户在将组件放置在表单上后更改了它们的值都没有区别,您不应该混淆它。
  • 如果您不希望用户在将控件放在表单上后更改属性值,那么首先不要发布这些属性。从 TCustomButton 而不是 TButton 下降。
【解决方案2】:

是的,您需要注册它才能显示在设计视图中。

这可能是个好主意,因为您始终可以继续更改组件的行为。您需要更改组件样式,并且将来您可能需要另一件事。

所以,我会这样做。

编辑:

您可以轻松地将所有TButtons 更改为您自己的类型,方法是创建一个应用程序,该应用程序将搜索 DFM 和 PAS 以查找 TButtons 等组件并将其更改为您自己的。或者你可以使用GExperts替换组件功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2019-10-05
    • 2020-05-02
    • 2019-03-28
    • 2020-01-09
    相关资源
    最近更新 更多