Fórum Sharpgames
 
 
  Forum  Criação de Jogo...  Geral  [C#]Delegates & Eventos
Anterior Anterior
 
Próximo Próximo
Nova Entrada 26/4/2009 13:05
  dani piresk
5 tópicos
Sem Ranking


[C#]Delegates & Eventos 
Modificado Por dani piresk  em 26/4/2009 11:06:20)
Olá galera estou em dúvida de como utilizar delegates e events em c#.
Segue minha classe de testes, com sockets.

using System.Net.Sockets;
using System;
using System.Net;
using System.Windows.Forms;
using System.IO;
using System.Text;

class SockCliente
{
    Socket sock;
    IAsyncResult sincronismo;
    AsyncCallback sincronismocall;

    byte[] bufferEnvio;
    byte[] bufferRecibo = new byte[1024];

    public delegate void SockDelegate(string texto);
    public event SockDelegate ReceberTexto;

    public SockCliente(string ip, int porta)
    {
        try
        {
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipa = IPAddress.Parse(ip);
            EndPoint cip = new IPEndPoint(ipa, porta);
            sock.BeginConnect(cip, new AsyncCallback(ConfirmaConexao), sock);
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }

    private void ConfirmaConexao(IAsyncResult syn)
    {
        try
        {
            sincronismo = syn;

            if (bufferEnvio != null)
            {
                sock.Send(bufferEnvio);
                bufferEnvio = null;
            }

            EsperarDados();
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }

    public void EnviarTexto(string texto)
    {
        try
        {
            ASCIIEncoding asen = new ASCIIEncoding();
            bufferEnvio = asen.GetBytes(texto);
            ConfirmaConexao(sincronismo);
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }

    private void EsperarDados()
    {
        try
        {
            if (sincronismocall == null) sincronismocall = new AsyncCallback(ReceberDados);
            sock.BeginReceive(bufferRecibo, 0, bufferRecibo.Length, SocketFlags.None, sincronismocall, null);
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }

    private void ReceberDados(IAsyncResult asyn)
    {
        try
        {
            if (ReceberTexto != null) ReceberTexto("teste recibo");
            EsperarDados();
            //MessageBox.Show("debug ReceberDados()");
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }

    public void Desconectar()
    {
        try
        {
            sock.EndConnect(sincronismo);
            sock.Disconnect(true);
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.ToString());
        }
    }
}

Agora como crio o callback ReceberDados?
Tentei assim:

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        SockCliente socket;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            socket = new SockCliente("127.0.0.1", 8080);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            socket.EnviarTexto("lol");
        }

        public void ReceberTexto(string texto)
        {
            MessageBox.Show("debug ReceberDados()");
            MessageBox.Show(texto);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            socket.Desconectar();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            socket.EnviarTexto("teste1");
        }
    }
}

Mas não funcionou....
Valeu.
 
Nova Entrada 26/4/2009 13:46
  lucianoJose
194 tópicos
Iniciante


Re: [C#]Delegates & Eventos 

Oi dani, eu sugiro você dá uma estudada neste simples exemplo abaixo. O ideal é conseguir aprender algo partindo do mais simples.

namespace MyTests
{
    public class MyTest
    {
        public delegate void SockDelegate(string texto);
 
        public event SockDelegate RecebeTexto;
       
        private string text;
 
        public string Text
        {
            get { return text; }
 
            set
            {
                this.text = value;
 
                if (this.RecebeTexto != null)
                {
                    this.RecebeTexto(this.text);
                }
            }
        }
    }
 
    class Program
    {
 
        static void Main(string[] args)
        {
            MyTest test1 = new MyTest();
         
            test1.RecebeTexto += new MyTest.SockDelegate(test1_RecebeTexto);
 
            test1.Text = "'My Test 1";
        }
 
        static void test1_RecebeTexto(string texto)
        {
           
        }
    }
}

Eu chamo atenção a esta linha de código:

test1.RecebeTexto += new MyTest.SockDelegate(test1_RecebeTexto);

Você fez assinatura ao seu evento em algum momento? Quando a assinatura é feita, no nosso caso, o método test1_RecebeTexto, é chamado quando o evento é invocado.

Sugestão: Crie uma Console Application e rode esse exemplo que eu te passei. No mais, fique a vontade em indagar!

abraços

Administrador do SharpGames.
 
Nova Entrada 26/4/2009 14:09
  dani piresk
5 tópicos
Sem Ranking


Re: [C#]Delegates & Eventos 
Modificado Por dani piresk  em 26/4/2009 12:17:43)
Hm, certo entendi o meu erro, foi na assinatura.
Mas tem como essa assinatura ser feita automaticamente quando eu crio a class?
Nessa parte: test1.RecebeTexto += new MyTest.SockDelegate(test1_RecebeTexto);
test1_RecebeTexto eu posso passar como parametro?
Tipo public object ReceberDadosCall;
Ae lá eu coloco socket.ReceberDadosCall = ReceberTexto;
Posso fazer assim?
Valeu.
 
Nova Entrada 26/4/2009 14:20
  lucianoJose
194 tópicos
Iniciante


Re: [C#]Delegates & Eventos 
Modificado Por lucianoJose  em 26/4/2009 12:22:06)
 dani piresk escreveu
Hm, certo entendi o meu erro, foi na assinatura.
Mas tem como essa assinatura ser feita automaticamente quando eu crio a class?
Nessa parte: test1.RecebeTexto += new MyTest.SockDelegate(test1_RecebeTexto);
test1_RecebeTexto eu posso passar como parametro?
Tipo public object ReceberDadosCall;
Ae lá eu coloco socket.ReceberDadosCall = ReceberTexto;
Posso fazer assim?
Valeu.


Eu alterei o nosso exemplo para passar o "ponteiro para função" via parametro do construtor(observe as modificações em amarelo):

namespace MyTests
{
    public class MyTest
    {
        public delegate void SockDelegate(string texto);
 
        public event SockDelegate RecebeTexto;
       
        private string text;
 
        public MyTest(SockDelegate sock)
        {
            this.RecebeTexto += sock;  
        }
 
        public string Text
        {
            get { return text; }
 
            set
            {
                this.text = value;
 
                if (this.RecebeTexto != null)
                {
                    this.RecebeTexto(this.text);
                }
            }
        }
    }
 
    class Program
    {
 
        static void Main(string[] args)
        {
            MyTest test1 = new MyTest(test1_RecebeTexto);
         
            //test1.RecebeTexto += new MyTest.SockDelegate(test1_RecebeTexto);
 
            test1.Text = "'My Test 1";
        }
 
        static void test1_RecebeTexto(string texto)
        {
           
        }
    }
}

Administrador do SharpGames.
 
Nova Entrada 26/4/2009 14:34
  dani piresk
5 tópicos
Sem Ranking


Re: [C#]Delegates & Eventos 
Valeu Luciano, consegui implementar como eu queria aqui.
 
Anterior Anterior
 
Próximo Próximo
  Forum  Criação de Jogo...  Geral  [C#]Delegates & Eventos
Novatec
Promoção Novatec
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso