从 Delphi 7 转换为 Delphi 10.3 时不兼容的参数列表
Incompatible parameter list when converting from Delphi 7 to Delphi 10.3
我正在尝试转换此应用程序,但我在服务器通信方面遇到了一些问题。这一行:
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;
有什么问题吗?我应该改变什么?
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;
我正在尝试转换此应用程序,但我在服务器通信方面遇到了一些问题。这一行:
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;
有什么问题吗?我应该改变什么?
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;