这些日子太忙了,今天把剩下的部分贴完,希望对大家有用。看过前一篇的都知道此文的作者和出处,我就不详细说了。
{ No. 16 }
//对于记录类型Record的分析。
实例:
type
TBaseRec = record
rStr: Integer;
rStr2: String;
rStr3: String;
end;
TStrRec = record
rStr: Integer;
rStr2: String;
rStr3: String;
rStr4: String;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
vRec1: TStrRec;
vBaseRec: TBaseRec;
begin
vRec1.rStr := 1;
vRec1.rStr2 := '123123';
vRec1.rStr3 := '1';
vRec1.rStr4 := '1';
vBaseRec := TBaseRec(Pointer(@vRec1)^);
ShowMessage(IntToStr(vBaseRec.rStr) + '_' + vBaseRec.rStr2 + '_' + vBaseRec.rStr3);
//
end;
{说明:
1、记录类型互相转换时,必须保证基础Record类型,数据大小Sizeof应小于或等于扩展类型。保证转换后的记录类型对象的数据访问合法正确。
2、在Delphi中,使用记录类型互相转换最为平凡的就是在消息Record的实现上了。在Delphi中定义了若干于TMessage可同时描述消息接受信息的Record,如:
TWMKey = packed record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;
当需要接受KeyDown和KeyUp的消息时,我们即可以使用TMessage也可以使用TWMKey作为消息接收的参数类型。因为Delphi为我们提供了若干便利的消息类型,所以我们在使用消息处理问世时就不会象VC中那样繁琐和易错了。
3、记录类型的使用还提供了一个不同语言间数据信息封装访问的途径。在不同语言间使用记录类型和记录类型指针时,应注意内部定义的变量的类型匹配问题。
记录类型的本质测试研究:
更改上面例子的实现部分,测试:
procedure TForm1.Button3Click(Sender: TObject);
var
vRec1: TStrRec;
rStr: Integer;
rStr2: String;
rStr3: String;
vpt: Integer;
begin
vRec1.rStr := 1;
vRec1.rStr2 := '123123';
vRec1.rStr3 := '1';
vRec1.rStr4 := '1';
vpt := Integer(@vRec1);
rStr := Integer(Pointer(vpt)^);
vPt := vPt + Sizeof(rStr);
rStr2 := String(Pointer(vpt)^);
vPt := vPt +