关于TObject = class相关问题 ( 积分: 100 )

  • 主题发起人 主题发起人 HongYuan
  • 开始时间 开始时间
H

HongYuan

Unregistered / Unconfirmed
GUEST, unregistred user!
1。TObject = class中class代表什么?
2。TPressBookInfo=class
FBookType:integer;
FTypeName:string;
FPressID:integer;
end;这是我自已定义的。
sql:='select * from Sys_BookType ';
try
TempQuery := TADOQuery.Create(nil);
TempQuery.LockType := ltReadOnly;
OpenDataSet(TempQuery, sql);
while not TempQuery.Eof do
begin
PressInfo:=TPressBookInfo.Create;
PressInfo.FBookType:=TempQuery.FieldByName('BookTypeID').AsInteger;
PressInfo.FTypeName:=TempQuery.FieldByName('TypeName').AsString;
PressInfo.FBookName:='';
PressInfo.FBookID:=0;
PressInfo.FPressID:=0;
TreeNode:=bsSkinTreeView1.Items.AddChildObject(ParentNode,PressInfo.FTypeName,PressInfo);

TreeNode.ImageIndex:=3;
TreeNode.SelectedIndex:=3;

bsSkinTreeView1.Items.AddChild(TreeNode,'无');
TempQuery.Next;
end;
TempQuery.Close;
ParentNode.Expand(False);
finally
PressInfo:=nil;
FreeAndNil(TempQuery);
end;
多次 PressInfo:=TPressBookInfo.Create;不出错,不同于类?为何?
 
1。TObject = class中class代表什么?
2。TPressBookInfo=class
FBookType:integer;
FTypeName:string;
FPressID:integer;
end;这是我自已定义的。
sql:='select * from Sys_BookType ';
try
TempQuery := TADOQuery.Create(nil);
TempQuery.LockType := ltReadOnly;
OpenDataSet(TempQuery, sql);
while not TempQuery.Eof do
begin
PressInfo:=TPressBookInfo.Create;
PressInfo.FBookType:=TempQuery.FieldByName('BookTypeID').AsInteger;
PressInfo.FTypeName:=TempQuery.FieldByName('TypeName').AsString;
PressInfo.FBookName:='';
PressInfo.FBookID:=0;
PressInfo.FPressID:=0;
TreeNode:=bsSkinTreeView1.Items.AddChildObject(ParentNode,PressInfo.FTypeName,PressInfo);

TreeNode.ImageIndex:=3;
TreeNode.SelectedIndex:=3;

bsSkinTreeView1.Items.AddChild(TreeNode,'无');
TempQuery.Next;
end;
TempQuery.Close;
ParentNode.Expand(False);
finally
PressInfo:=nil;
FreeAndNil(TempQuery);
end;
多次 PressInfo:=TPressBookInfo.Create;不出错,不同于类?为何?
 
可以定义一个TPressBookInfo的数组.
 
你这种做法应该用Record
 
1、class是类声明的关键字,而TObject是delphi当中所有类的缺省父类;
2、delphi中对象实际上是个指针,
PressInfo:=TPressBookInfo.Create;
类似于c++中的这种写法
TPressBookInfo *PressInfo;
PressInfo=new TPressBookInfo;
指针当然可以赋给多次创建的多个对象;delphi中类的构造函数必须显式调用,而不是自动创建对象的。
 
TSomeObject = class中的class代表类的声明。
在这里class中其实缺省了类声明后的具体父类,完整的写法应该是:
TSomeObject = class(TObject)
private
...
public
...
published
...
end;
因为TObject是所有类的基础类,所以在这里可以省略不写。
但是我不同意楼上两位大侠的看法。我觉得还是应当用类来声明是比较稳妥的,原因是用类和对象可以很好的对数据和对数据的操作进行封装。是的,从目前的应用来看,用数组或是记录均可以完成功能。但是从软件需求和日后维护来看,还是用对象比较好,因为日后一旦用户对需求发生变化需要修改程序的时候(比如说,要对记录或数组中的数据封装操作而且该记录或数组又在程序中具有较广泛的应用,那时将是对整个程序进行灾难性的霰弹式的搜索和修改!)就不必对原先因改变而手忙脚乱了。
 
同意lczhuohuo
怎么可能会出错嘛?!呵呵
最多memory leak
 
PressInfo得到的是类Record的值,但是从树的DATA又能取出单个值,感觉还是会存在内存释放问题.
for i:=0 to bsSkinTreeView1.Items.Count-1 do
begin
TPressBookInfo(bsSkinTreeView1.Items.data).free
end;
是否必需做此操作才能不出现memory leak
 
不使用Record而使用类的原因是:
使用类TPressBookInfo,做为TTreeView.Data值可以在派生类中重载,在所需数据变化时不必修改基类.而使用Record就不能做到,并且如果存在内部计算也只有类才行实现.不知是否正确,请指正....
 
你应该可以看到你的程序随着循环内存占用在不断地上升吧,可以用计时器做试验,这就跟
在Form1里不断地执行
Form1 := TForm1.Create(nil);
一样,不会出错,但内存
既然定义成class,没有自释放模块,就应当手工释放。
我是这么认为的。。。
 
内存会增加, HongYuan的说的也是对的!
 
谢谢各位
 
后退
顶部