![](/img/trans.png)
[英]Is there a workaround for “incompatible parameter list” message from Delphi IDE?
[英]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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.