はじめまして、継承クラスをつくりはじめたくらいの技量の者です。
TOrigBitmap=class(TBitmap)
public
procedure EffectCopy(var ToBitmap: TBitmap);
…
end;
というクラスを自作しているところなんですが、
ToBitmapに任意のBitmapを入れると、OrigBitmapが保持している画像がエフェクトされて出てくるという処理をつけようとして悩んでいます。
自分がしたいことは、
procedure TOrigBitmap.EffectCopy(var ToBitmap: TBitmap);
begin
ToBitmap.Assign( <TOrigBitmapのデータ> );
〜 で、ToBitmapをエフェクト処理 〜
end;
としたいのですが、TOrigBitmapの外部でならToBitmap.Assign(OrigBitmap);でOrigBitmapの情報を渡せますが、
TOrigBitmapの手続内でToBitmapにTOrigBitmapの情報を渡す方法がわかりません。
他のところでも聞いてみたのですが、こういうことができるのかできないかも教えてもらえなかったので、気になって質問しています。
あと、質問の意味が上手く伝わらなかったらごめんなさい。
>procedureのメソッド
○procedureのメソッド内での間違いです。
ごめんなさい。
ToBitmap.Assign(self)
じゃないですか。
ちなみに ToBitmap に別の参照を代入しないなら引数に var をつける必要はありません。
うんとさん、さっそくのお答えありがとうございます。
実験してみたら、本当にうまくいきました。
>ちなみに ToBitmap に別の参照を代入しないなら引数に var をつける必要はありません。
これも実験してみたのですが、本当にそのとおりでした。
どうして、varをつけないでコピー渡ししたつもりなのに、代入した元のToBitmapまでEffectCopyの手続内で変化させられるんでしょうか?
TBitmapはクラスだから、ポインタであり、引数にしたら参照渡しになるから?って推測してみたんですが。
もしどちらも結果的に参照渡しになるのなら、varをつけてもつけなくても速度的には同じってことですね…
あ、解決入れるの忘れてました。
うんとさん、ありがとうございます。
> TBitmapはクラスだから、ポインタであり、引数にしたら参照渡しになるから?って推測してみたんですが。
そうです。クラスのインスタンス変数は参照(ポインタ)ですから、コピーを
渡しても実質が変更されます。
> もしどちらも結果的に参照渡しになるのなら、varをつけてもつけなくても速度的には同じってことですね…
いや、var をつけなければならないときもあります。例えば、渡されたビットマップ
と同じサイズのビットマップを新たにつくって、呼び出しもとに戻したいとき、など
です。このときは、もちろん渡されたビットマップはメソッド内で Free します。
うんとさん、どうもありがとう!!
ツイート | ![]() |