Delphi 在运行时创建组件(动态创建组件)  
官方Delphi 学习QQ群: 682628230(三千人)
频道

Delphi 在运行时创建组件(动态创建组件)


每个程序员在开发时都会遇到困难,其中之一就是我们必须在运行时创建组件。


在设计时创建表单非常容易,但很多时候我们必须在运行时创建它们,不仅是非可视组件,如数据库连接,也不是可视组件,如编辑、按钮、网格等. .


为此,我们必须考虑一系列可能让我们头疼的数据,不仅是程序员,还有最终用户。


在运行时创建组件,一步一步

有两种方法可以在运行时创建组件,第一种是使表单(或任何其他 TComponent)成为所创建组件的所有者。


与所有者动态创建

在编译可视容器拥有子组件的复合组件时,这种做法很常见。以这种方式创建它们是为了确保当拥有的组件被销毁时,已创建的组件也被销毁。


要创建新对象(实例),必须调用其Create方法。Create构造函数是一个类方法,与作为对象方法的所有其他方法不同。


示例 1,创建专有运行时组件

在这个例子中,我们将创建一个以容器窗体为所有者的 TTimer 组件。通过这种方式,我们可以确保 Timer 在 Form 的生命周期内可用,并且会随之销毁。


首先,我们将创建一个名为 vTimer 的 TTimer 类型的全局变量:


type

  TForm1 = class(TForm)

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  vTimer: TTimer;

 

implementation

现在,在窗体的OnCreate事件中(我们希望它与窗体一起创建和销毁)我们创建了 Timer。反过来,我们将属性Interval修改为 5 seconds Enabled为 False,并将过程MyTimerEventHandler分配给将每 5 秒运行一次的事件OnTimer。


我们在Create方法中发送的Self参数表明所有者是 Form,因为它是在 Form 的OnCreate事件中创建的。


procedure TForm1.FormCreate(Sender: TObject);

begin

  vTimer := TTimer.Create(Self);

  with vTimer do

  begin

    Interval := 5000;

    Enabled := False;

    OnTimer := MyTimerEventHandler;

  end;

end;

 

procedure TForm1.MyTimerEventHandler(Sender: TObject);

begin

  // Este procedimiento se ejecutará en el evento OnTimer

  // del objeto vTimer

end;

例如,如果我们在按钮的 OnCreate 事件中创建它,并且无论如何我们希望所有者是 Form,我们应该放置:


vTimer := TTimer.Create(Form1);

通过这种方式,我们已经创建了我们的计时器,它可以在表单的整个生命周期中使用。


没有所有者的动态创建

在运行时创建组件的第二种方法是传递nil参数,这表明它没有所有者。


注意:这种在运行时创建组件的方式很危险,因为我们必须手动销毁对象。如果我们不销毁它,我们的程序就会出现内存泄漏,这对用户来说可能是灾难性的,导致崩溃和内存不足错误。


示例 2,创建无主运行时组件

在第二个例子中,我们将创建相同的 TTimer 组件,但没有所有者,我们将添加它的销毁。


type

  TForm1 = class(TForm)

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  vTimer: TTimer;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  vTimer := TTimer.Create(nil);

  with vTimer do

  begin

    Interval := 5000;

    Enabled := False;

    OnTimer := MyTimerEventHandler;

  end;

end;

 

procedure TForm1.MyTimerEventHandler(Sender: TObject);

begin

  // OnTimer


end;

现在我们必须销毁vTimer对象,这样当form销毁时它也被销毁,我们会在Form的OnDestroy事件中声明它。


procedure TForm1.FormDestroy(Sender: TObject);

begin

  FreeAndNil(vTimer);

end;

通过这种方式,我们可以在运行时创建组件,而不会出现内存泄漏和头痛。



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.12514519691467 seconds