delphi xe 5 indy 10 Readbuffer& Adata.size

时间:2014-06-25 16:06:40

标签: delphi

使用AData.ReadBuffer

AData.SizeTIdBytes不起作用TStream。有没有办法替换它们,因为我得到错误:

  

TIdBytes不包含名为Size

的成员      

TIdBytes不包含名为ReadBuffer的成员

我能够在Delphi 2006中使用此代码,但是当我升级到XE5时,我有一些难以理解。

我正在使用Indy UDP服务器和客户端。

2 个答案:

答案 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的早期版本中,ADataTStreamAData后来更改为TIdBytes,这只是Byte值的动态数组。您对TIdBytes TStream感到困惑。使用标准数组命令与TIdBytes进行交互。例如,要发现数组中有多少字节,请使用标准Length()函数:

AudioDataSize := Length(AData);

要从数组中提取数据,可以使用[]下标运算符来读取单个元素,或使用Copy函数将多个元素捕获到另一个数组中。使用Move()将一系列字节复制到其他非数组对象中,例如通用的内存块:

Move(AData[0], AudioData^, AudioDataSize);

或者使用Indy自己的BytesToRaw()函数:

BytesToRaw(AData, AudioData^, AudioDataSize);