【问题标题】:How to create and instantiate a user-defined component in Delphi?如何在 Delphi 中创建和实例化用户定义的组件?
【发布时间】:2013-04-17 15:45:28
【问题描述】:

我想为我的应用程序创建一个搜索框。搜索框将包括两件事:一个搜索字段和一个搜索按钮。我认为,正确的做法是将这两个组件放在一个组合框中,该组合框将用作将它们容纳在里面的容器。我想我需要创建一个派生自 TGroupBox 类的类,该类在创建时将接收一个表名作为要搜索的参数。搜索框和按钮这两个组件将成为它的子组件——它们是它将如何工作的基本原则。

这张图片说明了搜索框的外观:

这是我到目前为止所做的:

unit clsTSearchBox;

interface

    uses Classes, SysUtils, StdCtrls, Dialogs, ADODB, DataModule;

    type
        TSearchBox = class (TGroupBox)
            constructor CreateNew(AOwner: TObject; Dummy: Integer);     
        end;

implementation

    constructor TSearchBox.CreateNew(AOwner: TObject; Dummy: Integer);
    begin
        inherited;
        Self.Height  := 200;
        Self.Width   := 400;
        Self.Caption := 'Test:'
    end;

end.

如您所见,不多。我刚刚创建了一个从 TGroupBox 类派生的类。请帮助我编写正确的代码来实例化表单上的搜索框组件,因为我真的不知道该怎么做。我只需要正确创建对象的代码。

提前谢谢大家。

【问题讨论】:

  • 尝试查找Custom Containers Pack。如果它可以在 D7 上运行 - 您只需使用 groupbox、edit 和按钮制作一个常规表单,然后将其编译为新组件
  • 一般提示:GExpertsCnWizards 都有组件到代码的操作。将任何组件拖放到表单上,然后运行该操作,您将拥有它的创建代码。如果你喜欢它,学习它并对你的组件做同样的事情。

标签: delphi delphi-7


【解决方案1】:

如果您只是将所有 3 个组件放在一个 TFrame 中,在控件上添加您需要的任何代码,然后实例化该框架的一个实例,这听起来可能会更容易。

然后框架包含组合框、编辑和按钮。您只需使用 TYourFrame.Create 创建框架或在设计时进行。

【讨论】:

    【解决方案2】:

    您的组框希望如下所示:

    type
      TSearchBox = class(TGroupBox)
      private
        FSearchEdit: TEdit;
        FFindButton: TButton;
      public
        constructor Create(AOwner: TComponent); override;
      end;
    

    对于TComponent 的后代,您通常应该覆盖名为Create 的虚拟构造函数。这将允许您的组件由流框架实例化。

    实现如下所示:

    constructor TSearchBox.Create(AOwner: TComponent);
    begin
      inherited;
      FSearchEdit := TEdit.Create(Self);
      FSearchEdit.Parent := Self;
      FSearchEdit.SetBounds(...);//set position and size here
      FFindButton := TButton.Create(Self);
      FFindButton.Parent := Self;
      FFindButton.SetBounds(...);//set position and size here
    end;
    

    可能最重要的教训是您必须设置动态创建的控件的Parent 属性。这是强制底层窗口的父/子关系所必需的。

    为了在运行时创建其中之一,您可以这样编写代码:

    FSearchBox := TSearchBox.Create(Self);
    FSearchBox.Parent := BookTabSheet;
    FSearchBox.SetBounds(...);//set position and size here
    

    此代码将在表单的构造函数或OnCreate 事件中运行。

    我相信您现在已经掌握了基本概念。

    【讨论】:

    • 我明白这一点,但我仍然如何从表单上的 TSearchBox 类创建一个对象?你能帮我解决这个问题吗?因为我不知道该怎么做。我尝试过,但由于代码中的错误,它无法编译。虽然在我看来我写的是正确的。
    • 我回答的最后部分涵盖了这一点。
    • @MikhailRybkin 您只需像其他任何组件一样将其放在表单上
    • @Arioch'The:仅当您将组件安装到 IDE 中时。否则,您必须在代码中创建它。
    • 好的。我写了 FSearchBox: TSearchBox;在表单的对象和变量声明部分。一切似乎都正常,但是当我尝试保存项目时,Delphi 显示此消息:“Field BookManager.FSearchBox 没有相应的组件。删除声明?”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2019-06-24
    • 1970-01-01
    • 2011-03-05
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多