13

クラスTStringStreamのようなタイプのないパラメータはどのタイプですか?

function Read(var Buffer; Count: Longint): Longint; override;

バッファパラメータのタイプは何ですか(ポインタのタイプですか?)。

4

4 に答える 4

24

私は数年前にこのトピックについての記事を書きました:

型指定されていないパラメータとは何ですか?

型指定されていないパラメーターは、いくつかの状況で使用されます。TStream.Readあなたが尋ねる方法は、私が書いた手順と最もよく一致しますMove。抜粋は次のとおりです。

procedure Move(const Source; var Dest; Count: Integer);

このMoveプロシージャは、任意の変数から他の変数にデータをコピーします。すべてのタイプの送信元と宛先を受け入れる必要があります。つまり、単一のタイプを必要とすることはできません。このプロシージャは、に渡される変数の値を変更しないSourceため、パラメータの宣言では、型指定されていないパラメータのより一般的な修飾子であるのconst代わりにを使用します。var

の場合TStream.Read、ソースはストリームのコンテンツであるため、パラメーターとして渡さないでください。ただし、宛先はBuffer質問に示されているパラメーターです。そのパラメーターには任意の変数タイプを渡すことができますが、それは注意が必要であることを意味します。ストリームの内容が、指定したパラメーターのタイプに対して実際に有効な値であることを確認するのは、コンパイラーの仕事ではなく、あなたの仕事です。

Delphiが型指定されていないパラメータを使用するその他の状況については、私の記事の残りの部分をお読みください。

于 2009-12-18T15:38:23.517 に答える
4

「型指定されていないパラメータ」については、Delphi のヘルプを参照してください。

任意の型を渡すことができますが、実装でキャストする必要があります。ヘルプによると、数値または型なし数値定数を渡すことはできません。したがって、基本的には、期待する型を知っている必要があり、コンパイラはあなたを助けることができないため、このようにする正当な理由が必要です。互換性のない型を処理するメソッドが必要な場合に役立つと思いますが、予想される型ごとにオーバーロードされたバージョンをいくつか書くことができます。より良い解決策としてそれをお勧めします。

于 2009-12-18T14:59:17.170 に答える
0

意外かもしれませんが、逆参照されたポインターを型指定されていないパラメーターとして渡すことは合法です。また、ポインター自体は型を持つ必要さえありません。

procedure SomeMethod(var aParameter);
  ∶

procedure CallSomeMethod(aIsInteger : Boolean);
type
  buffer    : Pointer;
  intValue  : Integer;
  realValue : Single;
begin
  if aIsInteger then
  begin
    buffer := @intValue;
  end
  else
  begin
    buffer := @realValue;
  end;
  SomeMethod(buffer^);

もちろん、 SomeMethod() へのパラメーターがポインターであった場合はおそらく簡単だったでしょうが、これはあなたの制御下にないかもしれません.

于 2010-08-23T10:02:08.267 に答える
-1

varパラメータ リスト内の は、参照渡しの Delphi 構文です。たとえば、Listview の OnChanging ハンドラーの AllowChange パラメーターとして入力できます。

procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
  if SomeProblemOccurred then
    AllowChange := False;
end;

またはあなたの例のように型付けされていません。

于 2009-12-18T15:06:03.863 に答える