怎样将一个WideString的内容写到一个Stream中?(80分)

  • 主题发起人 主题发起人 hhb1981
  • 开始时间 开始时间
H

hhb1981

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样将一个WideString的内容写到一个Stream中?
又怎样把此Stream中的内容还原到另一个WideString中?

大侠们看看下边的代码有什么错误,每次调试到最后一行的时候,CPU寄存器监视窗口就跳了出来,好像出了什么错误;按住F9跑到底,窗口中的Edit1内容却能正常显示出来,Delphi5的IDE环境也没报什么错误。但当程序不在Debug模式下跑的时候(直接双击生成的Exe文件),程序窗口会一下子消失,奇怪~

procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
inData: WideString;
outData: WideString;
begin
inData := WideString('123123');

Stream := TMemoryStream.Create;
Stream.Write(inData, Length(inData) * 2);
Stream.Seek(0, soFromBeginning);

Stream.Read(outData, Length(inData) * 2);
Stream.Free;

Edit1.Text := outData;
end;
 
Length(inData) * 2 ?
 
1:把 Stream.Write(inData, Length(inData) * 2);
Stream.Read(outData, Length(inData) * 2);改成
Stream.Write(inData, Length(inData) );
Stream.Read(outData, Length(inData) );
2:把inData outData 数据类型改为string
调试通过
 
到底是什么原因呢?类型不兼容?
 
to easykoala, liangyabinqiuzhi:
该project需要国际化支持,所有的字符串都必须为WideString,不然我也没有必要费事转这么大的弯子了。
Length(XXX) * 2是因为WideString中的每个字符都占用2 Bytes的空间(Unicode),而在Stream对象中,可操作的数据类型只能为Byte。
 
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TMemoryStream;
inData: WideString;
outData: WideString;
begin
inData := ('123你好123');
outData := '';
Stream := TMemoryStream.Create;
try
Stream.SetSize(Length(inData));
Stream.WriteBuffer(inData, Stream.Size);
Stream.Position := 0;

Stream.ReadBuffer(outData, stream.Size);
Edit1.Text := outData;
except
on E:Exception do
ShowMessage(e.Message );
//finally
end;
Stream.Free;
//end;
end;
 
procedure TForm2.Button1Click(Sender: TObject);
var
Stream: TStream;
inData: WideString;
outData: WideString;
begin
inData := WideString('123123');

Stream := TMemoryStream.Create;
Stream.Write(PWideChar(inData)^, Length(inData) * SizeOf(WideChar));
Stream.Seek(0, soFromBeginning);

//给OutData分配长度
SetLength(outData, Stream.Size div SizeOf(WideChar));

Stream.Read(PWideChar(outData)^, Length(inData) * SizeOf(WideChar));
Stream.Free;

Edit1.Text := outData;
end;
 
to 0桁骀:
你给出的代码运行到Stream.Free;时还是会出问题,不过仍然感谢~

to wr960204:
正解啊,哈哈~

to ALL:
谢谢各位了,万分感激你们,尤其是wr960204,马上送分~
 
多人接受答案了。
 

Similar threads

后退
顶部