2

こんな質問をしなければならないのは本当に申し訳ありませんが、Delphi の基本的なことがはっきりとわかりません。

TIdSSLIOHandlerSocketOpenSSL のようなクラスの変数を宣言するとき、何を開始する必要がありますか? 明らかに、それが文字列または整数の場合、必要な値は整数の文字列になりますが、この場合はあまり明白ではありません (私のような無能な人には)。それを開始しないとアクセス違反が発生します。ここ about.comで記事を見つけた理由は理解できますが、その記事では何を開始するかについて説明していません。

以下は、変数クライアントを開始していないため、アクセス違反を発生させるコードです (GUI のないアプリケーションです)。

program New;

uses
  Windows, Messages, SysUtils, Variants, Classes,
  Sockets, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdServerIOHandler, IdSSL, IdSSLOpenSSL;


function Handshake(target: string; port: integer) : string;
var client: TIdSSLIOHandlerSocketOpenSSL;
begin
client.Create();
client.Port := port;
client.Destination := target;
client.Destroy;
end;


begin

  Handshake('127.0.0.1',15);

end.

無知で申し訳ありませんが、

N

4

1 に答える 1

6

構文を使用しTIdSSLIOHandlerSocketOpenSSL.Createてコンストラクターを呼び出し、結果をインスタンス変数に保存する必要があります。

function Handshake(target: string; port: integer) : string;
var
  client: TIdSSLIOHandlerSocketOpenSSL;
begin
  client := TIdSSLIOHandlerSocketOpenSSL.Create;
  try
    client.Port := port;
    client.Destination := target;
    Result := ...;//don't forget to assign the return value to something
  finally
    client.Free;
  end;
end;

またtry/finally、例外に直面してオブジェクトの存続期間を保護するために使用します。ブロックは常に実行され、finally実行パスが try に渡されます。

また、オブジェクトを破棄するには、Freeではなく呼び出す必要がありますDestroy。これはここでは問題ではありませんが、別のオブジェクトのデストラクタ内でオブジェクトを破棄する場合に非常に重要です。FreeI refer you (inmodest I know)のトピックの詳細については、別の answer of mineを参照してください。

于 2012-04-07T16:38:23.667 に答える