Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Vaagish en 6 Mayo 2014, 20:06 pm



Título: Ayuda con delegados y objetos [C#]
Publicado por: Vaagish en 6 Mayo 2014, 20:06 pm
Hola, podría algún iluminado mostrarme el camino?

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. using Servidor;
  11.  
  12. namespace Delegados
  13. {
  14.    public delegate void NuevaConexion();
  15.  
  16.    public partial class frmPrincipal : Form
  17.    {
  18.  
  19.        SockMaster ObjetoServidor = new SockMaster();
  20.  
  21.        public frmPrincipal()
  22.        {
  23.            InitializeComponent();
  24.            listView1.Items.Add("Nuevo item agregado"); // Aca si funciona, pero no es donde lo preciso...
  25.        }
  26.  
  27.        public static void Server_NuevaConexion()
  28.        {
  29.            listView1.Items.Add("Nuevo item agregado"); // Aca no funciona, y es donde lo preciso!!!
  30.            frmPrincipal.listView1.Items.Add("Nuevo item agregado"); // No funciona, no es visible el control...
  31.        }
  32.  
  33.    }
  34. }
  35.  
  36. namespace Servidor
  37. {
  38.    using Delegados;
  39.  
  40.    class SockMaster
  41.    {
  42.        public SockMaster()
  43.        {            
  44.            // Genero el evento Nueva conexion                
  45.            NuevaConexion NC = frmPrincipal.Server_NuevaConexion;
  46.            NC();
  47.        }
  48.  
  49.    }
  50. }

El error es:
Citar
Se requiere una referencia de objeto para el campo, método o propiedad no estáticos 'Delegados.frmPrincipal.listView1'

No se que hago mal, o como solucionarlo.. le di mil vueltas y nada, si no sale un error acá, sale un error allá..

Gracias! Saludos!


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: El Benjo en 6 Mayo 2014, 21:53 pm
Creo que eso te ocurre porque no estás haciendo referencia a un objeto de Tipo "frmPrincipal" sino a la clase. Es decir, primero tienes que declarar un objeto de Tipo "frmPrincipal" y cambiar la línea:

Código
  1. NuevaConexion NC = frmPrincipal.Server_NuevaConexion;

Por algo así como:

Código
  1. frmPrincipal Formulario = new frmPrincipal();
  2. NuevaConexion NC = Formulario.Server_NuevaConexion;

Dinos si eso te funciona. Saludos.


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: Vaagish en 6 Mayo 2014, 22:44 pm
Perdón, me falto aclarar algo,, yo consigo invocar el evento.. lo que no puedo es acceder al listview1.

La cosa seria asi:
Tengo una clase que pone un puerto a la escucha de clientes, cuando se conecta un nuevo cliente, crea un hilo y lo pone en una lista, o sea permite multiconexion. Esa clase funciona bien. Yo quiero agregar al usuario en un listview que esta en el formulario, no consigo acceder al listview ni con delegados.

Citar
Dinos si eso te funciona. Saludos.
No puedo crear una nueva instancia de la clase porque me genera problemas con la clase "Socket", digamos, al crear un new frmPrincipal, tambien se crea una nueva de Socket y crash.

Saludos!


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: El Benjo en 7 Mayo 2014, 06:27 am
Ah, pues por ahí debiste empezar. La próxima vez que postees un error escribe lo que te dice el debuger, para que nosotros podamos entender de qué va exactamente. También era muy importante que mencionaras que intentas acceder al listbox desde un hilo distinto.

Lo que tienes que hacer es verificar la propiedad invokerequired del listbox antes de intentar modificarlo. Si la propiedad te da verdadero usas el método this.invoke(); para que se modifiquen los datos dentro del mismo hilo donde se creo la aplicación.

Te paso dos enlaces en donde se explica cómo hacer esto:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/296f8e39-fa62-4540-942a-26a53da0896a/threading-invokerequired (http://social.msdn.microsoft.com/Forums/vstudio/en-US/296f8e39-fa62-4540-942a-26a53da0896a/threading-invokerequired)

http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm (http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm)


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: Vaagish en 7 Mayo 2014, 16:39 pm
Hola! En este momento no puedo probar,, en un rato confirmo si funciono.. pero me parece que el problema no es ese.. eso lo había visto en vb sobre manipular objetos desde otros hilos..
Me dice que el método estático no se que cosa.. El error del compilador lo puse ahí abajo de la negrita..

Saludos! Gracias!



Actualización:
Código
  1.        public static void Server_NuevaConexion()
  2.        {
  3.         Aca no puedo acceder al listview1, siquiera sale en la venta de ayuda...
  4.        }

No se que pasa..  :rolleyes:


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: El Benjo en 7 Mayo 2014, 19:38 pm
Tienes razón el problema parece ser otro. Disculpa, me dejé guiar por lo que son los errores comunes en vez de ir por lo más obvio o sencillo, pues me parece que tu problema se debe a la forma en que se declara el listview. Debes hacerlo público y estático para que sea accesible desde cualquier parte de tu proyecto.

Espero que con eso se solucione.  ;D


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: Vaagish en 7 Mayo 2014, 19:51 pm
Citar
Insertar Cita
Tienes razón el problema parece ser otro. Disculpa, me dejé guiar por lo que son los errores comunes en vez de ir por lo más obvio o sencillo, pues me parece que tu problema se debe a la forma en que se declara el listview. Debes hacerlo público y estático para que sea accesible desde cualquier parte de tu proyecto.

Ahi esta!! Estamos cerca del problema ahora!! jeje Como declaro ese listview con esas propiedades desde la ventana de diseño?? O lo creo con código? Capaz es mas fácil crearlo con código..

Gracias Benjo!


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: El Benjo en 7 Mayo 2014, 20:58 pm
No es necesario que lo hagas con código. En el diseñador sólo tienes que modificar la propiedad "Modifiers" y ponerla como "Public". Aunque existe otra manera que te recomiendo más, y que puedes utilizar en caso de que la forma anterior te cause algún problema. Puedes declarar un método público dentro del formulario al que llames desde el thread. En este método agregas el código que modifique el listview. De esta manera no tienes que hacerlo público.

Un saludo y espero que ahora sí se solucione. XD


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: Vaagish en 7 Mayo 2014, 22:44 pm
Citar
No es necesario que lo hagas con código. En el diseñador sólo tienes que modificar la propiedad "Modifiers" y ponerla como "Public". Aunque existe otra manera que te recomiendo más, y que puedes utilizar en caso de que la forma anterior te cause algún problema. Puedes declarar un método público dentro del formulario al que llames desde el thread. En este método agregas el código que modifique el listview. De esta manera no tienes que hacerlo público.

Nop, ni una ni otra.. Mejor me replanteo el diseño de la clase y listo.. 3 días para manejar un fuck*** listview.. por eso odio todo lo relacionado a objetos.. a mi dejame con la programación orientada a procedimientos..

Saludos! Gracias!!


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: El Benjo en 8 Mayo 2014, 05:44 am
Pues es una lástima que no hayamos podido resolver tu problema. Suerte. :)


Título: Re: Ayuda con delegados y objetos [C#]
Publicado por: samuelhm en 24 Mayo 2014, 21:10 pm
yo tube un problema parecido, lo solucione mas o menos así:


label1.Invoke(new Action(() =>{ label1.Text = Line; }));

cambia label por tu control, y lo que quieras modificar dentro de los corchetes de Action.