Ayuda con delegados y objetos [C#]

Iniciado por Vaagish, 6 Mayo 2014, 20:06 PM

0 Miembros y 2 Visitantes están viendo este tema.

Vaagish

Hola, podría algún iluminado mostrarme el camino?

Código (csharp) [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;

using Servidor;

namespace Delegados
{
    public delegate void NuevaConexion();
       
    public partial class frmPrincipal : Form
    {
       
        SockMaster ObjetoServidor = new SockMaster();

        public frmPrincipal()
        {
            InitializeComponent();
            listView1.Items.Add("Nuevo item agregado"); // Aca si funciona, pero no es donde lo preciso...
        }
       
        public static void Server_NuevaConexion()
        {
            listView1.Items.Add("Nuevo item agregado"); // Aca no funciona, y es donde lo preciso!!!
            frmPrincipal.listView1.Items.Add("Nuevo item agregado"); // No funciona, no es visible el control...
        }

    }
}

namespace Servidor
{
    using Delegados;

    class SockMaster
    {
        public SockMaster()
        {           
            // Genero el evento Nueva conexion               
            NuevaConexion NC = frmPrincipal.Server_NuevaConexion;
            NC();
        }
       
    }
}


El error es:
CitarSe 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!

El Benjo

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 (csharp) [Seleccionar]
NuevaConexion NC = frmPrincipal.Server_NuevaConexion;

Por algo así como:

Código (csharp) [Seleccionar]
frmPrincipal Formulario = new frmPrincipal();
NuevaConexion NC = Formulario.Server_NuevaConexion;


Dinos si eso te funciona. Saludos.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Vaagish

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.

CitarDinos 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!

El Benjo

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://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Vaagish

#4
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 (csharp) [Seleccionar]
        public static void Server_NuevaConexion()
        {
         Aca no puedo acceder al listview1, siquiera sale en la venta de ayuda...
        }


No se que pasa..  :rolleyes:

El Benjo

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
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Vaagish

CitarInsertar 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!

El Benjo

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
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Vaagish

CitarNo 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!!

El Benjo

Pues es una lástima que no hayamos podido resolver tu problema. Suerte. :)
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.