AData.ReadBuffer
的 AData.Size
和TIdBytes
不起作用TStream
。有没有办法替换它们,因为我得到错误:
TIdBytes不包含名为Size
的成员TIdBytes不包含名为ReadBuffer的成员
我能够在Delphi 2006中使用此代码,但是当我升级到XE5时,我有一些难以理解。
我正在使用Indy UDP服务器和客户端。
答案 0 :(得分:2)
请改为尝试:
procedure TForm1.UDPReceiverUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var
AudioDataSize: Integer;
AudioData : Pointer;
begin
try
EnterCriticalSection(Section);
try
AudioDataSize := Length(AData);
if AudioDataSize > 10 then
begin
try
if not Player.Active then
begin
Player.Active := True;
Player.WaitForStart;
end;
except
end;
if BlockAlign > 1 then Dec(AudioDataSize, AudioDataSize mod BlockAlign);
AudioData := AudioBuffer.BeginUpdate(AudioDataSize);
try
BytesToRaw(AData, AudioData^, AudioDataSize);
finally
AudioBuffer.EndUpdate;
end;
end else
begin
Player.Active := False;
Player.WaitForStop;
end;
finally
LeaveCriticalSection(Section);
end;
except
end;
end;
答案 1 :(得分:1)
在Indy的早期版本中,AData
是TStream
。 AData
后来更改为TIdBytes
,这只是Byte
值的动态数组。您对TIdBytes
TStream
感到困惑。使用标准数组命令与TIdBytes
进行交互。例如,要发现数组中有多少字节,请使用标准Length()
函数:
AudioDataSize := Length(AData);
要从数组中提取数据,可以使用[]
下标运算符来读取单个元素,或使用Copy
函数将多个元素捕获到另一个数组中。使用Move()
将一系列字节复制到其他非数组对象中,例如通用的内存块:
Move(AData[0], AudioData^, AudioDataSize);
或者使用Indy自己的BytesToRaw()
函数:
BytesToRaw(AData, AudioData^, AudioDataSize);