BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

PictureBox repetidos en C#

P B Fierro

Estoy haciendo un programa que hace capturas de pantalla, las graba en un archivo y dinámicamente va creando PictureBox en donde aparecen las imágenes capturadas.

El problema que tengo es que a partir de la segunda captura me duplica los controles. Seguro que es una chorrada, pero estoy obcecado.

El código que tengo es este:

{
var imagenes = Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"capturas temporizadas", "*.jpg");
uno = imagenes.Count();
y = textBox1.Location.Y + textBox1.Size.Height + 20;
if (uno > 0)
{
foreach (var imagen in imagenes)
{
PictureBox[] pb = new PictureBox[uno + 1];
pb[uno] = new PictureBox();
pb[uno].Size = new Size(450, 350);
pb[uno].Location = new Point(x, y);
x = x + 470;
if (x >= this.Size.Width)
{
x = 0;
y = y + 370;
}
Controls.Add(pb[uno]);
pb[uno].SizeMode = PictureBoxSizeMode.StretchImage;
pb[uno].ImageLocation = imagen;
pb[uno].Click+=new EventHandler(pb_Click);
uno–;
}
}

A ver si algún alma caritativa me puede ayudar.

Chrysdeb

Hola:

En lo que debería de ser la línea 48

uno-;

Ese "-" no lo entiendo.

Y el último "}" tampoco.

Saludos.

Hitachibe

No deberia ser uno –; ??

eth0
2

Ni papa de programación, pero lo pasé por ChatGPT, y parece haber dado con el problema. Te copio su respuesta y el código asociado:

En el código proporcionado, el problema se encuentra en el bucle donde se crean y agregan los objetos PictureBox al formulario. El problema está en el manejo de los índices del arreglo "pb".En cada iteración del bucle, se crea un nuevo objeto PictureBox y se agrega a la colección "Controls". Sin embargo, el índice utilizado para acceder al arreglo "pb" es "uno", el cual se decrementa después de cada iteración. Esto significa que se utiliza el mismo índice tanto para agregar el nuevo PictureBox como para establecer sus propiedades e imagen. En consecuencia, los objetos PictureBox previamente agregados se modificarán y mostrarán la misma imagen que el PictureBox recién agregado.Para solucionar este problema, es necesario ajustar la lógica de los índices dentro del bucle. Aquí tienes el código modificado:

var imagenes = Directory.EnumerateFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "capturas temporizadas"), "*.jpg");
int uno = imagenes.Count();
int x = 0;
int y = textBox1.Location.Y + textBox1.Size.Height + 20;
PictureBox[] pb = new PictureBox[uno];
if (uno > 0)
{
    int i = 0;
    foreach (var imagen in imagenes)
    {
        pb[i] = new PictureBox();
        pb[i].Size = new Size(450, 350);
        pb[i].Location = new Point(x, y);
        x = x + 470;
        if (x >= this.Size.Width)
        {
            x = 0;
            y = y + 370;
        }
        Controls.Add(pb[i]);
        pb[i].SizeMode = PictureBoxSizeMode.StretchImage;
        pb[i].ImageLocation = imagen;
        pb[i].Click += new EventHandler(pb_Click);
        i++;
    }
}

En este código modificado, he introducido una variable separada "i" para hacer un seguimiento del índice del arreglo PictureBox "pb". Esta variable comienza en 0 y se incrementa en cada iteración, asegurando que se utilice un índice único para cada objeto PictureBox. Esto debería solucionar el problema de que las capturas de pantalla se duplicaran en los objetos PictureBox._

A ver si hay suerte y te funciona.

PezDeRedes

Justo al final del bucle foreach:

uno–;

Intuyo que estás decrementando la variable, así que será --uno o uno--, pero no con solo un "menos" (si te valen ambas, cosa que sí ocurre en este caso, yo siempre aconsejo la primera).

🗨️ 1
Josh

Eso es pq ha enviado el post y luego editando ha puesto las etiquetas de código ` con lo cual ha tratado el código como texto.

lhacc
1

Lo de un solo guión es cosa del editor de BA, que convierte dos guiones en una raya si no se mete en etiquetas de código, cosa que el autor del mensaje no hizo originalmente.

🗨️ 1
P B Fierro

Lo hice, pero si bien al principio cuando creaba el mensaje las lineas aparecían como código, al publicarlo no salían así y tuve que editarlo…

P B Fierro

En efecto en mi código salían dos signos menos, fue al pasarlo al post cuando se cambio…

Lo estuve pensando por la noche antes de dormir y di con una solución muy sencilla: Poner un Panel y meter en el los Picturebox, añado unas lineas para borrar los picturebox viejos antes de ponerlos otra vez y listo…

Pongo el código por si a alguien le interesa o se encuentra en el mismo problema:

private void cargaimagenes()

{

var imagenes = Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"capturas temporizadas", "*.jpg");

uno = imagenes.Count();

x = 0;

y = 0;// textBox1.Location.Y + textBox1.Size.Height + 20;

for(int w=panel1.Controls.Count-1; w>=0; w–)

{

panel1.Controls.RemoveAt(w);

}

if (uno > 0)

{

foreach (var imagen in imagenes)

{

PictureBox[] pb = new PictureBox[uno + 1];

pb[uno] = new PictureBox();

pb[uno].Size = new Size(450, 350);

pb[uno].Location = new Point(x, y);

x = x + 470;

if (x >= this.Size.Width)

{

x = 0;

y = y + 370;

}

panel1.Controls.Add(pb[uno]);

pb[uno].SizeMode = PictureBoxSizeMode.StretchImage;

pb[uno].ImageLocation = imagen;

pb[uno].Click+=new EventHandler(pb_Click);

uno--;

}

}

}
Agradezco vuestra ayuda!
🗨️ 4
P B Fierro

En este post también se ha comido un signo menos en el primer bucle for, sería:

for(int w=panel1.Controls.Count-1; w>=0; w--)

{

panel1.Controls.RemoveAt(w);

}
🗨️ 3
P B Fierro

Ese bucle for he pensado después que se puede sustituir por:

panel1.Controls.Clear();
Y así se simplifica y gana en eficiencia…
🗨️ 2
lhacc
1

Es lo que iba a decir, es una manera muy rara de borrar… además, C# no tiene foreach? Algo en plan… for x in panel1.Controls; x.remove()

Lo que tú acabas de proponer es más adecuado aún, pero se me hace raro iterar usando un entero

🗨️ 1