1

Embarcadero RAD Studio XE2 Update 4 とそれに同梱されている Indy パッケージを使用しています。

私の意図は、サーバーからの応答を待ってIPを取得する TIdUDPClient からのブロードキャストでLAN内のサーバーを見つけることです。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に渡しています。portTIdUDPClientportReceiveString

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()パラメータなしで呼び出すと、最初のオーバーロードが呼び出されます。2 番目のオーバーロードを呼び出そうとすると、ステートメントがローカル変数ではなく 2 番目のパラメーターにプロパティをwith渡しているため、コードはコンパイルに失敗します。コンパイルでは、プロパティをパラメーターに渡すことはできません。TIdUDPClient.Portportvar

競合を解決するには、withステートメントを削除するか、変数の名前を変更する必要があります。port

于 2012-10-09T05:47:07.807 に答える