看<>的一点疑惑
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申请的这段内存的引用岂不是丢了
我觉得这产生内存的泄漏,而作者在这写这是比较绝妙的
我天生愚笨,没看懂,大家看一下.
相关推荐
<<Delphi XE10.2下使用FireMonkey进行跨平台开发>>
DelphiXE10.2下使用FMX开发跨平台的应用,但不是特别针对APP,书中更多的内容是在Mac OS X环境下的开发的内容.原著德国人Harry Stahl的<<2017-Cross-Platform Development with Delphi XE10.2 & FireMonkey for Windows & MAC OS X>>.基本是借助有道的在线翻译功能,自己通读了一下没有太大的歧义. 有五,六处段落的翻译是靠自己的理解进行的意译,因为没有Mac平台进行验证,如果读者发现错误后能反馈本人,感激不敬! 联系方式:15309974713@189.cn
<<Delphi程序开发范例宝典>>高清压缩djvu版(只有28M)part3
从“DELPHI 盒子”下载的这本书有400多M,实在是占用太多的空间,于是我把它转换成djvu格式,收藏阅读很是方便,希望大家喜欢。用Windjview0.5版阅读,带完整书签。此软件可以设置背景为灰调,整个文档都如此,阅读不累眼睛,不象pdf文档,有的页面背景不透明。有的文档一会白,一会灰的,感觉不爽。现在我电脑上的各种扫描版或影印版的pdf电子书,我都转换成了djvu格式,许多在网上搜集的动不动上百M的pdf大块头,现在都只有十几到二十几M的大小,省出了我好多的硬盘空间。
<<Delphi程序开发范例宝典>>高清压缩djvu版(只有28M)part 2
从“DELPHI 盒子”下载的这本书有400多M,实在是占用太多的空间,于是我把它转换成djvu格式,收藏阅读很是方便,希望大家喜欢。用Windjview0.5版阅读,带完整书签。此软件可以设置背景为灰调,整个文档都如此,阅读不累眼睛,不象pdf文档,有的页面背景不透明。有的文档一会白,一会灰的,感觉不爽。现在我电脑上的各种扫描版或影印版的pdf电子书,我都转换成了djvu格式,许多在网上搜集的动不动上百M的pdf大块头,现在都只有十几到二十几M的大小,省出了我好多的硬盘空间。
<<Delphi程序开发范例宝典>>高清压缩djvu版(只有28M,共三部分)part 1
从“DELPHI 盒子”下载的这本书有400多M,实在是占用太多的空间,于是我把它转换成djvu格式,收藏阅读很是方便,希望大家喜欢。用Windjview0.5版阅读,带完整书签。此软件可以设置背景为灰调,整个文档都如此,阅读不累眼睛,不象pdf文档,有的页面背景不透明。有的文档一会白,一会灰的,感觉不爽。现在我电脑上的各种扫描版或影印版的pdf电子书,我都转换成了djvu格式,许多在网上搜集的动不动上百M的pdf大块头,现在都只有十几到二十几M的大小,省出了我好多的硬盘空间。
Delphi6函数大全
Delphi6函数大全(1) <<Delphi6函数大全1-StrUtils.pas>> 首部 function AnsiResemblesText(const AText, AOther: string): Boolean; $[StrUtils.pas 功能 返回两个字符串是否相似 说明 ANSI(American National Standards Institute)美国国家标准协会;不区分大小写 参考 function StrUtils.SoundexProc; var StrUtils.AnsiResemblesProc 例子 CheckBox1.Checked := AnsiResemblesText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━ 首部 function AnsiContainsText(const AText, ASubText: string): Boolean; $[StrUtils.pas 功能 返回字符串AText是否包含子串ASubText 说明 不区分大小写 参考 function StrUtils.AnsiUppercase; function StrUtils.AnsiPos 例子 CheckBox1.Checked := AnsiContainsText(Edit1.Text, Edit2.Text); ━━━━━━━━━━━━━━━━━━━━━


