关于类的使用问题,请帮忙,谢谢!!!(100分)

  • 主题发起人 主题发起人 阿曼
  • 开始时间 开始时间

阿曼

Unregistered / Unconfirmed
GUEST, unregistred user!
我在第一个文件中定义了一个类(tb),tb中还有一个类 ta;
接着我在第二个文件中的form1中定义了b:tb。
我在使用b.a.a2时,第一次使用时的值不变,但是第二次使用就变了,变成:“0##0#....”
而且b.a.a3的值也没了,但是b.a.a1却没有变,这是为什么?

一个文件中:
unit UserInf;

interface

uses
SysUtils, Classes, Controls, StdCtrls;

Type Ta = Class
a1:string;
a2:string;
a3:TStringList;
.....
end;

Type Tb = Class
a:Ta;//会议简要;
procedure Init();
end;
implementation

procedure Tb.Init;
begin
if not assigned(a) then a.Create;
a.a1:='111';
a.a2:='111';
end;

end.

第二个文件中:
TForm1 = class(TForm)
...
b:Tb;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
....
b:=Tb.Create;
b.a:=Ta.Create;

b.Init;
.....
end;
....
 
估计是你的对象结构问题,不符合通常做法
把b.a的初始化放到b.create里,销毁同理
 
.............

procedure Tb.Init;
begin
if not assigned(a) then
a := Ta.Create;
a.a1:='111';
a.a2:='111';
end;

.........
 
huizhang?是你吗?什么时候冒出来了?
 
由于你没有贴全类的实现,所以只能猜。
1.是不是没有在ta.create中create a3? (a3:=tstringlist.create)
2.b:=Tb.Create;
b.a:=Ta.Create
//这句好象不太必要。

 
对象结构有问题
 
huizhang的看法正确。

not assigned(a)何来的a.create ?
应该改成a := TA.create;
任何变量的使用都需要注意初始化问题。这种类里面还有对象的情况,一般在
Tb的构造函数里面创建它包含的对象。比如此例最好是重载构造函数,在构造函数
里面初始化a。如下:(当然不要忘了释放)
Tb = class
...
a:Ta;
constructor Create
override;
destructor Destroy
override
end

constructor tb.Create;
begin
inherited;
a := Ta.Create;
end;

destructor tb.destroy;
begin
a.Free;
inherited;
end;
 
如果b.a不只用了一次,那么一定要记住每一个b.a都要create,否则在下次使用时,
b.a又会指向另一个值,原来的值会丢失。
 
后退
顶部