C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: PictureBox.BackgroundImage


(過去ログ 171 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■98334 / inTopicNo.1)  PictureBox.BackgroundImage
  
□投稿者/ 星は昴 (9回)-(2021/11/02(Tue) 10:00:54)

分類:[C#] 

 前回の質問と関連する質問です。Pb はデザイナーで貼り付けたPictureBox です。
  60≦Width≦100、60≦Height≦100
を満たす小さな画像を読み込み、PictureBox.BackgroundImage を利用して PictureBox にその画像を連結して敷き詰めるコードです。いいと思ったのですが2回目にファイルを読み込むとき
「アプリケーションのコンポーネントでハンドルされていない例外が発生しました」
という実行エラーが出ます。何が原因でしょうか?

public partial class Form1 : Form
{
  Bitmap bmp;//各イベントハンドラで共有して使うためここで宣言

  private void BtnFileOpen_Click(object sender, EventArgs e)
  {
    OpenFileDialog dialog = new OpenFileDialog();
    if (dialog.ShowDialog() == DialogResult.OK)
    {
      try
      {
        bmp = new Bitmap(dialog.FileName);
        if (Pb.Image != null)
        {
          Pb.Image.Dispose();
        }
        Pb.Image = bmp;
      }
      catch
      {
        MessageBox.Show("これは画像ファイルではありません", "エラー",
                 MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }
    }
  }

  //画像を敷き詰める
  private void BtnTile_Click(object sender, EventArgs e)
  {
    if (bmp != null)
    {
      if (bmp.Width < 60 || bmp.Width > 100)  { return; }
      if (bmp.Height < 60 || bmp.Height > 100) { return; }
      Pb.Width = bmp.Width*10;
      Pb.Height = bmp.Height*8;
      Pb.BackgroundImage = bmp;
      Pb.BackgroundImageLayout = ImageLayout.Tile;
      Pb.Invalidate();
    }
  }
}

引用返信 編集キー/
■98335 / inTopicNo.2)  Re[1]: PictureBox.BackgroundImage
□投稿者/ とっちゃん (742回)-(2021/11/02(Tue) 10:21:51)
No98334 (星は昴 さん) に返信

>   Bitmap bmp;//各イベントハンドラで共有して使うためここで宣言

この bmp を Image と BackgroundImage で共有してますよね?
でも、Image を入れ替えたタイミングでは、BackgroundImage は入れ替えていないので
Dispose(破棄==C でいえば、malloc したメモリをfreeしたのと同じ)の後にアクセスするので
エラーになります。

BackgroundImage と Image で別々のビットマップインスタンスを参照するようにするか
同じにするなら、Image を入れ替えるタイミングで BackgroundImage も対処しないとだめです。
引用返信 編集キー/
■98336 / inTopicNo.3)  Re[2]: PictureBox.BackgroundImage
□投稿者/ 星は昴 (10回)-(2021/11/02(Tue) 12:13:40)
No98335 (とっちゃん さん) に返信
> この bmp を Image と BackgroundImage で共有してますよね?
> でも、Image を入れ替えたタイミングでは、BackgroundImage は入れ替えていないので
> Dispose(破棄==C でいえば、malloc したメモリをfreeしたのと同じ)の後にアクセスするので
> エラーになります。

> BackgroundImage と Image で別々のビットマップインスタンスを参照するようにするか
> 同じにするなら、Image を入れ替えるタイミングで BackgroundImage も対処しないとだめです。

 すばやい回答ありがとうございました。助かります。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -