1

我正在使用 Embarcadero RAD Studio XE2 Update 4 和随附的 Indy 软件包。

我的目的是在 LAN 中找到一个服务器,该服务器具有来自 TIdUDPClient 的广播,该服务器等待来自服务器的响应以获取其 IP。如果我使用不带参数的 TIdUDPClient 方法 ReceiveString 接收数据工作正常。

但是,当我尝试使用 RAD Studio 随附的 Indy 10 文档版本 10.5.8.3 中的重载版本时,它无法编译并显示“E2250:没有可以使用这些参数调用的 'ReceiveString' 的重载版本” . 这是我的代码:

unit Client;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPClient, Vcl.StdCtrls, IdGlobal;

type
  TFormLC = class(TForm)
    UDPClient: TIdUDPClient;
    LServer: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormLC: TFormLC;

implementation

{$R *.dfm}

function findServer:string;
var ans, ip : string;
    port: TIdPort;
begin
  with FormLC.UDPClient do begin
    Active := True;
    BroadcastEnabled:=True;
    Broadcast('ServerRequest', 1234);
    ans := ReceiveString(ip, port);
    Active := False;
  end;
  if SameText(ans, 'ServerAccept') then
    result := ip
  else
    result := '';
end;


procedure TFormLC.Button1Click(Sender: TObject);
var ans:string;
begin
  LServer.Caption := findServer;
end;

end.

我注意到 Indy 的在线文档与 IDE 附带的文档不同,并按照那里的描述进行了尝试,但没有成功。

任何帮助都会很棒!

4

2 回答 2

4

您的问题是由with语句引起的,您将port属性TIdUDPClient而不是局部变量port传递给ReceiveString方法。

function findServer:string;
var ans, ip : string;
    port: TIdPort;
begin
  with FormLC.UDPClient do begin
    ....
    ans := ReceiveString(ip, port);//here you are passing the port property 
    Active := False;
  end;
  .... 
end;

作为解决方法,您可以port像这样重命名局部变量:

 function findServer:string;
var ans, ip : string;
    vport: TIdPort;
begin
  with FormLC.UDPClient do begin
    .... 
    ans := ReceiveString(ip, vport);//now will work
    Active := False;
  end;
end;

甚至最好不要使用该with语句。

于 2012-10-09T01:47:04.033 回答
2

TIdUDPClient有 2 个重载ReceiveString()

function ReceiveString(const AMSec: Integer = IdTimeoutDefault; AByteEncoding: TIdTextEncoding = nil{$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}): string; overload;

function ReceiveString(var VPeerIP: string; var VPeerPort: TIdPort; const AMSec: Integer = IdTimeoutDefault; AByteEncoding: TIdTextEncoding = nil{$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}): string; overload;

当您ReceiveString()不带参数调用时,您调用的是第一个重载。尝试调用第二个重载时,您的代码无法编译,因为您的with语句将TIdUDPClient.Port属性传递给第二个参数,而不是您的局部port变量。编译将不允许您将属性传递给var参数。

您需要删除该with语句和/或重命名您的port变量以解决冲突。

于 2012-10-09T05:47:07.807 回答