解释一个包含case of 的record意思 ( 积分: 50 )

  • 主题发起人 主题发起人 wangzequn
  • 开始时间 开始时间
W

wangzequn

Unregistered / Unconfirmed
GUEST, unregistred user!
tagSTGMEDIUM = record
tymed: Longint;
case Integer of
0: (hBitmap: HBitmap; unkForRelease: Pointer{IUnknown});
1: (hMetaFilePict: THandle);
2: (hEnhMetaFile: THandle);
3: (hGlobal: HGlobal);
4: (lpszFileName: POleStr);
5: (stm: Pointer{IStream});
6: (stg: Pointer{IStorage});
end;
主要是case of 这部分英文的帮助看不懂
 
类似Delphi自己定义的变体记录:
TRect = packed record
case Integer of
0: (Left, Top, Right, Bottom: Longint);
1: (TopLeft, BottomRight: TPoint);
end;
此处case Integer of 的Integer仅仅是为满足pascal定义变体记录的条件--序数类型,你可以把它改成char或自己定义的枚举类型,当然0,1也要改成与之序数类型对应的常量‘a’、‘b’(char)或Mon、Thue(Dayenum枚举)。
因此,Integer以及1、2不扮演任何角色,它们仅为程序员提供方便。
变体记录的用途是:
1.创建一个记录类型,它有不同数据种类的字段,但不需要在单个记录实例中使用全部数据
2.将相同的数据视为不同的类型,尤其在编译器不允许类型转换的情况。
eg. R1: TRect;
P1, P2: TPoint;
那么,下面的两组语句执行后对R1改变的结果是相同的:
{第一组}
P1.X := 10;
P1.Y := 20;
P2.X := 30;
P2.Y := 40;
R1.TopLeft := P1;
R1.BottomRight := P2;
{第二组}
R1.Left := 10;
R1.Top := 20;
R1.Right := 30;
R1.Bottom := 40;
可以看出,这里充分利用了记录中的变体部分共享存储空间这一特性。
 
看看Delphi帮助中的Variant parts in records就知道了。
还可以参考 http://www.delphibbs.com/delphibbs/dispq.asp?lid=844226
 
简单的说就是类似C语言里的共体类型
 

------------------------------------------------------
http://www.waibaoinfo.com 外包信息网
 
接受答案了.
 
后退
顶部