willrain:
>>我个人认为,还是这样写比较好aStream.Write(Buf, Length(Buf));
我上面说的其他都正确,而这句话暂且不能认为是对的,以后我研究出来,再告诉你!
总觉得这40分拿的有点惭愧!刚才又仔细看了一下beta大侠的话,现将初步的结论告诉你,
下面的写法才是最正确的!!你一定要记住!!
procedure MyPro(var Type_1; const Type_2);
对于var或const的无类型参数,如果Type_1或Type_2是指针类型、字符串类型、数组类型...
MyPro(Type_1^, Type_2[1]);
就是传递整个参数的第一个元素的值。
在函数处理时先取地址
MyPro(var Type_1; const Type_2);
var
a, b: PChar;
begin
a := PChar(@Type_1); //先取地址,再转换类型(由于是无类型嘛)
b := PChar(@Type_2);
end;
所以下面的写法都是正确的。而且[法一]和[法二]是可以通用的。
procedure TForm1.Button2Click(Sender: TObject);
var
ms: TMemoryStream;
str_1, str_2: string;
i, str_1_Len, str_2_Len: Integer;
b: Boolean;
begin
str_1 := 'wo shi xiaobenben';
i := 9;
str_2 := '小笨苯';
b := false;
str_1_Len := Length(str_1);
str_2_Len := Length(str_2);
ms := TMemoryStream.Create;
{ 向流中写入数据 }
ms.Write(str_1_Len, sizeof(Integer)); //写入str_1的长度
ms.Write(Pointer(str_1)^, str_1_Len); //写入str_1的内容 [法一]
ms.Write(i, sizeof(i)); //写入i
ms.Write(str_2_Len, sizeof(Integer)); //写入str_2的长度
ms.Write(str_2[1], str_2_Len); //写入str_2的内容 [法二]
ms.Write(b, sizeof(b)); //写入b
{ 先将一些变量清零,这些都是多余的步骤,为的是验证读出的数据是否正确 }
str_1 := '';
i := 0;
str_2 := '';
b := true;
str_1_Len := 0;
{ 从流中读出数据 }
ms.Position := 0;
ms.Read(str_1_Len, sizeof(Integer)); //读出str_1的长度
SetLength(str_1, str_1_Len); //设置str_1长度
ms.Read(Pointer(str_1)^, str_1_Len); //读出str_1的内容
ms.Read(i, sizeof(Integer)); //读出i
ms.Read(str_1_Len, sizeof(Integer)); //读出str_2的长度
SetLength(str_2, str_1_Len); //设置str_2长度
ms.Read(str_2[1], str_1_Len); //读出str_2的内容
ms.Read(b, sizeof(Boolean)); //读出b
ms.Free;
{ 将数据显示 }
Caption := str_1 + ' - ' + IntToStr(i) + ' - ' + str_2;
if b then
Caption := Caption + ' - true'
else
Caption := Caption + ' - false';
end;