初学DELPHI,几个简单问题请教 还有派生类析构的时候基类的DESTRUCTOR是不是会被自动调用?调用的是哪一个?类似的CONSTRUCTOR是怎么调用的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、应该是指向同一对象,如果要复制,使用Assign方法2、使用TMyClass.Destory,如果TMyClass没有实现Destory,则上朔父类,直到TObject,则一定会实现,在Delphi中TObject是所有类的父类。3、Application释放罢?4、不清楚5、是,相反的次序6、Parent和Owner是两种概念 Label[i] := TLable.Create(Form1); 只是指定了OwnerSender,Self,Owner,parent -----------------------------------------------------Sender--意义:指本对象。Sender在什么对象相关代码里,那么Sender就是什么。Self--意义:指本类,也就是Self被引用的类。比如若在类TMyClass内引用了Self,那么Self=TMyClass.Owner--意义:哪个对象释放我的内存啊?如:Pan:=TPanel.Create(Self);其中Create的参数是:AOwner:TComponent。Owner释放Pan的内存。因为窗口释放Pan的内存,但窗口类的对象是Self.一般给Owner传Self就可以。比如:代码段一:pan:=TPanel.Create(Self);with Pan do begintryLeft:=20;Top:=20;parent:=Self; //Parent:=Form1也可以。Visible:=true;ShowMessage('Created');finallyPan.free;end;end;-----------------------------------------------------Parent--意义:此对象包括在哪个对象里那?说明:若组件不是从TControl继承来的,那么在创建组件后不必声明此属性。 1: A和B指向同一对象2: 用TMyClass的3: 异常由delphi自己管理,不用释放,delphi会自动从里到外处理所有的异常5: 不是!而是按创建的次序 Application.CreateForm(TForm1, Form1);退出时基本按后建先释放的原则Parent是指明这个控件放在哪个控件的里面比如一个Button的Parent为一Panel则Buton只能在Panel里活动,不能移出Panel而Owner是指对象由谁创建的!Form1定会释放Label,只是你可能没有真正释放Form1 1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。2、用Destroy。3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————MaximStr := '宠辱不惊,看庭前花开花落,去留无意; 毁誉由人,望天上云卷云舒,聚散任风。';if Not Assigned(I) then I := TI.Create(Nil);I.Maxim := MaximStr;I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';I.Desire := '加不加分随你';————————————————————————————————— 1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。2、用Destroy。3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————MaximStr := '宠辱不惊,看庭前花开花落,去留无意; 毁誉由人,望天上云卷云舒,聚散任风。';if Not Assigned(I) then I := TI.Create(Nil);I.Maxim := MaximStr;I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';I.Desire := '加不加分随你';————————————————————————————————— 是自动调用如果你加了inherite的话在DESTRUCTOR中先....先处理自己再调用父类的DESTRUCTOR在CONSTRUCTOR中先调用父类的CONSTRUCTOR再初始化自己 1、同一个,两个都可以使用,相当于指针。如果用Assign(或者AssignTo),则是两个。2、用Destroy。3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。4、一个是实例模式,一个是线程类型5、我认为都是按照dpr定义的次序来。6、Parent用于控件布局。它的Left等等都是相对于Parent的。Owner是负责内存管理的。—————————————————————————————————MaximStr := '宠辱不惊,看庭前花开花落,去留无意; 毁誉由人,望天上云卷云舒,聚散任风。';if Not Assigned(I) then I := TI.Create(Nil);I.Maxim := MaximStr;I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';I.Desire := '加不加分随你';————————————————————————————————— 1: 同一对象2: 可以自己释放TMyClass.free;3: 异常自动的,你不用管4:5: 按创建的次序,form1再form2... 6:Parent是指明父级(上级):label属于panel属于form(在form上放panel,在panel上放label) 关于DESTRUCTOR和CONSTRUCTOR我是问如果自动调用会调用基类里的哪个CONSTRUCTOR,参数是怎么传的?比如Base = class constructor A(s:string); constructor A(i:integer); constructor A(b:boolean); constructor A(s:short); constructor B;end;被自动调用的会是哪个? 1:对象、接口都是引用,Record不是。B和A结果成了一个对象,原来的B就丢了,直到进程结束才会释放它的内存。2: B.Destroy;//调用TMyClass的。 B.Free;//如果TMyClass的Destroy声明成override,调用它的,否则调用TApplication的。3:异常被截获到后就自动释放。4: Instancing: Single Instance:一个对象起动一个进程,对进程外组件(EXE)有效。 Multiple Instance:所有对象用一个进程,对进程外组件有效。 Internal:不允许其它程序直接创建它。 Threading Model: Single:所有对象在一个线程内运行。最安全,效率最低。 Apartment:每个对象在一个线程内运行。成员变量安全。最常用。 Free:对象在调用线程内运行。效率最高,不安全适用于无状态对象。 Both:对象可以是Apartment或Free,由创建都决定。 进程外组件只能是Apartment或Free,并且一个程序中的所有对象都相同。只要你编写对象时有一个是Free或Both类型的,就都是Free模式。5:初始化按顺序,退出时相反。6:TComponent.Create(AOwner:TComponent)中的AOwner表明在AOwner被释放时,该对象会被自动释放。TControl.Parent属性是指它的父控件(容器控件)。如在Form上放一个Panel,在Panel上放一个Edit,则Panel的Owner和Parent都是Form,Edit的Owner是Form,而Parent是Panel. Base = class constructor A(s:string);0A constructor A(i:integer); constructor A(b:boolean); constructor A(s:short);0A constructor B;end;上面表示多态函数,根据调用参数的类型自动选择。—————————————————————————————————MaximStr := '宠辱不惊,看庭前花开花落,去留无意; 毁誉由人,望天上云卷云舒,聚散任风。';if Not Assigned(I) then I := TI.Create(Nil);I.Maxim := MaximStr;I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';I.Desire := '加不加分随你';————————————————————————————————— Constructor可以有多个,名字或参数不同,根据你创建时使用哪个而决定调用哪个。如果你的基类有多个constructor,调用哪个是由子类的constroctor决定的:TA=class public constructor Create; constructor CreateMe(a,b:Integer); end;TB = class(TA) public constructor Create; end;constructor TB.Create;begin inherited;调用TA.Create; 或inherited Create;调用TA.Create; 或inherited CreateMe(1,2);调用TA.CreateMe; 或不写inherited;不调用TA的constroctorend;destructor一定要起名为Destroy,并且是override的,这样才会被TObject.Free调用。在destructor的代码中一定要写inherited,否则可能会导致内存泄露,甚至出现内存访问错。 我本来以为我还明白一点东西,经几位大哥一指点我更糊涂了debussy(debussy) :SELF到底是什么?Self--意义:指本类那就是说通过SELF只能调用STATIC过程了?pan:=TPanel.Create(Self);给CREATE的是什么?是对类的引用,还是一个对象(别告诉我是元类的对象)在OBJECT PASCAL里怎么用对类的引用,变量怎么声明?zhangpeigao(东部一绝):2: 可以自己释放TMyClass.free;这是什么意思?把一个类给free了?综合上面两位的意思,是不是说在OBJECT PASCAL里和SMALLTALK一样类是元类的对象?这样DELPHI也忒猛了,好象现在实用的语言里只有OBJECT PASCAL能做到这么高的抽象对于异常对象,怎么有人说要释放,有人说不释放如果是系统释放,那么什么时候释放? 比如对于MyObject :TMyClass;procedure MyObject.XXXXX();begin Self.YYY;//就是调用TMyClass.YYY方法,Self就是自己嘛,要看当前作用范围,上句等同于 MyObject.YYY.end;你在看这句pan:=TPanel.Create(Self);通常这句所处的作用域例如为procedure TForm1.Button1Click(Sender);begin...pan:=TPanel.Create(Self);...end;这里的Self就表示TForm1啦,这句话的意思是pan的Owner是TForm1不是TPanel.类不能释放,只有对象可以释放,上面的可能是笔误 初学Delphi看那本书好? 请教一个程序 下列语句如何理解? TC2.0AGV模式下16种标准颜色在Delphi中对应的TColor值是多少,谢谢! 如何调整在不同屏幕大小下保持窗体中的控件显示比例合适 clentdata中的afterscroll时间是什么时候触发的? 请问谁知道 停靠窗体的详细设置,静态或动态 能否在panel上动态添加label,如何实现。感谢! 给高手的挑战 第一次从网上下载控件,但却不会用,呜呜..... 哪有支持flash6.0或5.0的控件下载?(我不需要delphi提供的active 控件) 高分求object pascal 电子书!
2、使用TMyClass.Destory,如果TMyClass没有实现Destory,则上朔父类,直到TObject,则一定会实现,在Delphi中TObject是所有类的父类。
3、Application释放罢?
4、不清楚
5、是,相反的次序
6、Parent和Owner是两种概念
Label[i] := TLable.Create(Form1); 只是指定了OwnerSender,Self,Owner,parent
-----------------------------------------------------
Sender--意义:指本对象。Sender在什么对象相关代码里,那么Sender就是什么。
Self--意义:指本类,也就是Self被引用的类。比如若在类TMyClass内引用了Self,那么Self=TMyClass.
Owner--意义:哪个对象释放我的内存啊?如:Pan:=TPanel.Create(Self);其中Create的参数是:AOwner:TComponent。Owner释放Pan的内存。因为窗口释放Pan的内存,但窗口类的对象是Self.一般给Owner传Self就可以。
比如:
代码段一:
pan:=TPanel.Create(Self);
with Pan do begin
try
Left:=20;
Top:=20;
parent:=Self; //Parent:=Form1也可以。
Visible:=true;
ShowMessage('Created');
finally
Pan.free;
end;
end;
-----------------------------------------------------
Parent--
意义:此对象包括在哪个对象里那?
说明:若组件不是从TControl继承来的,那么在创建组件后不必声明此属性。
2: 用TMyClass的
3: 异常由delphi自己管理,不用释放,delphi会自动从里到外
处理所有的异常
5: 不是!而是按创建的次序
Application.CreateForm(TForm1, Form1);
退出时基本按后建先释放的原则
Parent是指明这个控件放在哪个控件的里面
比如一个Button的Parent为一Panel
则Buton只能在Panel里活动,不能移出Panel
而Owner是指对象由谁创建的!
Form1定会释放Label,只是你可能没有真正释放Form1
2、用Destroy。
3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————
2、用Destroy。
3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
6、Parent用于控件布局。它的Left等等都是相对于Parent的。—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————
如果你加了inherite的话
在
DESTRUCTOR中
先
....先处理自己
再调用父类的DESTRUCTOR在CONSTRUCTOR中
先调用
父类的CONSTRUCTOR
再初始化自己
2、用Destroy。
3、对象实例又Create(AOwner)中的AOwner释放,没有AOwner时以及动态创建临时使用的,应该自己写代码释放(通用的是FreeAndNil)。
4、一个是实例模式,一个是线程类型
5、我认为都是按照dpr定义的次序来。
6、Parent用于控件布局。它的Left等等都是相对于Parent的。Owner是负责内存管理的。—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————
2: 可以自己释放TMyClass.free;
3: 异常自动的,你不用管
4:
5: 按创建的次序,form1再form2...
6:Parent是指明父级(上级):label属于panel属于form
(在form上放panel,在panel上放label)
会调用基类里的哪个CONSTRUCTOR,参数是怎么传的?比如Base = class
constructor A(s:string);
constructor A(i:integer);
constructor A(b:boolean);
constructor A(s:short);
constructor B;
end;被自动调用的会是哪个?
2:
B.Destroy;//调用TMyClass的。
B.Free;//如果TMyClass的Destroy声明成override,调用它的,否则调用TApplication的。
3:异常被截获到后就自动释放。
4:
Instancing:
Single Instance:一个对象起动一个进程,对进程外组件(EXE)有效。
Multiple Instance:所有对象用一个进程,对进程外组件有效。
Internal:不允许其它程序直接创建它。
Threading Model:
Single:所有对象在一个线程内运行。最安全,效率最低。
Apartment:每个对象在一个线程内运行。成员变量安全。最常用。
Free:对象在调用线程内运行。效率最高,不安全适用于无状态对象。
Both:对象可以是Apartment或Free,由创建都决定。
进程外组件只能是Apartment或Free,并且一个程序中的所有对象都相同。只要你编写对象时有一个是Free或Both类型的,就都是Free模式。
5:初始化按顺序,退出时相反。
6:TComponent.Create(AOwner:TComponent)中的AOwner表明在AOwner被释放时,该对象会被自动释放。TControl.Parent属性是指它的父控件(容器控件)。
如在Form上放一个Panel,在Panel上放一个Edit,则Panel的Owner和Parent都是Form,Edit的Owner是Form,而Parent是Panel.
constructor A(s:string);
0A constructor A(i:integer);
constructor A(b:boolean);
constructor A(s:short);
0A constructor B;
end;
上面表示多态函数,根据调用参数的类型自动选择。—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————
如果你的基类有多个constructor,调用哪个是由子类的constroctor决定的:
TA=class
public
constructor Create;
constructor CreateMe(a,b:Integer);
end;
TB = class(TA)
public
constructor Create;
end;constructor TB.Create;
begin
inherited;调用TA.Create;
或inherited Create;调用TA.Create;
或inherited CreateMe(1,2);调用TA.CreateMe;
或不写inherited;不调用TA的constroctor
end;
destructor一定要起名为Destroy,并且是override的,这样才会被TObject.Free调用。在destructor的代码中一定要写inherited,否则可能会导致内存泄露,甚至出现内存访问错。
SELF到底是什么?
Self--意义:指本类
那就是说通过SELF只能调用STATIC过程了?
pan:=TPanel.Create(Self);
给CREATE的是什么?是对类的引用,还是一个对象(别告诉我是元类的对象)
在OBJECT PASCAL里怎么用对类的引用,变量怎么声明?zhangpeigao(东部一绝):
2: 可以自己释放TMyClass.free;
这是什么意思?把一个类给free了?综合上面两位的意思,是不是说在OBJECT PASCAL里和SMALLTALK一样
类是元类的对象?这样DELPHI也忒猛了,好象现在实用的语言里只有
OBJECT PASCAL能做到这么高的抽象对于异常对象,怎么有人说要释放,有人说不释放
如果是系统释放,那么什么时候释放?
MyObject :TMyClass;procedure MyObject.XXXXX();
begin Self.YYY;//就是调用TMyClass.YYY方法,Self就是自己嘛,要看当前作用范围,上句等同于 MyObject.YYY.end;你在看这句
pan:=TPanel.Create(Self);
通常这句所处的作用域例如为
procedure TForm1.Button1Click(Sender);
begin
...
pan:=TPanel.Create(Self);
...
end;
这里的Self就表示TForm1啦,这句话的意思是pan的Owner是TForm1不是TPanel.类不能释放,只有对象可以释放,上面的可能是笔误