基本的OOP问题,关于 Self (看了Delphi DG 的书,自己也写了段子, 有些疑惑) self就是你procedure TForm1.Button1Click(Sender: TObject)中的sender:tform1 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 A:变量可以被他的子类实例化,反之不可以;implementation 部分定义的变量不可以被其他的UNIT使用,interface部分可以B:self相当于this,可以理解为输出该方法的对象实例的指针,本例中为;AOwner是所有者,to delphi0302(dr) :该例中sender是Button1,self是form1,Tform1是类而不是对象 A:变量可以被他的子类实例化,反之不可以;implementation 部分定义的变量不可以被其他的UNIT使用,interface部分可以B:self相当于this,可以理解为输出该方法的对象实例的指针,本例中为form1;AOwner是所有者,to delphi0302(dr) :该例中sender是Button1,self是form1,Tform1是类而不是对象 A:如果从TForm类创建实例,是系统默认的窗体对象,因此不是你需要的,而利用TForm1(你自己创建的)创建实例,则属性都与TForm1一样;B:AOwner其实就是你创建的实例的对应类,Self是个隐含的指针,指向实例对应的类你可以看一下Delphi的Oop思想! var Form1: TForm1; Temp: TForm;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin Temp := TForm.Create(Button1); // 这段代码可以用, 但是那个按钮用不起 ShowMessage (Temp.Owner.Name); // 这个 owner 好像不起任何作用,看起来好像是某种多态性 Temp.Color := Form1.Color; Temp.Left := 200; Temp.Top := 100; Temp.Destroy;end;end.我知道如果一个窗体上有一个按钮, 那么按钮的Owner 就是 那个窗体, 但是对于这种Create 的Owner 确实抓不过弯了 self 可以换成nil和Application.在这种情况下最好不用nil因为这样不利于资源管理。self :是一个指针变量,相当于C++中的this,指向创建它的类,如你的例子中都指向TForm1,因为你就是在Tform1一中创建的,上面的TButton当然行是不对只能反过来,创建Button时指向Tform1。采用self时当form1关闭Temp的资源也会随之释放 owner是负责销毁你创建的类即若某类的owner被销毁了,则该类也被销毁不知我表达清楚了吗:) to yanyading (退休的Turbo Basic 编译器) 感觉你还是没有搞清楚Owner和Parent的区别很多类实例化时要求指定一个Owner,Owner是负责被创建的实例的自动创建和销毁的,特别是销毁(当Owner销毁时,它会要求所有“属于”它的对象销毁,最后销毁自己),一般来说可以用Application(表示整个应用程序),当前窗体(在你的例子里就是Self,等价于Form1),nil(这个时候你自己记得销毁它!!)Parent是负责显示组件的,类似于“容器”的概念,当一个Parent刷新时他会负责其上(或叫其内--视觉上的)的组件的相关动作,因此你直观上看到的A控件在B控件上,则B控件是A控件的Parent,但不一定是Owner!! 我觉得你的说有些不对self是一类指针变量,不是一个实例变量,parent是一个实例变量,两者的性质是不同的 问题解答:问题‘A’:如果这段写成 Temp := TForm.Create(Self); 那么出现的窗体是一个在左上角冒出来的,大概300X250大小的,为什么呢?,但是如果成为Temp := TForm1.Create(Self);那么出现的窗体是一个和Form1一模一样的窗体(显然这是一种继承)。首先,这不是一种继承!!!继承只能用于描述类和类之间的关系。这是一个实例化过程。你的TForm1是从TForm继承来的,也就是说你TForm是TForm1的父类,所有的父类指针是可以指向其子类的对象(请注意:对象是实例化的类)所以你的Temp := TForm1.Create(self)是可以编译通过的(这样就不行啦:Form1 := TForm.Create(self),因为子类的指针是不是能访问父类的对象的)这一过程的实现时这么一个过程:首先,TForm1.Create(..)实例化了一个TForm1的类对象,所以该实例化的对象和From1的形式是一模一样的。但是你将不能使用Temp来访问在TForm1中新增的方法和属性,因为在TForm类型的指针结构中不包含这些行增的东东。如:Temp:TFormTemp := TForm1.Create(nil)如果实现的 proceduer TForm1.NewFun是不可以使用:Temp.NewFun所以Temp := TForm.create(self)和Temp := TForm1.Create(self)是指用temp引用一实例化的类---对象。 问题‘B’:在括号里面的是应该输入 AOwner: TCompounts,我随便写了一个Self,如何理解这个AOwner呢?我的理解是...(事实上我还没有理解呢)...在Create(AOwner:TComponent)参数,如果你看过Vcl的实现,你会知道,在每次Create一个对象的时候,就会把该对象的self指针传给AOwner,这个指针将保持在AOwner的Controls指针数组当中,当AOwner指定的对象被释放时,他首先会释放Controls中所有对象,这就实现了内存自动管理。如果你在Create(nil),那么这个对象你将自己手工管理。Parent属性,该属性是用来指定该控件的父窗体,如TButton这样的类,他们是必须显示在某个窗体之上的,具体是哪一个窗体,就使用Parent属性来指定。但是你注意到:在你的Form这样的类对象是可以不指定Parent的。因为他不一定依靠其他的窗体来显示自己(不过对于MDI的机制我不了解)。所以AOwner只是一种内存管理策略。 在intraweb网页下载服务器文件时关闭了页面 通过调用DLL完成对表的查询并返回字符列表行不通吗?为什么出错? 如何在adotable中输入小数位超过4位的数值 高手来看看这个问题,如何取得句柄 高手进:使用Delphi如何控制Word实现这样的操作-->在文档中编辑内容,保存为图片~~ 动态数组问题 表中字段值相减问题! 深入研究过 SystrayIcon 的请进来看看┅┅(100分请教,问题解决,马上给分) 如何将一个个bmp转化成avi文件? dbgrid 请问大侠,怎样得到query得到的结果? 一种匪夷所思的情况应该如何解决?
to delphi0302(dr) :
该例中sender是Button1,self是form1,Tform1是类而不是对象
to delphi0302(dr) :
该例中sender是Button1,self是form1,Tform1是类而不是对象
如果从TForm类创建实例,是系统默认的窗体对象,因此不是你需要的,而利用TForm1(你自己创建的)创建实例,则属性都与TForm1一样;
B:
AOwner其实就是你创建的实例的对应类,Self是个隐含的指针,指向实例对应的类
你可以看一下Delphi的Oop思想!
var
Form1: TForm1;
Temp: TForm;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
Temp := TForm.Create(Button1); // 这段代码可以用, 但是那个按钮用不起
ShowMessage (Temp.Owner.Name); // 这个 owner 好像不起任何作用,看起来好像是某种多态性
Temp.Color := Form1.Color;
Temp.Left := 200;
Temp.Top := 100;
Temp.Destroy;
end;end.我知道如果一个窗体上有一个按钮, 那么按钮的Owner 就是 那个窗体, 但是对于这种Create 的Owner 确实抓不过弯了
self :是一个指针变量,相当于C++中的this,指向创建它的类,如你的例子中都指向TForm1,因为你就是在Tform1一中创建的,上面的TButton当然行是不对只能反过来,创建Button时指向Tform1。采用self时当form1关闭Temp的资源也会随之释放
即若某类的owner被销毁了,则该类也被销毁
不知我表达清楚了吗:)
很多类实例化时要求指定一个Owner,Owner是负责被创建的实例的自动创建和销毁的,特别是销毁(当Owner销毁时,它会要求所有“属于”它的对象销毁,最后销毁自己),一般来说可以用Application(表示整个应用程序),当前窗体(在你的例子里就是Self,等价于Form1),nil(这个时候你自己记得销毁它!!)
Parent是负责显示组件的,类似于“容器”的概念,当一个Parent刷新时他会负责其上(或叫其内--视觉上的)的组件的相关动作,因此你直观上看到的A控件在B控件上,则B控件是A控件的Parent,但不一定是Owner!!
问题‘A’:如果这段写成 Temp := TForm.Create(Self); 那么出现的窗体是一个在左上角冒出来的,大概300X250大小的,为什么呢?,但是如果成为Temp := TForm1.Create(Self);那么出现的窗体是一个和Form1一模一样的窗体(显然这是一种继承)。首先,这不是一种继承!!!继承只能用于描述类和类之间的关系。这是一个实例化过程。
你的TForm1是从TForm继承来的,也就是说你TForm是TForm1的父类,所有的父类指针是可以指向其子类的对象(请注意:对象是实例化的类)
所以你的Temp := TForm1.Create(self)是可以编译通过的(这样就不行啦:Form1 := TForm.Create(self),因为子类的指针是不是能访问父类的对象的)
这一过程的实现时这么一个过程:首先,TForm1.Create(..)实例化了一个TForm1的类对象,所以该实例化的对象和From1的形式是一模一样的。但是你将不能使用Temp来访问在TForm1中新增的方法和属性,因为在TForm类型的指针结构中不包含这些行增的东东。
如:Temp:TForm
Temp := TForm1.Create(nil)
如果实现的 proceduer TForm1.NewFun
是不可以使用:Temp.NewFun所以Temp := TForm.create(self)
和Temp := TForm1.Create(self)
是指用temp引用一实例化的类---对象。
Parent属性,该属性是用来指定该控件的父窗体,如TButton这样的类,他们是必须显示在某个窗体之上的,具体是哪一个窗体,就使用Parent属性来指定。
但是你注意到:在你的Form这样的类对象是可以不指定Parent的。因为他不一定依靠其他的窗体来显示自己(不过对于MDI的机制我不了解)。
所以AOwner只是一种内存管理策略。