请指点一下这个动态控件创建的问题,谢谢! ( 积分: 50 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
我在看刘艺老师所著的《Delphi面向对象编程思想》一书中有一地方不理解:(第79页)
Factory Method
===============
unit Unit4

interface
...
type
TControlClass=Class of TControl

TControlFactory=class
private
FControlObj:TControl

public
constructor create(AOwner:TWinControl;ControlClass:TControlClass)

end


implementation
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

end.

unit Unit3


interface
...
implementation
uses Unit4


procedure TForm1.Button1Click(Sender:TObject)

const
ContrlClassArry:array[0..2] of TControlClass=(TMonthCalendar,TMemo,TColorBox)

var
ControlObj:TObject

begin
ControlObj:=TControlFactory.creat(self,ContrlClassAry[RadioGroup1.ItemIndex])

...
end

end.

红色标记的二个地方不太理解,
在第一个红色的地方,self是代表什么呢?是表示TControlFactory类所创建的实例吗?
在第二个红色的地方,create方法会返回的一个地址吗?

还请各位大侠指点,谢谢!
 
我在看刘艺老师所著的《Delphi面向对象编程思想》一书中有一地方不理解:(第79页)
Factory Method
===============
unit Unit4

interface
...
type
TControlClass=Class of TControl

TControlFactory=class
private
FControlObj:TControl

public
constructor create(AOwner:TWinControl;ControlClass:TControlClass)

end


implementation
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

end.

unit Unit3


interface
...
implementation
uses Unit4


procedure TForm1.Button1Click(Sender:TObject)

const
ContrlClassArry:array[0..2] of TControlClass=(TMonthCalendar,TMemo,TColorBox)

var
ControlObj:TObject

begin
ControlObj:=TControlFactory.creat(self,ContrlClassAry[RadioGroup1.ItemIndex])

...
end

end.

红色标记的二个地方不太理解,
在第一个红色的地方,self是代表什么呢?是表示TControlFactory类所创建的实例吗?
在第二个红色的地方,create方法会返回的一个地址吗?

还请各位大侠指点,谢谢!
 
尽信书不如无书。我觉得这段代码不好,首先不清晰
很难看懂,我在想这段代码会不会有内存泄露??
我觉得写代码,不要搞深奥,要简洁,大家都能看懂

用浅显的语言和例子说明深层的道理才是好的。
 
self 代表实列
create相当于函数,当然会有返回一个地址.
 
易大侠,在create中,self是代表调用create的类吧?也就是TControlFactory类本身.

如果按照您所讲,那像上面我所写的那段代码,为何要加上self赋值呢?
既然create是一个函数,对result赋值也就可以啦?为何还要这样写呢?

我上面理解是否正确,还请您和其他大侠指点,谢谢!
 
Application.CreateForm();類似
 
我做了个测试TControlFactory修改如下:
type
TControlClass=Class of TControl;
TControlFactory=class
private
FControlObj:TControl;
public
constructor create(AOwner:TWinControl;ControlClass:TControlClass);
destructor Destroy
override;
end;

implementation

{$R *.DFM}

{ TControlFactory }

constructor TControlFactory.create(AOwner: TWinControl;
ControlClass: TControlClass);
begin
MessageBox(0,'Start','Create',0);
FControlObj:=ControlClass.Create(AOwner);
FControlObj.Parent:=AOwner;
FControlObj.Name:=FControlObj.ClassName;
FControlObj.SetBounds(10,10,250,150);
self:=TControlFactory(FControlObj);
end;

destructor TControlFactory.Destroy;
begin
inherited;
MessageBox(0,'Free','Destroy',0);
end;

你试着创建一个控件,然后释放.发现TControlFactory.Destroy没做.
但是TControlFactory.create却做了.为什么没有做,因为
self:=TControlFactory(FControlObj);
这句把关联改掉了.(于是丢掉了一个对象的关联,无法程序释放,直道程序退出).

现修改类如下:

type
TControlClass=Class of TControl;
TControlFactory=class
private

public
class function ctrl(AOwner:TWinControl;ControlClass:TControlClass):TControl;
end;

implementation

class function TControlFactory.ctrl(AOwner: TWinControl;
ControlClass: TControlClass): TControl;
var
c:TControl;
begin
c:=ControlClass.Create(AOwner);
c.Parent:=AOwner;
c.SetBounds(10,10,250,150);
result:=c;
end;

这样因该没问题了(用类方法)
 
这个“刘艺老师”是做什么的?
 
self:=TControlFactory(FControlObj);
这条语句到底做了些什么呢?怎么来理解这条语句呢?

还请大侠指点!
 
self:=TControlFactory(FControlObj);

把当前对象的关联到FControlObj上。于是丢掉自己的关联
 
to 暗月:
这个“刘艺老师”是不是原来在南京朗坤自动化,后来去上海的。
 
他的书俺看不懂
 
我在看刘艺老师所著的《Delphi面向对象编程思想》一书中有一地方不理解:(第79页)
Factory Method
===============
unit Unit4

interface
...
type
TControlClass=Class of TControl

TControlFactory=class
private
FControlObj:TControl

public
constructor create(AOwner:TWinControl;ControlClass:TControlClass)

end


implementation
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)

[red] self:=TControlFactory(FControlObj)
[/red]//这里的self指向TControlFactory类创建的对象。
end

end.

unit Unit3


interface
...
implementation
uses Unit4


procedure TForm1.Button1Click(Sender:TObject)

const
ContrlClassArry:array[0..2] of TControlClass=(TMonthCalendar,TMemo,TColorBox)

var
ControlObj:TObject

begin
[red]ControlObj:=TControlFactory.creat(self,ContrlClassAry[RadioGroup1.ItemIndex])
[/red]//这里的self指向TForm1类创建的对象
...
end

end.

[brown]这个刘艺老师咋搞的,把程序写得这么复杂。[/brown]
 
fu_qi_ming大侠,您所说的我还是不理解,
[blue]self:=TControlFactory(FControlObj);

把当前对象的关联到FControlObj上。于是丢掉自己的关联[/blue]

这个self是指TControlFactory,还是指ControlObj ?还是指其他的呢?
还请指点!谢谢!
 
self 是指要创建该控件的容器,比如TForm因为要创建的是控件类所以要传递这个值
第二个则是用到了对象的多态性由于所有类都是继承自TObject所以当要使用时可以用
如TMemo(Object)转换.返回当然是指址是指向所创建的类的
 
把构造函数改成这样后,你就可以发现其中的东西了。
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);
MessageBox(0,PChar(String(Self.ClassName)),'',0);

self:=TControlFactory(FControlObj);
MessageBox(0,PChar(String(Self.ClassName)),'',0);
end;

我觉得千万不要这样写程序,很差的设计
 
to fu_qi_ming大侠:
我试着用您所写的代码段运行了一下,所得结果:
第一个messagebox显示:TControlFactory
第二个messagebox显示:TMonthCalendar

让我不明白:
在第一个MessageBox(0,PChar(String(Self.ClassName)),'',0);时,我在调试器中看到self.classname=TControlFactory,但为何在执行了TControlFactory强制转换:self:=TControlFactory(FControlObj);后,反而self.classname=TMonthCalendar?
这怎么理解呢?实在是糊涂!还请您和其他各位大侠指点,谢谢!

 
这是很糟糕的设计,而且还有内存泄露,

建议楼主不要深就。
 
这本书我看过,很不错!
 
很是糊涂,还是不能理解到要点,不知哪位大侠能指点一下?
 
后退
顶部