none
Duda sobre la llamada de métodos. RRS feed

  • Pregunta

  • ¡Hola a todos!

    Voy a poneros en la situación en la que me encuentro: Tengo un Windows Form (llamado Form1) y dos clases .cs (ColorC y ScreenC). Principalmente lo que quiero es cambiar el color de fondo de ScreenC a través de ColorC dando a un objeto Button de Form1. Lo detallo:

    - Form1.cs: Windows Form en el cual tengo un botón y llama directamente a la clase ColorC.

    - ColorC.cs: Clase alternativa donde aplico los métodos, condiciones, Gets y Sets, etc. necesarios para cambiar de color de fondo a ScreenC. Se abre desde aquí un ColorDialog y, el color elegido, será el aplicable a ScreenC.

    - ScreenC.cs: Clase donde se crea (a través de código) un Windows Form con el color de fondo elegido a través de ColorC.

    Bien, tengo prácticamente todo el código hecho, pero mi principal problema es llamar a los métodos de cada uno, ya que:

    En Form1 puedo escribir un ColorC c = new ColorC(); y crea un nuevo objeto que va a ColorC. Desgraciadamente, no puedo crear un nuevo ScreenC (ScreenC s = new ScreenC();) ya que no puedo manejarlo así, sino que tengo que ir a uno de los métodos Get de ColorC. El problema es que si en la clase ScreenC escribo ColorC c = new ColorC(); crea una clase nueva, y no puedo acceder al color elegido en Form1, y es totalmente necesario acceder al Get (o cualquier otra forma de hacerlo) desde el ScreenC.cs

    Resumiendo, a través de la clase ScreenC, ¿cómo accedo al color elegido en ColorC a través de Form1?

    Espero haberme explicado bien. Muchas gracias. Un saludo.

    sábado, 7 de julio de 2012 22:58

Respuestas

  • ¿es posible tener herencia múltiple en C#?

    no eso no se puede, pero si podrias armar una cascada de herencia

    public class Base{

    }

    public class Class1: Base{

    }

    public class Class2 : Class1{

    }

    en este caso class2 tambien tendra la funcionalidad de base t clas1 juntas


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP domingo, 8 de julio de 2012 21:35
    • Marcado como respuesta V_Light domingo, 8 de julio de 2012 23:11
    domingo, 8 de julio de 2012 21:35

Todas las respuestas

  • esta parte "sino que tengo que ir a uno de los métodos Get de ColorC" no la entendi

    que es eso de la propiedad ?


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 7 de julio de 2012 23:03
  • que pasa si en ColorC usas

    private ScreenC s = null;
    
    public ScreenC screen{
    
        get{
               if(s== null){
                    s= new ScreenC();
               }
               return s;
        }
    
    }


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 7 de julio de 2012 23:05
  • Ya que quiero obtener el color obtenido en ColorC a través de Form1, hice un método Get (GetColor) en ColorC para que me devolviese el color elegido y asignárselo a ScreenC. El problema es que tengo que crear un nuevo objeto de la clase(ColorC c = new ColorC();) y, entonces, si llamo a GetColor, no me devuelve el color elegido a través de Form1, sino que el valor sería nulo...

    Lo siento por la confusión. Espero haberlo aclarado mejor así... muchas gracias.

    sábado, 7 de julio de 2012 23:08
  • Pensé en eso, pero parece ser que obligatoriamente tengo que obtener el color a través de ScreenC, y no en ColorC...

    ¡¡Sin embargo muchas gracias!!

    • Editado V_Light sábado, 7 de julio de 2012 23:11
    sábado, 7 de julio de 2012 23:11
  • pero parece ser que obligatoriamente tengo que obtener el color a través de ScreenC,

    no entendi


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 8 de julio de 2012 0:32
  • Pondré directamente el código que tengo e intentaré explicarme mejor (lo siento por la confusión):

    Código de Form1 (Windows Form):

    // Form1 tiene un ColorDialog, llamado colorDialog

    private void buttonScreen_Click(object sender, EventArgs e)
    
    {
       // Código donde llamo a ScreenC
       ScreenC s = new ScreenC();
       s.ShowForm();
    }
    
    private void buttonColor_Click(object sender, EventArgs e)
    {
       // Código donde llamo a colorDialog y aplico el color
       // de fondo a ScreenC
       ColorC c = new ColorC();
       c.ChangeColor(colorDialog);
    }

    Código de ColorC.cs (Clase).

    // Código donde llamo a colorDialog y se asigna dicho color elegido:

    private Color color;
    public ColorC()
    {
       color = new Color();
    }
    
    public void ChangeColor(ColorDialog colorDialog)
    {
       // Código donde se asigna el color elegido de 
       // ColorDialog
       if(colorDialog.ShowDialog() == DialogResult.OK)
       {
          color = colorDialog.Color;
       }
    }
    
    public Color GetColor()
    {
       // Código que devuelve el color asignado
       return color;
    {

    Código de ScreenC.cs (Clase):

    // He aquí mi problema. Esta es la clase donde se crea un nuevo Windows Form, y en esta clase es donde quiero cambiar el color de fondo elegido

    // en Form1, y para hacer eso tengo que hacerlo en esta clase:

    public void ShowForm()
    {
       Form newForm = new Form();
       c.Show();
       // ColorC c = new ColorC(); 
       // c.c.GetColor();
       // De esta manera no cargo el color elegido en Form1,
       // y no se como hacerlo desde esta clase.
    }

    Espero haberlo aclarado ahora... ¡muchas gracias!

    domingo, 8 de julio de 2012 10:20
  • pero este ScreenC  es una clase o es un formulario ?

    poprque si en el Form1 en una accion instancias a ScreenC y en otra distinta instancia a ColorC , como es qu relacionas o mejor dicho como accedes a la misma instancia en dos acciones distintas

    recuerda que cada vez que usas el new para crear un objeto este es nuevo, o sea no tiene relacion con otro que hayas creado, por lo que asignes alli no tendra efecto con los demas

    si creas una instancia con el new de ScreenC en Form1 y luego creas otra distinta de ScreenC  en ColorC seran dos forma diferentes

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 8 de julio de 2012 14:14
  • recuerda que cada vez que usas el new para crear un objeto este es nuevo, o sea no tiene relacion con otro que hayas creado, por lo que asignes alli no tendra efecto con los demas

    si creas una instancia con el new de ScreenC en Form1 y luego creas otra distinta de ScreenC  en ColorC seran dos forma diferentes

    Ese es justamente mi principal problema: cuando uso el new creo un objeto nuevo, y yo quiero uno que ya está creado, o ejecutándose (como es el caso de Form1). Primero se ejecuta Form1, con un botón llamo a la clase ColorC y, mediante otro botón, cuando llamo a ScreenC, que se ponga con el color que haya elegido previamente en ColorC. Si lo hago con new se que creo un objeto nuevo y ese es el problema, que no se como crear un objeto sin ser nuevo, sino con el que haya elegido en Form1...

    P.D. ScreenC es una clase

    ¡Muchas gracias!

    domingo, 8 de julio de 2012 19:51
  • pero si la secuencia es

    Form1 -> ColorC -> ScreenC

    entonces porque no pasas el valor seleccionado del form ColorC a ScreenC, o sea no necesitas otra instancia pasas el valor

    [WinForms] Pasaje de información formulario hijo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 8 de julio de 2012 19:58
  • También pensé en eso y aquí me surgió esta pregunta: ¿es posible tener herencia múltiple en C#? (es decir, tener dos clases padres de las que heredar) Es que ScreenC ya está heredando de otra clase padre...

    Lo siento por el lio en serio...

    domingo, 8 de julio de 2012 20:06
  • ¿es posible tener herencia múltiple en C#?

    no eso no se puede, pero si podrias armar una cascada de herencia

    public class Base{

    }

    public class Class1: Base{

    }

    public class Class2 : Class1{

    }

    en este caso class2 tambien tendra la funcionalidad de base t clas1 juntas


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP domingo, 8 de julio de 2012 21:35
    • Marcado como respuesta V_Light domingo, 8 de julio de 2012 23:11
    domingo, 8 de julio de 2012 21:35
  • Tengo que decir que realmente has solucionado mi pregunta, aunque aún no me haya funcionado, con lo cual debe de ser fallo totalmente mío. No se si he de inicializar algo en alguna clase o que, pero tengo que revisarlo.

    ¡Muchas gracias!

    domingo, 8 de julio de 2012 23:11