掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
関数がクラスのインスタンスを返してくる場合 (ID:7990)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
インスタンスというものについて、よく考えてみてください。 インスタンスは実体で、 TBitmap.Create;は、TBitmapというクラスをインスタンス化するための文です。 実体となったデータの所在地を覚え、参照するために、 Bitmap: TBitmap; という変数は存在します。 ここまではわかりますね。 DoSomethingは、TBitmapを返す関数になっていますが、 これは先ほどまで使っていた(おそらく引数に指定した)Bitmapへの参照(ポインタ)を返します。 …ということは、引数に指定したビットマップへの参照を、DoSomething関数が返してBitmapに代入してしまった場合、 最初に生成したTBitmapのインスタンスは行方不明になってしまい、解放することができなくなってしまいます。 このような場合は、関数が戻り値として、hBitmapを返す(このサイトにあるサンプル参照)などするのがいいのでしょうが、 この場合はPicture1はまた別の独立したオブジェクトになってますので(ReleaseHandleするわけにはいかない)、 Drawメソッドなどでコピーさせるといいでしょう。 少し危なっかしいかもしれませんが、この場合 Bitmap.Canvas.Draw(0,0,DoSomething(Image1.Picture.Bitmap)); とすることで何とかできると思います。 そして最後に、Bitmap.Assign(DoSomething(Bitmap));ですが、 これはもうわかりますね、わたしの修正案のとおりならば、代入されているのはあくまで最初に生成したものなので必要です。 引数に指定したものの場合は、いつもどおりVCLオブジェクトが解放するので不要です(やってはいけません) 関数で作った全く別のものを返した場合は、前者と扱い的に同じになるので必要です。 私見ですが、 procedure DoSomething(Bitmap: TBitmap;var Dest: TBitmap); として渡された変数Destを使って"戻り先として使うビットマップに、ビットマップをコピーする"ということをした方がいいかもしれませんね。 この方が、ぱっと見"どのようなBitmapを必要としてる"のか、わかりやすいと思います。 (好みだと思いますけど)
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.