簡體   English   中英

從 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM