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