如何得到Object的大小(重谢100分)(100分)

  • 主题发起人 主题发起人 回顾
  • 开始时间 开始时间

回顾

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟想做个Listbox,把items里的strings和Objects都保存起来,但不知Object具体会有多大,所以无从下手,望各位大虾指点一二。
 
使用sizeof(变量名 或 类型) 函数: 返回字节数

type

CustRec = record
Name: string[30];
Phone: string[14];
end;
var
P: ^CustRec;
begin
GetMem(P, SizeOf(CustRec));
Canvas.TextOut(10, 10, 'The size of the record is ' + IntToStr(SizeOf(CustRec)));
FreeMem (P, SizeOf(CustRec));
end;
 
我用过sizeof,它只能给出固定类型的大小,对于Object,
它返回的是Object指针的大小16,而不管这个Object里是否包含图片等。
 
为什么要知道多大呢?可以用Object自身的保存方法,不过这样的OBject必须
从TPersistent以下继承
 
我再我的TListBox里加了一个保存流的过程SaveStream,如下:
procedure TListBox.SaveStream(Stream: TStream);
var
i,Size,C: integer;
begin
C:=items.Count;
Stream.WriteBuffer(C, 4); //先保存items的个数
for i:=0 to C-1 do
begin
//保存节点名称
Size:=Length(items.Strings);
Stream.WriteBuffer(Size, 4);
Stream.WriteBuffer(Pointer(items.Strings)^,Size);
//保存节点对象

Size:= Sizeof(items.Objects); //问题在这儿,
//不知道Objects是何物,有多大,Objects本身又没提供保存方法
//如何从TPersistent以下继承????
//加50分,愿闻其祥,Please GoOn!
Stream.WriteBuffer(Size, 4);
Stream.WriteBuffer(Pointer(items.Objects)^,Size);

end;
end;
 
试一试这个
TObject.InstanceSize
 
TObject.InstanceSize不准吧?他只是Object自身的大小,如果Object包含一个
指针,指向一张图片,那么TObject.InstanceSize会包括图片长度么?
 
InstanceSizede的具体意义我没看明白,
但就返回值来看,始终是16,恐怕与我需要的有出入。
 
小蜜!是你吗?
竟敢改名换性,哈哈哈......
 
重赏之下,必有勇夫
追加100元
 
我费了好打的劲才把对象的存储结构搞清楚( 重赏之下,必有勇夫)
如下函数可取出对象的大小, 但是只是数据成员的大小,不包括vmt 和 方法
如果包含指针成员, 只是考虑指针自身的大小(4 );

function getobjsize(obj:Tobject):integer;
type
Pdword=^longword;
var
P1,p2:pdword ;
begin
p1:=pdword(obj);//对象地址
P2:=pdword(P1^);//vmt 地址
dec(p2,10 );// instance size 域
result:=p2^;
end;
 
真弱, Tobject.instancesize 跟她是一样的
白费力气了,...

不过, 你为何要这么做?, 想象别的方法, 换一个思路
说不定会柳暗花明.
 
成败亦英雄!
谢谢。
 
有一个比较麻烦的解决办法:
建立一个过程属性OnSaveObject,
由用户自己填写保存对象的方法,
最后在保存流的方法SaveStream中调用OnSaveObject,
统一保存。

hihi,不太专业。
 
本来嘛,在一个对象中加一个指针类型的成员,对对象本身来说
只是增加一个指针空间的大小(4 bytes)。

可以自己做一个该对象的GetAllSize方法,计算对象所包含的内容
的字节数。
 
你们真是...明明Delphi已经提供了保存方法了

from Delphi Help
TPersistent is the ancestor for all objects that have assignment and
streaming capabilities

所以从TPersistent继承的可以用Stream保存.不过比较方便保存的是从
TComponent继承的对象,因为Stream有WriteComponent和ReadComponent,根本
不用取Size,当然一定要取也很简单
 
太深奥了,不明白。
从TPersistent继承怎模用?
是TPersistent(items.Objects).SaveToStream(Stream);????????
还是Stream.WriteComponent(TComponent(items.Objects));??????

谢谢各位!不吝赐教
 
>还是Stream.WriteComponent(TComponent(items.Objects));??????
可以这样啊,前提是items.Objects必须是TComponent或者从他继承,比如
TControl...
 
很抱歉,关键是我不知道这个Object是啥,
更不知道是不是从TComponent继承来得。
另外问一下,用Stream.WriteComponent一个Object一个Object的写完后,
如何用Stream.ReadComponent一个Object一个Object的读出来,
好象ReadComponent从当前位置一直读到流尾。
谢谢!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部