每个程序员在开发时都会遇到困难,其中之一就是我们必须在运行时创建组件。
在设计时创建表单非常容易,但很多时候我们必须在运行时创建它们,不仅是非可视组件,如数据库连接,也不是可视组件,如编辑、按钮、网格等. .
为此,我们必须考虑一系列可能让我们头疼的数据,不仅是程序员,还有最终用户。
在运行时创建组件,一步一步
有两种方法可以在运行时创建组件,第一种是使表单(或任何其他 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