关于 delphi 里的变体记录

来源:互联网 发布:画图软件怎么打字 编辑:程序博客网 时间:2024/05/21 07:53
请问:变体记录的常量如何表示??? [153字节 WinSock_Star 2003-8-1 14:15:59 回复:6/29 版块:Delphi IDE及GUI]
您好:
    一个变体记录类型,例如:
TRec = record
  s: string[10];
  case integer of
    0: (R: Real);
    1: (T: string[2]);
end;
想声明一个TRec类型的常量,用哪一个变体都行,怎么写呢?
签名: 咱们一起用DELPHI建立ASP.NET网站吧!

李维语录

 不会用“设计模式”(design patterns)的程序员是低层次的软件人才,他们只会写code罢了。

 SUN和微软都在搞垄断。一个垄断了选择语言的权利,另一个垄断了选择操作系统的权利。

 程序员应该正确认识自己的发展方向,而不要把注意力集中于某种语言或讨论工具时优劣之上。

 程序语言固然重要,但程序员不能围着它们打转,他们必须摆脱对语言的依赖。
 很多人顶着C++光环,我觉得他顶的光环越大他的束缚也就越大,因为他没有跳出语言环境。

 程序员必须牢牢掌握中间件技术。要做到能够用它,还必须精通,能把它用在任何软件或项目的开发之中。          1 请看变体的TRect的常量声明. [118字节 aizb 2003-8-1 21:17:9 回复:0/18 版块:Delphi IDE及GUI]
Const
  R:TRect=(Left:10;Top:10;Right:100;Bottom:100);
  R1:TRect=(TopLeft:(x:10;y:10);BottomRight:(x:100;y:100));
  签名: 感谢mxhuangjing、winsock_star、中国菠萝、兔子、lzm、欢迎指较和所有支持、帮助和关心aidelphi的朋友.
邮件联系          2 您能不能用我提出的那个例子声明一下? 谢谢 [0字节 WinSock_Star 2003-8-2 8:33:20 回复:0/15 版块:Delphi IDE及GUI]
<空>
  签名: 咱们一起用DELPHI建立ASP.NET网站吧!

李维语录

 不会用“设计模式”(design patterns)的程序员是低层次的软件人才,他们只会写code罢了。

 SUN和微软都在搞垄断。一个垄断了选择语言的权利,另一个垄断了选择操作系统的权利。

 程序员应该正确认识自己的发展方向,而不要把注意力集中于某种语言或讨论工具时优劣之上。

 程序语言固然重要,但程序员不能围着它们打转,他们必须摆脱对语言的依赖。
 很多人顶着C++光环,我觉得他顶的光环越大他的束缚也就越大,因为他没有跳出语言环境。

 程序员必须牢牢掌握中间件技术。要做到能够用它,还必须精通,能把它用在任何软件或项目的开发之中。          3 晕: [246字节 aizb 2003-8-2 11:15:9 回复:0/26 版块:Delphi IDE及GUI]
Type
TRec = record
  s: string[10];
  case integer of
    0: (R: Real);
    1: (T: string[2]);
end;

procedure TForm1.Button1Click(Sender: TObject);
const R:TRec=(s:'ssss';R:1.23);
//或者
const R1:TRec=(s:'ssss';T:'50');
begin

end;
  签名: 感谢mxhuangjing、winsock_star、中国菠萝、兔子、lzm、欢迎指较和所有支持、帮助和关心aidelphi的朋友.
邮件联系 ★       4 <精华> 你应该把Delphi中的变体记录中的变体部份字段看作是只可取其一,在先取其一之后它就变成了非变体记录了. [218字节 aizb 2003-8-2 11:18:10 回复:0/36 版块:Delphi IDE及GUI]
Type
TRec = record
  s: string[10];
  case integer of
    0: (R: Real);
    1: (T: string[2]);
end;
你可以把它看成:
TRec=Record
  S:String[10];
  R:Real;
end;
或者
TRec=Record
  s:String[10];
  T:String[2];
end;
  签名: 感谢mxhuangjing、winsock_star、中国菠萝、兔子、lzm、欢迎指较和所有支持、帮助和关心aidelphi的朋友.
邮件联系          5 请进: [915字节 aizb 2003-8-2 11:34:18 回复:0/26 版块:Delphi IDE及GUI]
看下面这副图片

从图上可见,如果往一个变体记录的R字段中填入值,你也可以访问T字段,尽管它没有被赋值,但事实上它已经有值了,因为它和R:Real的存放位置的相同的,但是这事访问T字段得到的值并不一定是可见字符,因为Real在内存中不是以数字类型的字符串存入的,而是以二进制数据存放的.

事实上Delphi中内存的几乎所有的变体记录都有一个特点(尽管这不是要求的),就是所有变体部份长度部和都是一样的,比如:

  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: Longint;
        LParam: Longint;
        Result: Longint);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;

WParam,LParam,Result三个字段的长度和是12个字节,而WParamLo,WParamHi,LParamLo,LParamHi,ResultLo,ResultHi六个字段之和也是12个字符,同时仔细观察,会发现后面六个字段中的每两个字段与前面三个字段中的每一个字段都是对应的.

再看看
  TRect = packed record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TPoint);
  end;
是不是也是一样的呢?

  签名: 感谢mxhuangjing、winsock_star、中国菠萝、兔子、lzm、欢迎指较和所有支持、帮助和关心aidelphi的朋友.
邮件联系          6 是是是,让您多费心了,我早就说过我悟性不高。多包含吧。 [0字节 WinSock_Star 2003-8-2 15:18:8 回复:0/24 版块:Delphi IDE及GUI]
<空>
原创粉丝点击