• Viernes 29 de Marzo de 2024, 10:59

Autor Tema:  problema con una clase  (Leído 2751 veces)

hiram000

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
problema con una clase
« en: Lunes 6 de Mayo de 2013, 10:15 »
0
Hola que tal tengo una duda espero mepuedan ayudar soy nuevo en C#, estoy haciendo un programa en el cual trazo figuras sobre un picturebox, el programa ya esta terminado pero lo que quiero hacer ahora es crear clases por ejemplo, trazar plano cartesiano, trazar cuadros, etc, para tener elcodigo mas organizado, he agregado una nueva clase que se llama trazar, el codigo es algoasi:
class plano:Form1
    {
        public void trazar()
        {
            cuadro.DrawLine(LineaPlano, 0, 100, 100, 100);
        }
    }

y desde el formulario tengo un boton en elcual tengo lo siguiente :

private void button1_Click(object sender, EventArgs e)
        {
            proyeccion.plano obj = new proyeccion.plano();
            obj.trazar();
        }

pero al darle click no me dibuja la linea, las variables las tengo declaradas como public static en la parte del formulario, ya estuve leyendo pero no he podido solucionarlo espero me puedan ayudar graciass.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:problema con una clase
« Respuesta #1 en: Lunes 6 de Mayo de 2013, 18:36 »
0
Con la informacion que has publicado no es posible darte ayuda.

De donde viene Cuadro, proyeccion y plano?

Debes de publicar el codigo completo de la clase plano, cuadro, y proyeccion para saber que esta pasando ahi.

Si pudieras adjuntarlo en un archivo zip en tu mensaje original, seria excelente.

Saludos :)
« última modificación: Lunes 6 de Mayo de 2013, 18:38 por ProfesorX »

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

hiram000

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:problema con una clase
« Respuesta #2 en: Lunes 6 de Mayo de 2013, 19:14 »
0
Lo siento no escribi todo para no hacer el post tan largo pero ahora pongo todo:

 public static Pen LineaPlano = new Pen(Color.Black);// con lo que hare mis lineas
 public static Graphics cuadro;
cuadro = pictureBox1.CreateGraphics();// asigno a cuadro mi area de dibujo

proyeccion es el espacio de nombres,plano es la nueva clase que agregue 
  proyeccion.plano obj = new proyeccion.plano(); //con esto segun yo estoy instanciadno al objeto
obj.trazar();// mando llamar ami metodo trazar de la clase plano

Como dije antes soy nuevo en C# asi que si hice algo mal disculpen, y ya agregue el proyecto, gracias.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:problema con una clase
« Respuesta #3 en: Lunes 6 de Mayo de 2013, 21:31 »
0
Bueno ya revise tu codgo y me parece que estas relizando mal la separacion, creo que aun no entiendes muy bien el concepto de clases, y de herencia.

Estas definiendo plano de tipo Form1, y a su vez Form1 es de tipo Form, o sea que plano es un formulario, y pues lo que estas haciendo al crear plano dentro de Form1, es crear otro formulario, entonces al llamar a trazar, el metodo esta dibujando en un segundo formulario que no es visible, porque no has escrito plano.Show() para mostrarlo.

Ademas utilizas variables estaticas, lo cual no es recomendable, todo el paso de valores entre clases deberia ser por medio de parametros, y no utilizar para nada variables estaticas. Las variables estaticas se comportan como si fueran variables globales en otros lenguajes de programacion, y usar variables globales conlleva a muchos errores, porque pierdes de vista en que parte de tu codigo estas utilizando y cambiando el valor de la variable.

No me malentiendas, hay casos en donde no se pueden utilizar parametros por alguna razon para pasar valores entre clases, y entonces si, ahi entran las variables estaticas, pero en lo posible siempre se deben usar parametros para pasar valores entre clases.

Lo mas correcto para mi seria que definieras tu clase plano sin tipo, y que le pases como parametros los valores necesarios.

Te dejo un codigo para que te des una idea, ya que una imagen vale mas que mil palabras.

clase plano
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace proyeccion
{
    public class plano
    {
        // Usar parametos para pasar los valores a la clase
        public void trazar(Graphics cuadro, Pen LineaPlano, int tamañox, int tamañoy)
        {
            cuadro.DrawLine(LineaPlano, 0, tamañoy / 2, tamañox, tamañoy / 2);// trazo una linea

            int suma = tamañox + tamañoy;// la puse para ver si recibia los valores que le asigne en el form
            MessageBox.Show(suma.ToString());
        }
    }
}

clase Form1

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace proyeccion
{
    public partial class Form1 : Form
    {
        // No es necesario ponerlos estaticos, si se los
        // pasas a la clase como parametros
        public Pen LineaPlano = new Pen(Color.Black);
        public Graphics cuadro;
        public int tamañox = 0;
        public int tamañoy = 0;
        public Form1( )
        {
            InitializeComponent();

            cuadro = pictureBox1.CreateGraphics();
            tamañox = pictureBox1.Width;// ancho de mi picture box
            tamañoy = pictureBox1.Height;// largo de mi picture box
   
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            proyeccion.plano obj = new proyeccion.plano();// instancio el objeto
            obj.trazar(cuadro, LineaPlano, tamañox, tamañoy);// mando allmar al metodo trazar
        }
    }
}

Incluso, seria mejor, si tienes pensado agregar mas funcionalidad a la clase plano, eliminar el LineaPlano de la clase Form1, y pasarle al constructor de la clase plano el objeto cuadro.

Esto quedaria asi:

clase plano
Código: [Seleccionar]
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace proyeccion
{
    public class plano
    {
        // Definimos una variable local privada para
        // almacenar el cuadro
        private Graphics cuadro;
        // Aqui si necesitamos la pen, asi que la definimos
        private Pen LineaPlano = new Pen(Color.Black);
        public plano(Graphics cuadro)
        {
            // le pasamos el valor de cuadro a nuestra variable local
            this.cuadro = cuadro;
        }

        // Usar parametos para pasar los valores a la clase
        public void trazar(int tamañox, int tamañoy)
        {
            cuadro.DrawLine(LineaPlano, 0, tamañoy / 2, tamañox, tamañoy / 2);// trazo una linea

            int suma = tamañox + tamañoy;// la puse para ver si recibia los valores que le asigne en el form
            MessageBox.Show(suma.ToString());
        }
    }
}

clase Form1
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace proyeccion
{
    public partial class Form1 : Form
    {
        // No es necesario ponerlos estaticos, si se los
        // pasas a la clase como parametros
        public Graphics cuadro;
        public int tamañox = 0;
        public int tamañoy = 0;
        //  Eliminamos la pend e este codigo, ya que nunca la utilizamos aca
        // public Pen LineaPlano = new Pen(Color.Black);

        public Form1()
        {
            InitializeComponent();

            cuadro = pictureBox1.CreateGraphics();
            tamañox = pictureBox1.Width;// ancho de mi picture box
            tamañoy = pictureBox1.Height;// largo de mi picture box
   
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Le pasamos el objeto cuadro al contructor de la clase
            proyeccion.plano obj = new proyeccion.plano(cuadro);// instancio el objeto
            // Solo le pasamos las coordenadas
            obj.trazar(tamañox, tamañoy);// mando allmar al metodo trazar
        }
    }
}

Espero me hayas comprendido ahora.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

hiram000

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:problema con una clase
« Respuesta #4 en: Martes 7 de Mayo de 2013, 00:06 »
0
Muchas gracias por tomarte el tiempo para revisar el codigo, todavia no lo he checado, pero ya entendi algunas cosas, mas tarde que pueda hare lo que dices seguro asi queda   :gracias: