公開されている某ソフトのソースコードの中に
var
Canvas: TCanvas;
begin
Canvas := TBitmap.Create.Canvas;
try
{ 処理 }
finally
Canvas.Free;
end;
end;
こんな感じのコードがありました。
「TBitmapのインスタンスは破棄されないのでは?」
と私は疑問に思ったのですが、こういう書き方は成立するのですか?
どうぞよろしくお願いします。
ちなみに某ソフトは世界的に利用されているソフトみたいです。
> こういう書き方は成立するのですか?
しないと思います。
jokさん、ありがとうございます。
> しないと思います。
やはりそうですか。
こういう風に書けば問題ないでしょうか?
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
{ Bitmap.Canvasを使用 }
finally
Bitmap.Free;
end;
end;
> こういう風に書けば問題ないでしょうか?
はい、問題ないと思います。わたしもそんなコードを何度も書いてます。
> はい、問題ないと思います。わたしもそんなコードを何度も書いてます。
どうもありがとうございました。
> はい、問題ないと思います。わたしもそんなコードを何度も書いてます。
どうもありがとうございました。
勝手な質問ですが、
初めからTCanvas.Createでは駄目なのですか?
> 初めからTCanvas.Createでは駄目なのですか?
TCanvas インスタンスがほしいのではなく、TBitmap のインスタンスがほしいのでしょう。
実際、TCanvas のインスタンスをつくっても、なんにも使えません。
> TCanvas のインスタンスをつくっても、なんにも使えません。
使えますね。
たとえば、GetDCでデスクトップのデバイスコンテキストを得て、
それをTCanvasオブジェクトのハンドルプロパティに入れれば、
まるでDelphiのオブジェクトのように、デスクトップのデバイスコンテキストを取り扱えます。
> TCanvasオブジェクトのハンドルプロパティに入れれば、
それはそうですけど、質問の意味からすると、TCanvas 単独ではなんの
デバイスコンテキストも持ってないわけですから、それ自体では使えません、
ということです。
元質問のソースでTBitmapのインスタンスを使うにはどうするのでしょうか?
> 元質問のソースでTBitmapのインスタンスを使うにはどうするのでしょうか?
> Canvas := TBitmap.Create.Canvas;
こういうふうに、つくったインスタンスの Canvas だけを参照に代入しているので
TBitmap のインスタンス参照は行方不明になります。ですから、Free もできず、
正しくないコードであると思います。
>TCanvas インスタンスがほしいのではなく、TBitmap のインスタンスがほしいのでしょう。
>TBitmap のインスタンス参照は行方不明になります。
では初めのソースは何をするソースだったのですか?
> では初めのソースは何をするソースだったのですか?
読んだとおり、こんなソースがあるけど、自分は正しくないと思うんだけど、
どうなの? って質問では? コードを書いた人は、TBitmap の Canvas だけ
を使いたかったんでしょう、と想像します。でも、上から3番目のかえでさんの
書き方が正しいと思います。参照が行方不明になると Free することもできない
ので注意が必要です。
うーむ、るるとん@K さんの質問を読んでみると、
> Canvas := TBitmap.Create.Canvas;
このコードの意味が分かっていないようです。
TCanvas は、例えてみれば、絵を描くための道具であり、名前とちがって、
描く対象を持っていないのです。ですから、普通は、PaintBox1.Canvas とか
Bitmap.Canvas, Image1.Canvas 、Form1.Canvas のように、具体的な対象
を参照して、そのプロパティーとして使用されます。TCanvas 単独ではなにも
できません。たかみさんの指摘のように Handle にデバイスコンテキストハン
ドルというものを設定してはじめて使えます。
> Canvas := TBitmap.Create.Canvas;
このコードは、
TBitmap.Create をまず実行してそのインスタンスをつくります。そして、その
Canvas プロパティーを Canvas という名前の TCanavs 型の変数に代入して
いるのです。ですから、TBitmap のインスタンスは行方不明になりますが、
その Canvas プロパティーだけは使用できるのです。
ツイート | ![]() |