problema en c# (probablemente clases)

hashimoto

Gold Member
Se incorporó
30 Julio 2006
Mensajes
2.386
Hola soy totalmente niu en POO aun no logro despues de años entenderla xD, estoy aprendiendo C# para ayudar a una persona a terminar un programa que genera PDF, tengo lo siguiente

Código:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

       
        public void button1_Click(object sender, EventArgs e)
        {
            
            OpenFileDialog imagenes = new OpenFileDialog { Multiselect = true, Filter = "Image files | * .jpg;*.jpeg;*.png;" };
            if (imagenes.ShowDialog() == DialogResult.OK)
            {
                foreach (String image in imagenes.FileNames)
                {
                    PictureBox pb = new PictureBox();
                                        
                    // assign the image
                    pb.Image = new Bitmap(image);

                    // stretch the image
                    pb.SizeMode = PictureBoxSizeMode.StretchImage;

                    // set the size of the picture box
                    pb.Height = pb.Image.Height / 10;
                    pb.Width = pb.Image.Width / 10;

                    // add the control to the container
                    flowLayoutPanel1.Controls.Add(pb);
                }
            }
        }

        public void button2_Click(object sender, EventArgs e)
        {
        }
    }
}

la idea es que desde el boton 2, pueda obtener la variable imagenes, he intentado ponerla como publica afuera, realizar una copia, instanciarla en una clase aparte, pero al compilar, y utilizar el boton 1 se crashea
 

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303
C#:
public partial class Form1 : Form {

    private OpenFileDialog imagenes;



    public void button1_Click(object sender, EventArgs e) {

        this.imagenes = new OpenFileDialog { Multiselect = true, Filter = "Image files | * .jpg;*.jpeg;*.png;" };

    }

    public void button2_Click(object sender, EventArgs e) {

        // this.imagenes

        // ...

    }

}

Si no funciona eso, es porque el objeto instanciado a partir de Form1 en el evento click del botón 2 es uno distinto al instanciado en el evento del botón 1. Internamente los objetos tienen un id con el que podrías saber durante la misma ejecución si botón 1 y 2 comparten la misma instancia del objeto en la memoria.

Mirate por acá para mas info.
 
Última modificación:
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303
funciono muchas gracias, pense que tenia que ser publico para que lo leyera en ambas clases
Según el código que pusiste, solo hay una clase (Form1), si lo dices por el : Form, eso significa que la clase Form1 hereda de la clase Form.

Si en cambio tuvieras otra clase por ejemplo Form2, y quisieras accesar desde la misma a la propiedad imagenes, tendrías que hacer algo así
C#:
public partial class Form1 : Form {
    public static OpenFileDialog imagenes;
    public void button1_Click(object sender, EventArgs e) {
        // Accesando a propiedad estática
        Form1.imagenes = new OpenFileDialog { Multiselect = true, Filter = "Image files | * .jpg;*.jpeg;*.png;" };
    }
    public void button2_Click(object sender, EventArgs e) {
        // Form1.imagenes
        // ...
    }
}
public partial class Form2: Form {
    // Constructor
    public Form2() {
        // Form1.imagenes
    }
}
Cuando defines un miembro de una clase como static, dicho miembro no forma parte de una instancia. Para que se entienda mejor, la instancia es un objeto en la memoria, dentro del segmento asociado al objeto no vas a encontrar a imagenes puesto que no puedes hacer lo siguiente (hasta donde recuerdo).

C#:
Form1 f = new Form1();
// f.imagenes = algo;
En cambio tienes que accesar directamente mencionando al nombre de la clase porque dichos miembros son propios de la misma.
En muchos lenguajes puedes operar con la sintaxis estática
C#:
Form1.imagenes
Pero a la larga, no es algo recomendable porque conlleva a sobreescrituras indeseadas. En cambio el uso de una clase te da de cierta forma una especie de contrato a cumplir mediante los métodos que accesan a una propiedad privada en la siguiente forma
C#:
public partial class Ejemplo {
    // Propiedad privada
    private int _propiedad;
    public int propiedad {
        // Accesador a la propiedad: Ejemplo e = new Ejemplo(); e.propiedad;
        get => _propiedad;
        // Inicialización de la propiedad
        init => _propiedad = 0;
        set {
            // Validaciones varias
            // Seteo de la propiedad
            _propiedad = value; // Value es el valor entrante
        }
    }
    public void algunaOperacion(int x, int y) {
        // Todas las formas son válidas
        // this._propiedad += x * y;
        // _propiedad += x * y;
    }
    // main
    static void Main(string[] args) {
        Ejemplo e = new Ejemplo();
        e.propiedad = 25;
        Console.WriteLine(e.propiedad);
    }
}
La gracia del asunto es permitir operaciones puntuales sobre los objetos dejando que éstos tengan una operatividad interna sin que ningún agente extraño interfiera provocando errores debido a la sincronicidad de la operación. Luego puedes hacer que los objetos se comuniquen entre sí estableciendo formas normadas en procesos estandarizados a nivel de como hacer las cosas.
Ésto se pudiera ejemplificar así, si tuvieramos una representación abstracta de dos personas conversando
C#:
public partial class Persona {
   private String[] _pensamientos;
   public String hablar() {}
   public bool escuchar(String mensaje) {}
   public bool pensar() {}
   public void ignorar(String mensaje) {}
    // main
    static void Main(string[] args) {
        Persona homero = new Persona();
        Persona marge = new Presona();
        String t;
        t = marge.hablar();
        homero.ignorar(t);
        t = marge.hablar();
        homero.escuchar(t);
        t = homero.hablar();
        marge.escuchar(t);
        while (!marge.pensar()) {
            t = homero.hablar();
            marge.ignorar(t);
        }
        // ....
    }
}

Igual tengo libros de C# en PDF por si quieres meterte en el lenguaje.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303

Archivo adjunto

  • El lenguaje de programación C#.pdf
    1,6 MB · Visitas: 59
  • Introducción a la Programación con C# (Nacho Cabanes).pdf
    3,7 MB · Visitas: 60
  • 2_1 CSHARP_visto_desde_C_1.pdf
    50,7 KB · Visitas: 39
  • c-sharp-para-estudiantes.pdf
    4 MB · Visitas: 56
Upvote 0
Subir