Delphi子类可视化组件并使用它

spu*_*eon 5 delphi overriding subclass

我想将TToolBar子类化为另一个名为MyTToolBar的类,以便我可以覆盖一个方法.我是Delphi的新手,但经过两个小时尝试各种方法后,我无法使用MyTToolBar代替TToolBar.我不能成为第一个想要在可视组件类上覆盖方法的人.

我来自Xcode背景,其中可视化组件的子类化很容易.您创建父类的子类(例如,MySubclass)(例如,MySuperClass),然后只需在Xcode的Interface Builder视图中分配子类.子类被自动识别和使用.

为什么我在Delphi RAD Studio XE3中似乎无法做到这一点?

将TToolBar添加到TForm后,似乎无法更改类.我尝试了Object Inspector以及.PAS源代码文件.如果我更改.PAS文件中的类,我会收到一条错误消息,指出工具栏"应该是Vcl.ComCtrls.TToolBar类型,但声明为MyTToolbar.更正声明?" 这看起来很傻......

哦,我还使用了新的组件向导选择:文件 - >新建 - >其他 - > Delphi项目 - > Delphi文件 - >组件.我选择MyTToolBar的祖先作为TToolBar并告诉它在'Samples'调色板页面中注册.但是,它不会出现在"样本"页面中.

Rem*_*eau 15

与XCode方法最接近的是使用Delphi中的"内插器"类.基本上,您不会更改IDE为标准TToolBar用法创建的代码.您改为声明一个派生自标准TToolBar组件但又命名的新类,并在声明标准使TToolBar编译器可以看到它.无论编译器最后一次看到哪个类,都将是在流式传输DFM 时实例化的实际类类型.TToolBarTToolBarTForm

您可以通过两种不同方式之一TToolBar使编译器在标准TToolBar类之后看到您的自定义类:

  1. TToolBar在与您的TForm类相同的单元中声明自定义类:

    unit MyForm;
    
    interface
    
    uses
      ..., Vcl.ComCtrls, ...;
    
    type
      TToolBar = class(Vcl.ComCtrls.TToolBar)
        // override what you need...
      end;
    
      TMyForm = class(TForm)
        ToolBar1: TToolBar; // <-- do not change this!
        ...
      end;
    
    implementation
    
    // implement custom TToolBar as needed...
    
    // normal TForm implementation code as needed ...
    
    end.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以TToolBar在自己的单元中声明自定义类,然后在添加TForm单元uses后将其添加到单元的子句中ComCtrls:

    unit MyToolBar;
    
    interface
    
    uses
      ..., Vcl.ComCtrls;
    
    type
      TToolBar = class(Vcl.ComCtrls.TToolBar)
        // override what you need...
      end;
    
    implementation
    
    // implement custom TToolBar as needed...
    
    end.
    
    Run Code Online (Sandbox Code Playgroud)

    .

    unit MyForm;
    
    interface
    
    uses
      ..., Vcl.ComCtrls, ..., MyToolBar;
    
    type
      TMyForm = class(TForm)
        ToolBar1: TToolBar; // <- do not change this!
        ...
      end;
    
    implementation
    
    // normal TForm implementation code as needed ...
    
    end.
    
    Run Code Online (Sandbox Code Playgroud)

此方法仅适用于每个项目.如果要TToolBar在多个项目中使用自定义类,那么最好将其安装到IDE中,如@KenWhite所述,并使用它而不是标准TToolBar.回到命名它TMyToolBar(或其他),不要再命名它TToolBar,因为它不会被用作插入器.确保在其项目选项中将包标记为"运行时和设计时"(创建单独的仅运行时和设计时包在本讨论的范围之外). TMyToolBar将在设计时提供,您可以放弃TForm任何其他组件.如果不是,那么您没有正确设置它.

  • +1,但我发现(本地)类助手要好得多.如果您在辅助方法中使用Self作为前缀,则甚至可以访问私有成员. (2认同)
  • 类助手可以向现有类添加新属性/方法,但它不能覆盖现有方法.并且只有过去几年的版本才支持课程助手. (2认同)
  • @Remy:编辑说明:*“内容,德尔福杂志第 33 期,1998 年 5 月”* ... ... *“内插类 Stephen Posey 描述了一种暴露额外(通常是隐藏的)属性和方法的巧妙方法,以及在组件中添加新组件,而无需创建新组件。”* AFAIK 不再在线提供。 (2认同)

Ken*_*ite 5

要更改现有表单上的组件,它实际上必须是IDE可以在设计时创建实例的组件.这意味着IDE必须首先了解它.

这样做的方法是创建自己的后代组件,并实际将其安装到IDE中的设计时包中.然后,您可以将其放在表单而不是标准版本上,或者通过一些工作将其替换为现有表单.(你必须首先创建你的版本并安装它.)

开始File->New->Package (Delphi)从IDE的菜单.像任何其他项目一样保存包(例如,MyComponents.dpk).

现在使用File->New->Other->Delphi Files,然后双击Component右侧窗格.该New Component向导将启动,您可以在其中选择要从中下降的现有组件(或设计一个新组件).

按照向导的步骤进行操作,最终得到组件的基本shell:

unit MyToolBar1;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ToolWin, Vcl.ComCtrls;

type
  TMyToolBar = class(TToolBar)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyToolBar]);
end;

end.
Run Code Online (Sandbox Code Playgroud)

在新的后代中实现所需的任何功能,然后保存文件.

右键单击Project Manager(默认情况下IDE中右上角的窗口)中的包,然后Install从上下文菜单中选择.这将编译和构建包,并自动将其安装在IDE中.(我展示的示例会Samples根据RegisterComponents调用中指示的内容将新组件放在调色板的页面上.)

完成上述操作后,您可以更改现有表单(首先备份.pas和.dfm文件!).我将使用TToolBar你提到的,并且样品替换我已经在下面的说明中发布了shell.

手动将源代码编辑器中的类名更改TToolBarTMyToolBar.

右键单击表单,然后View as Text从上下文菜单中选择.

找到TToolBar并将其更改TToolBarTMyToolBar.

再次右键单击,然后View as Form从上下文菜单中选择.如果您已正确完成这些步骤,则单击工具栏应TMyToolBar在对象检查器中显示.如果你没有看到它(或者你收到错误消息),你做错了什么; 您可以通过右键单击代码编辑器顶部并选择关闭选项卡,然后Close tab对提示保存更改回答"否",然后根据需要从备份副本中恢复,我告诉您先制作.