Как устранить ошибку при использовании AutoScroll с#?
В flowLayotPanel1 создаются динамические Picturebox, при использовании элемента AutoScroll вылетает программа и выдает ошибку, как это исправить?
private void btn_scrennshot_Click(object sender, EventArgs e)
{
var pb = new PictureBox();
var name = new Label();
var chbx = new CheckBox();
try
{
Mat m = new Mat();
capture.Retrieve(m);
pb.Image = m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.None).Bitmap;
pb.SizeMode = PictureBoxSizeMode.Zoom;
pb.Height = pb.Image.Height / 3;
pb.Width = pb.Image.Width / 3;
name.Text = $"SMV_{textBox_surename.Text + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second}";
flowLayoutPanel1.Controls.Add(pb);
pb.Controls.Add(chbx);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void flowLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
try
{
flowLayoutPanel1.AutoScroll = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
код ошибки
System.AccessViolationException: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
окно с кодом выдает такое (чет я не придал значение, возможно это даст больше информации)
using System;
using System.Windows.Forms;
namespace SOFIA_Vision
{
static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Ответы (1 шт):
Скорее всего смысл в том, что битмапы, переданные в PictureBox ссылаются на участок памяти, который освобождается до того как вы его перестаете использовать.
Это ошибка неуправляемого кода, когда что-то пытается обратиться к участку памяти по указателю, ссылающемуся на недоступный текущему приложению участок оперативной памяти. То есть память была не выделена или освобождена. В вашем случае, скорее всего второе.
Чтобы этого избежать, нужно создать свой собственный Bitmap и скопировать туда картинку.
pb.Image = new Bitmap(m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.None).Bitmap);