如何在Delphi中创建和实例化用户定义的组件?

时间:2013-04-24 07:35:19

标签: delphi delphi-7

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

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

enter image description here

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

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类派生的类。请帮助我编写正确的代码来实例化我的表单上的搜索框组件,因为我真的不知道该怎么做。我只需要用于正确创建对象的代码。

提前谢谢大家。

2 个答案:

答案 0 :(得分:3)

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

然后框架保持组框,编辑和&按钮。您只需使用TYourFrame.Create创建框架,或者在设计时执行此操作。

答案 1 :(得分: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事件中运行。

我相信你现在得到了基本的想法。