我正在使用Embarcadero RAD Studio XE2 Update 4及其附带的Indy软件包。

我的意图是在局域网中找到一个服务器,该服务器具有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的online documentation与IDE随附的文档有所不同,并按此处所述尝试了该文档,但没有成功。

任何帮助将是巨大的!

最佳答案

您的问题是由with语句引起的,您是将portTIdUDPClient属性而不是局部变量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语句。

10-08 05:06