【问题标题】:Incompatible parameter list when converting from Delphi 7 to Delphi 10.3从 Delphi 7 转换到 Delphi 10.3 时参数列表不兼容
【发布时间】:2020-09-04 09:31:36
【问题描述】:

我有这个应用程序正在尝试转换,但我在服务器通信方面遇到了一些问题。这一行:

procedure UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);

这给了我这个错误:

UDPServer.OnUDPRead 引用的 UDPServerUDPRead 方法有一个不兼容的参数列表。删除引用?

这个过程是这样使用的:

procedure TFrmMain.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  Buffer: Tarray1024ofChar ;
  count: Integer;
begin
  count := AData.Size;
  if count > Length(Buffer) then exit;
  AData.Read(Buffer, count);
  if UDPServerActive then DataReceived(count,ABinding.PeerIP,ABinding.PeerPort,Buffer);
end;

它有什么问题?我应该改变什么?

【问题讨论】:

  • 通过升级您的 Delphi 版本,您也升级了您正在使用的 Indy 版本,假设您使用的是 Delphi 提供的 Indy。因此,请查看 Indy 的源代码,找到有问题的事件,并查看发生了什么变化。如错误消息所述,事件的参数列表已更改。
  • 在 Delphi 10.3 附带的 Indy 中,事件处理程序具有以下配置文件:procedure TFrmMain.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
  • 好的,我更新了程序并将count := AData.Size;更改为count := Length(AData);我应该如何更改AData.Read(Buffer, count);
  • 该代码从流中读取到数组中。但是您不需要这样做,因为您现在提供了一个数组。您将需要花一点时间来了解您的代码的作用。从 Unicode 之前的 Delphi 迁移到 Unicode Delphi 是一项非常重要的任务。理解您的代码至关重要。没有捷径。

标签: delphi udp delphi-7 delphi-10.3-rio


【解决方案1】:

TIdUDPServer.OnUDPRead 事件的签名从 Indy 9 更改为 Indy 10。

在 Indy 9 中,当数据包到达时,会为您提供一个包装原始数据的 TStream 对象。

在 Indy 10 中,当数据包到达时,您将获得一个原始数据的 TIdBytes 字节数组。

所以你需要相应地更新你的代码,例如:

type
  // Char is a 1-byte AnsiChar in D7, but is a 2-byte WideChar in D2009+!
  Tarray1024ofChar = array[0..1023] of AnsiChar{Char} // or, use Byte instead...

...

procedure TFrmMain.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  Buffer: Tarray1024ofChar;
  count: Integer;
begin
  count := Length(AData);
  if count > Length(Buffer) then exit;
  BytesToRaw(AData, Buffer, count);
  if UDPServerActive then
    DataReceived(count, ABinding.PeerIP, ABinding.PeerPort, Buffer);
end;

如果您可以将DataReceived() 更改为接受PAnsiChar(或PByte)而不是Tarray1024ofChar,则可以通过完全摆脱本地Buffer 变量来进一步简化代码:

procedure TFrmMain.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  if UDPServerActive then
    DataReceived(Length(AData), ABinding.PeerIP, ABinding.PeerPort, PAnsiChar{PByte}(AData));
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多