请教indy9转到indy10的问题

时间:2022-12-04 17:37:43
在indy9中用的FReceiveStream: TMemoryStream;

procedure TChatInfo.UDPServerUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
begin
  FReceiveStream.Clear;
  FReceiveStream.LoadFromStream(AData);
  FReceiveStream.Read(MessageID, SizeOf(MessageID));
在indy10中这个TMemoryStream该怎么转换呢?
在indy10中不是AData: TStream;是AData: TBytes;了 该怎么转换过来呢?
用BytesToRaw RawToBytes吗?
比如  FSendStream.Write(MessageID, SizeOf(MessageID));
  UDPClient.SendBuffer(ABinding.PeerIP, UDPClientServerPort, FSendStream.Memory^, FSendStream.Size);
是否该  FSendStream.Write(MessageID, SizeOf(MessageID));
  UDPClient.SendBuffer(ABinding.PeerIP, UDPClientServerPort, RawToBytes(FSendStream.Memory^, FSendStream.Size));行吗?

是不是把TBytes写到TMemoryStream里面再用,是该怎么个写法呢?
求高人指点指点啊,谢谢谢谢啊~~

10 个解决方案

#1


看到僵哥大大的解说 不是太明白 该怎么用 那位好心人能举个例
Indy10有好几个版本。 
Stream转Bytes 

//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数 
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer; 

var 
  mem: TMemoryStream; 
  bytes: TIdBytes; 
... 
  mem.Position := 0; 
  ReadTIdBytesFromStream(mem,Bytes,mem.Size); 

反过来可以使用 
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes; 
  const ASize: Integer = -1; const AIndex: Integer = 0);

#2


不太清楚
TMemoryStream是从TStream继承来的。 

#3


偶也是不太清楚啊

#4


ToBytes(StrEAM.Memory,StrEAM.Size);

#5


楼上的兄弟 你只说了一个地方 

#6


看来没有人说了啊 还有人知道吗

#7


indy也是,9到10,也不会保留、兼容9的方法。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的

现在却是原代码无法直接升级。。。。。。

#8


该回复于2010-11-19 16:40:20被版主删除

#9


不太清楚,很少用 INDY,
你可以试一试 RawToBytes ,相对应的 BytesToRaw,

uses Idglobal;

var
 Buf: TidBytes;

#10


你要改写 你的函数 。
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream 
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!

#1


看到僵哥大大的解说 不是太明白 该怎么用 那位好心人能举个例
Indy10有好几个版本。 
Stream转Bytes 

//第一个参数,就是那个TMemoryStream,第二个参数是一个TIdBytes类型,第三个是你需要取多少字节,返回值是实际取得的字节数 
function ReadTIdBytesFromStream(const AStream: TStream; var ABytes: TIdBytes; const Count: Integer): Integer; 

var 
  mem: TMemoryStream; 
  bytes: TIdBytes; 
... 
  mem.Position := 0; 
  ReadTIdBytesFromStream(mem,Bytes,mem.Size); 

反过来可以使用 
procedure WriteTIdBytesToStream(const AStream: TStream; const ABytes: TIdBytes; 
  const ASize: Integer = -1; const AIndex: Integer = 0);

#2


不太清楚
TMemoryStream是从TStream继承来的。 

#3


偶也是不太清楚啊

#4


ToBytes(StrEAM.Memory,StrEAM.Size);

#5


楼上的兄弟 你只说了一个地方 

#6


看来没有人说了啊 还有人知道吗

#7


indy也是,9到10,也不会保留、兼容9的方法。。。。。。
虽然保留旧方法可能会导致类庞杂,但是只要分类清晰,可以让开发者慢慢自动放弃旧方法的

现在却是原代码无法直接升级。。。。。。

#8


该回复于2010-11-19 16:40:20被版主删除

#9


不太清楚,很少用 INDY,
你可以试一试 RawToBytes ,相对应的 BytesToRaw,

uses Idglobal;

var
 Buf: TidBytes;

#10


你要改写 你的函数 。
不要考虑 把stream改写成 Tidbytes。
而考虑把源数据结构改写成Tidbytes.
比如原先是 string to stream 
现在是string to tidbytes.
Indy里边,关于tidbytes的转换函数有很多!