delphi - 替换delphi中的组件类

标签 delphi controls

我知道我在某个地方看到过一个 hack 的例子,它定义了现有 VCL 组件的自定义版本,例如 TButtonTEdit,具有相同的类名并执行一些操作,以便 DFM Streamer 实例化您的版本而不是原始版本。不幸的是,我所处的情况是我需要能够做到这一点,但我找不到这篇文章。有谁知道在哪里可以找到有关如何实现此目标的信息?

最佳答案

在您的表单中,您可以重写 ReadState 方法,如下所示:

type
  TMyForm = class(TForm)
  protected
    procedure ReadState(Reader: TReader); override;
  end;

procedure TMyForm.ReadState(Reader: TReader);
begin
  Reader.OnFindComponentClass := FindComponentClass;
  inherited;
end;

procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string;
  var ComponentClass: TComponentClass);
begin
  if ComponentClass=TButton then begin
    ComponentClass := TMySuperDuperButton;
  end else if ComponentClass=TEdit then begin
    ComponentClass := TMyTotallyAwesomeEdit;
  end;
end;

可能还有很多其他方法可以做到这一点,但这就是我的做法!

编辑:检查TReader.GetFieldClass(Instance: TObject; const ClassName: string)表明梅森记忆起的黑客行为。第一行设置ClassType := Instance.ClassType。因此,我怀疑通过将 pas 文件中的声明从 Button1: TButton 更改为 Button1: MyUnit.TButton 将导致创建按钮。或者也许黑客的做法是将 MyUnit 添加到最后的 use 子句中,以便您的 TButton 版本在范围内。然而,这些听起来都不实用。

关于delphi - 替换delphi中的组件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4685863/

相关文章:

Delphi-调用Win API

c# - 向 WinForm 缓慢添加许多标签

c++ - WinApi 控件未显示在主窗口中

c# - 用于查看对象详细信息的 winforms 控件

delphi - 如何清洗/验证字符串以将其分配给组件名称?

delphi - Delphi 网络启动器

delphi - 如何获得已删除记录的数量?

asp.net - 突然间,我所有的控件都没有声明! (VB.NET)

c# - 使用 .ascx 文件创建自定义控件

delphi - 如何知道什么是 var 类型?