クラスTStringStreamのようなタイプのないパラメータはどのタイプですか?
function Read(var Buffer; Count: Longint): Longint; override;
バッファパラメータのタイプは何ですか(ポインタのタイプですか?)。
クラスTStringStreamのようなタイプのないパラメータはどのタイプですか?
function Read(var Buffer; Count: Longint): Longint; override;
バッファパラメータのタイプは何ですか(ポインタのタイプですか?)。
私は数年前にこのトピックについての記事を書きました:
型指定されていないパラメーターは、いくつかの状況で使用されます。TStream.Read
あなたが尋ねる方法は、私が書いた手順と最もよく一致しますMove
。抜粋は次のとおりです。
procedure Move(const Source; var Dest; Count: Integer);
この
Move
プロシージャは、任意の変数から他の変数にデータをコピーします。すべてのタイプの送信元と宛先を受け入れる必要があります。つまり、単一のタイプを必要とすることはできません。このプロシージャは、に渡される変数の値を変更しないSource
ため、パラメータの宣言では、型指定されていないパラメータのより一般的な修飾子であるのconst
代わりにを使用します。var
の場合TStream.Read
、ソースはストリームのコンテンツであるため、パラメーターとして渡さないでください。ただし、宛先はBuffer
質問に示されているパラメーターです。そのパラメーターには任意の変数タイプを渡すことができますが、それは注意が必要であることを意味します。ストリームの内容が、指定したパラメーターのタイプに対して実際に有効な値であることを確認するのは、コンパイラーの仕事ではなく、あなたの仕事です。
Delphiが型指定されていないパラメータを使用するその他の状況については、私の記事の残りの部分をお読みください。
「型指定されていないパラメータ」については、Delphi のヘルプを参照してください。
任意の型を渡すことができますが、実装でキャストする必要があります。ヘルプによると、数値または型なし数値定数を渡すことはできません。したがって、基本的には、期待する型を知っている必要があり、コンパイラはあなたを助けることができないため、このようにする正当な理由が必要です。互換性のない型を処理するメソッドが必要な場合に役立つと思いますが、予想される型ごとにオーバーロードされたバージョンをいくつか書くことができます。より良い解決策としてそれをお勧めします。
意外かもしれませんが、逆参照されたポインターを型指定されていないパラメーターとして渡すことは合法です。また、ポインター自体は型を持つ必要さえありません。
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() へのパラメーターがポインターであった場合はおそらく簡単だったでしょうが、これはあなたの制御下にないかもしれません.
var
パラメータ リスト内の は、参照渡しの Delphi 構文です。たとえば、Listview の OnChanging ハンドラーの AllowChange パラメーターとして入力できます。
procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
if SomeProblemOccurred then
AllowChange := False;
end;
またはあなたの例のように型付けされていません。