こういう書き方は成立するのですか?

解決


かえで  2004-03-26 23:09:10  No: 7910

公開されている某ソフトのソースコードの中に

var
  Canvas: TCanvas;
begin
  Canvas := TBitmap.Create.Canvas;
  try
    { 処理 }
  finally
    Canvas.Free;
  end;
end;

こんな感じのコードがありました。
「TBitmapのインスタンスは破棄されないのでは?」
と私は疑問に思ったのですが、こういう書き方は成立するのですか?
どうぞよろしくお願いします。

ちなみに某ソフトは世界的に利用されているソフトみたいです。


jok  2004-03-26 23:52:50  No: 7911

> こういう書き方は成立するのですか?

しないと思います。


かえで  2004-03-27 01:44:17  No: 7912

jokさん、ありがとうございます。

> しないと思います。
やはりそうですか。
こういう風に書けば問題ないでしょうか?

var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    { Bitmap.Canvasを使用 }
  finally
    Bitmap.Free;
  end;
end;


jok  2004-03-27 02:26:34  No: 7913

> こういう風に書けば問題ないでしょうか?

はい、問題ないと思います。わたしもそんなコードを何度も書いてます。


かえで  2004-03-27 02:47:49  No: 7914

> はい、問題ないと思います。わたしもそんなコードを何度も書いてます。
どうもありがとうございました。


かえで  2004-03-27 02:47:54  No: 7915

> はい、問題ないと思います。わたしもそんなコードを何度も書いてます。
どうもありがとうございました。


るるとん@K  2004-03-27 04:31:23  No: 7916

勝手な質問ですが、
初めからTCanvas.Createでは駄目なのですか?


jok  2004-03-27 05:01:23  No: 7917

> 初めからTCanvas.Createでは駄目なのですか?

TCanvas インスタンスがほしいのではなく、TBitmap のインスタンスがほしいのでしょう。
実際、TCanvas のインスタンスをつくっても、なんにも使えません。


たかみちえ  URL  2004-03-27 06:55:54  No: 7918

> TCanvas のインスタンスをつくっても、なんにも使えません。
  使えますね。
たとえば、GetDCでデスクトップのデバイスコンテキストを得て、
それをTCanvasオブジェクトのハンドルプロパティに入れれば、
まるでDelphiのオブジェクトのように、デスクトップのデバイスコンテキストを取り扱えます。


jok  2004-03-27 07:31:48  No: 7919

> TCanvasオブジェクトのハンドルプロパティに入れれば、

それはそうですけど、質問の意味からすると、TCanvas 単独ではなんの
デバイスコンテキストも持ってないわけですから、それ自体では使えません、
ということです。


るるとん@K  2004-03-27 21:13:04  No: 7920

元質問のソースでTBitmapのインスタンスを使うにはどうするのでしょうか?


jok  2004-03-27 21:44:07  No: 7921

> 元質問のソースでTBitmapのインスタンスを使うにはどうするのでしょうか?

> Canvas := TBitmap.Create.Canvas;

こういうふうに、つくったインスタンスの Canvas だけを参照に代入しているので
TBitmap のインスタンス参照は行方不明になります。ですから、Free もできず、
正しくないコードであると思います。


るるとん@K  2004-03-28 06:12:48  No: 7922

>TCanvas インスタンスがほしいのではなく、TBitmap のインスタンスがほしいのでしょう。
>TBitmap のインスタンス参照は行方不明になります。
では初めのソースは何をするソースだったのですか?


jok  2004-03-28 09:04:51  No: 7923

> では初めのソースは何をするソースだったのですか?

読んだとおり、こんなソースがあるけど、自分は正しくないと思うんだけど、
どうなの? って質問では? コードを書いた人は、TBitmap の Canvas だけ
を使いたかったんでしょう、と想像します。でも、上から3番目のかえでさんの
書き方が正しいと思います。参照が行方不明になると Free することもできない
ので注意が必要です。


jok  2004-03-28 09:31:32  No: 7924

うーむ、るるとん@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 プロパティーだけは使用できるのです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加