Laboratori d'Investigacions Linuxeres Avançades

Friday, August 12, 2005

Delegates en C#

Bueno, donat que a la feina ens aborrim estic programant una cutre-agenda en C# per anar aprenent. En la programació de l'agenda ha sorgit un petit problema. Passo a descriure l'escenari.

Tinc un formulari A que crida a un formulari B en el que es configuren coses i es vol que desde el formulari A es tingui accés a aquestes dades. Per fer això fins ara he descobert 3 opcions:

1) Omplir el codi de variables estàtiques. Mala opció, perquè és una guarrada.
2) Fer servir delegates.
3) Fer servir el showDialog();

Anem a explicar les opcions 2 i 3.

Els delegates són una forma de cridar a una funció d'una classe Y desde una classe X que, obviament, no té cap instància de cap objecte de la classe Y. La crida a aquesta funció es fa com si es fés des de la mateixa classe Y, amb el que es pot tenir accés a membres privats.

Suposo que hi ha més maneres ( i segurament més elegants ) de fer el que explicaré però de moment això és el que sé jo.

A la classe Y hem de definir el delegate. Per fer-ho inclourem el següent codi:
public delegate void delegatActualitzarVista();
public delegatActualitzarVista actualitzarVista;

Ara, al delegat actualitzarVista li podrem associar totes les funcions que vulguem, sempre que aquestes funcions retornin un void i no tinguin paràmetres. Podem definir els delegats que rebin i retornin el que vulguem. L'única restricció és que les funcions que li afegim tinguin el mateix prototipus (valor de retorn i paràmetres).

Ara ja podem associar funcions a aquest delegat. Per fer-ho podem anar a la classe X (on s'instanciava un objecte de la classe Y) i afegir el següent codi:

l_cContacte.actualitzarVista += new NouContacte.delegatActualitzarVista(actualitzar_vista);

Com es pot veure estem associant la funció de la nostra classe X anomenada actualitzar_vista al nostre delegat.

Molt bé, ara només queda fer la crida a la funció desde la classe Y. Per fer-ho nomes cal posar el següent codi dins d'alguna funció de la classe Y:

actualitzarVista();

Al fer això, automàticament es cridaran a les funcions que li haguem afegit al delegat. Magnífic!


L'última manera que ens han explicat (el Vicente dels forums d'stratos) és obrir el formulari de la classe Y desde la classe Z amb la funció ShowDialog enlloc de amb la funció Show. Fent això podem quedar-nos esperant en la nostra funció de la classe X a que es tanqui el dialog i retorni el OK. Aqui us pastejo el codi d'exemple que ha posat en Vicente:

Codi classe X:
EdicionClienteFrm formulario = new EdicionClienteFrm();
formulario.Inicializar();

formulario.Text = "Alta de Nuevo Cliente";

if (formulario.ShowDialog() == DialogResult.OK)
_Controlador.GuardarCliente(formulario.Cliente);

Codi classe Y:
private void btnAceptar_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
this.Close();
}

Bueno, espero que us serveixi algún dia o altre. Recordeu que això és per treballar amb WindowsForms, és a dir, en windows. Quan comencem a provar el mono ja us anirem explicant com es fa.

Fins aviat!

0 Comments:

Post a Comment

<< Home