• Domingo 22 de Diciembre de 2024, 15:23

Autor Tema:  Problemas Static C#  (Leído 3370 veces)

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Problemas Static C#
« en: Jueves 15 de Febrero de 2007, 21:31 »
0
Estoy desarrollando una aplicacion, donde se comunican varios Form y clases entre ellos. Para eso es necesario declarar funciones del tipo "static" para poder accederlas desde las otras clases y forms.

Todo va bien, hasta que declaro algun windows.Forms de forma "Static". Al generar, algunas veces se me borraron parte de estos códigos en el Form.Designer y cuando los ingresaba de forma manual, y funcionaba bien, pero por ejemplo, tengo textbox, button y label que cuando los modifico desde otra clase simplemente no responden(ademas de borrarse del diseñador), por ejemplo:

Form.label.Enabled = true; En un form

Y en la clase  Form.label.Enabled = false;

Pero funciona unas 3 veces y despues no lo vuelve a ejecutar.

Que podrá ser?, hay alguna alternativa a los miembros static?.

Pense en funciones, pero las static no permiten el trabajo de la siguiente manera:

this.label.Enabled = true;

Que hago?

Gracias.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problemas Static C#
« Respuesta #1 en: Viernes 16 de Febrero de 2007, 04:28 »
0
Lo primero es que usar una clase con miembros static nada mas para comunicar datos e una clase a otra evidencia una falencia de diseño en tu aplicación asi que lo primero que hay que hacer es replantear la forma en que estas abordando las cosas.

Lo segundo es que si lo que vas a hacer es comunicación entre aplicaciones ( o digamos entre procesos) mas que comunicación entre clases lo ideal es que uses los miembros del namespace System.Remoting.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Problemas Static C#
« Respuesta #2 en: Viernes 16 de Febrero de 2007, 15:33 »
0
De que otra forma puedo abordar el problema, hay alguna alternativa a los static?
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problemas Static C#
« Respuesta #3 en: Viernes 16 de Febrero de 2007, 16:02 »
0
Claro,
en condiciones ideales - normales debes manejar referencias a los objetos, es decir si el objeto uno es:

Código: Text
  1. class A
  2. {
  3.     public TextBox t;
  4.     ...
  5.     ...
  6. }
  7.  
  8. class B
  9. {
  10.     public TextBox tRemoto;
  11.     ...
  12.     ...
  13. }
  14.  
  15. ...
  16. ...
  17. A objetoA = new A();
  18. B objetoB = new B();
  19.  
  20. objetoB.tRemoto = objetoA.t;
  21.  


En un caso mucho mas elaborado y funcional, puedes montar un esquema con base a registro y uso de servicios, para lo cual mi recomendacion es que crees una clase que funcione a manera de Service Provider y que tenga metodos para obtener el servicio que buscas:

Código: Text
  1. static class ServiceProvider
  2. {
  3.     //Algun tipo de dato diccionario o una implementación tuya para tal fin
  4.     ArrayListIndexed servicios;
  5.  
  6.     public static object GetService(string tipoServicio)
  7.     {
  8.           if(tipoServicio == "TextBoxA")
  9.               return Servicios["TextBoxA"];
  10.      }    
  11.  
  12.     public static void RegisterService(string tipoServicio, object service)
  13.     {
  14.             servicios.Add(tipoServicio, service);
  15.      }    
  16.     ...
  17.     ...
  18. }
  19.  
  20.  
  21.  
  22. class A
  23. {
  24.     public TextBox t;
  25.     ...
  26.     ...
  27. }
  28.  
  29. class B
  30. {
  31.     public TextBox tRemoto;
  32.     ...
  33.     ...
  34.     tRemoto = (TextBox)ServiceProvider.GetService("TextBoxA");
  35. }
  36.  
  37. ...
  38. ...
  39.  
  40.  

Puedes hacerlo tan complejo y funcional como lo requieras o tengas tiempo para hacerlo, incluso una implementación mas compleja podría usar Generics en los metodos etc.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Problemas Static C#
« Respuesta #4 en: Viernes 16 de Febrero de 2007, 16:41 »
0
Es que el problema no es tan asi...

Por ejemplo:

class A //Con esto me refiero a otro archivo del mismo programa
{
   public TextBox t;
   ...
   ...
}

class B //Desde aca asignarle un valor a t
{
   t.text = "Soy otra clase en otro archivo.cs dentro del mismo proyecto.";
   ...
   ...
}

Eso es lo que quiero hacer y por eso uso miembros static
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problemas Static C#
« Respuesta #5 en: Viernes 16 de Febrero de 2007, 16:47 »
0
claro eso esta muy claro y por eso todo lo que te dije funciona. Revisalo bien si te quedan dudas te explico el porque funciona.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Problemas Static C#
« Respuesta #6 en: Viernes 16 de Febrero de 2007, 16:55 »
0
Me quedan dudas de la implementacion...

Me lo puedes explicar en detalle o un ejemplo funcional para un label cualquiera.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problemas Static C#
« Respuesta #7 en: Viernes 16 de Febrero de 2007, 18:16 »
0
Código: Text
  1. class A
  2. {
  3.    public TextBox t;
  4.    ...
  5.    ...
  6.    public A()
  7.    {
  8.        t = new TextBox();
  9.     }
  10. }
  11.  
  12. class B
  13. {
  14.    public TextBox tRemoto;
  15.    ...
  16.    ...
  17.    public B()
  18.    {
  19.    }
  20. }
  21.  
  22. class aplicacion
  23. {
  24.    int Main()
  25.    {
  26.       A objetoA = new A();
  27.       B objetoB = new B();
  28.  
  29.       objetoB.tRemoto = objetoA.t;
  30.     }
  31. ...
  32. ...
  33. }
  34.  

En el ejemplo anterior basicamente se creo una clas A y una clase B, existe una tercera clase que ya es la aplicacion.

En el main de la aplicacion se crea un objeto de tipo A y otro de tipo B.

el constructor de A crea instancia el objeto t que es de tipo textbox mientras que el constructir de B no hace nada.

Ya una vez inicializados los objetos se hace:

      objetoB.tRemoto = objetoA.t;

Recuerda que objetoB.tRemoto es un objeto sin instanciar porque tal como vimos en el constructor de B no se hace nada, mientras que objetoA.t ya fue instanciado; Las clases son tipos de referencia por lo cual cuando asigno una clase a otra lo que estoy haciendo no es copiar el objeto sino copiar la referencia al objeto por tanto

      objetoB.tRemoto = objetoA.t;

lo que hace es que objetoB.tRemoto y  objetoA.t queden apuntando al mismo objeto en memoria aunque son 'variables ' de clases diferentes, de esta forma todo cambio hecho a objetoA.t se ve de inmediato en objetoB.tRemoto puesto que estan referenciando el mismo objeto en memoria.

Te anexo una aplicación que es una curiosidad nada mas... pero que hace uso de eso.

si te fijas en la aplicacion anexa se crean dos instancias de la misma clase pero despues de crear la instancia se asignan los texbox intercaladamente, es decir el textbox de un objeto se asigna al 'textbox remoto' del otro objeto y viceversa, el resultado es que al escribir en el textbox de un objeto el texto se refleja automaticamente en el textbox remoto del otro objeto ya que ambos apuntan al mismo textbox en memoria.

Espero que haya quedado claro... anexo ejemplo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Problemas Static C#
« Respuesta #8 en: Viernes 16 de Febrero de 2007, 18:21 »
0
Muchisimas gracias por la extensa explicion, ya corri el programa de muestra y es muy parecido a lo que necesito.

Muchas gracias, vere el codigo ahora y te cuento despues como me fue...

Vale.

Aunque se esta trabajando en una sola clase o form.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]