4

カスタム スレッドでリクエスト キューを作成していますTMyThreadが、サブルーチンに使用できるプロシージャ タイプを定義するのに苦労しています。リクエストを表すレコード、対応するレコード ポインタ、およびレコードで使用され、レコード ポインタ使用するプロシージャ タイプがあります。

type
  PRequest = ^TRequest;

  TResponseProc = procedure(Sender: TMyThread; Request: PRequest);

  TRequest = record
    Request: String;
    Proc: TResponseProc;
    Response: String;
  end;

問題は、という名前のサブルーチンを実装しResponseProcて に割り当てようとするとResponseProcTResponseProc機能せず、IDE が次のエラー メッセージを返すことです。

[DCC Error] MyProject.dpr(42): E2094 Local procedure/function 'ResponseProc' assigned to procedure variable

TResponseこのプロシージャ タイプを定義し、サブルーチンで使用するにはどうすればよいですか?

4

1 に答える 1

8

レコードとプロシージャの宣言は問題ありません。エラー メッセージは、別の関数のスコープ内で定義されているローカル プロシージャを使用していることを示しています。このような関数へのポインターは使用できません。これは、呼び出しに余分な作業が必要であり、通常の関数ポインターでは表現できないためです。(コンパイラは、呼び出し元が使用方法を知らない関数へのポインターの作成を許可しません。)

解決策は、関数を定義した他の関数の外側に移動することです。内側の関数が外側の関数の変数を使用しているためにそれが難しい場合は、それらの値を他の関数に取得する別の方法を考え出す必要があります。それらをパラメーターとして渡すなどして、おそらくその要求レコードの追加メンバーにします。

もう 1 つのオプションは、プロシージャ参照を使用し、代わりにローカル プロシージャを無名プロシージャとして定義することです。ローカル変数にアクセスできますが、それを呼び出す方法を知っているのは Delphi と C++ Builder のみであるため、外部 API との互換性が必要な場合は選択できません。

于 2013-03-03T08:07:16.650 に答える