看<>的一点疑惑
xzgyb 2003-10-28 01:23:48 今天看了会刘艺写的<<Delphi面向对象编程思想>>
79页的
示例程序 3-10 Factory Method 模式下动态控件创建的进一步改进
有了点疑惑,代码贴出来,大家有时间看看
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TControlClass = class of TControl;
TControlFactory = class
private
FControlObj: TControl;
public
constructor Create(AOwner: TWinControl; ControlClass: TControlClass);
end;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
RadioGroup1: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ControlObj: TObject;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
{ TControlFactory }
constructor TControlFactory.Create(AOwner: TWinControl;
ControlClass: TControlClass);
begin
FControlObj := ControlClass.Create(AOwner);
FControlObj.Parent := AOwner;
FControlObj.Name := FControlObj.ClassName;
FControlObj.SetBounds(10, 10, 250, 150);
Self := TControlFactory(FControlObj);
end;
procedure TForm1.Button1Click(Sender: TObject);
const
ControlClassArray: array[0..2] of TControlClass =
(TMonthCalendar, TMemo, TColorBox);
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
if (Controls[I] is TMonthCalendar) or (Controls[I] is TMemo)
or (Controls[I] is TColorBox) then
Controls[I].Free;
ControlObj := TControlFactory.Create(Self,
ControlClassArray[RadioGroup1.ItemIndex]);
Label1.Caption := ControlObj.ClassName;
if (ControlObj is TMemo) then TMemo(ControlObj).Lines.Add('测试成功!');
if (ControlObj is TColorBox) then TColorBox(ControlObj).ItemIndex := 2;
end;
end.
疑惑的地方在TControlFactory的Create里
Self := TControlFactory(FControlObj);
我不知道是不是我好久没看delphi的缘故,这句我觉得这样写那TConrolFactory申请的这段内存的引用岂不是丢了
我觉得这产生内存的泄漏,而作者在这写这是比较绝妙的
我天生愚笨,没看懂,大家看一下.