carlosmunozledesma
2/11/2020 - 12:27 PM

Delegados

Cómo pasar una función como parámetro sabiendo el tipo de parámetros que tiene esa función para que no falle. Tenemos 2 clases. Una que pasa la función que ya está creada y otra clase que llamará a esa función que se pasa como parámetro pero que no sabe nada más. Para más información de delegados mirar los 3 videos siguientes: https://www.youtube.com/watch?v=GQbJH6HRenE https://www.youtube.com/watch?v=g0urRI85JQ0 https://www.youtube.com/watch?v=vyqqg-U-an8

// Función que hay creada pero que no se puede acceder realmente desde la ejecución del objeto, en este caso proque se encuentra en otro proyecto y no puede haber referencias cíclicas
public static void AvisoVehiculo(Silme.Nucleo.Data.NucVehiculo Vehiculo)
        {...}

// Clase FormVehiculo que tiene que llamar a esa función pero hay que utilizar un delegado porque sino no puede llegar a la función
// Creamos el tipo de función que nos mandarán usando el delegado
public delegate void Delegado(Silme.Nucleo.Data.NucVehiculo veh);
// Objeto de tipo Delegado creado anteriormente
private Delegado d;
// Se añade la función para guardar el método que pasen mediante el delegado en el atributo d
public void AdicionaDelegado(Delegado pMetodo)
{
    d = pMetodo;
}
// Función que utilizará el delegado d
private void textEdit1_Leave(object sender, EventArgs e)
{
    MessageBox.Show("Entra");
    bindingXPO.EndEdit();
    var Veh = (Silme.Nucleo.Data.NucVehiculo)bindingXPO.Current;
    if (Veh != null)
    {
        MessageBox.Show("Entra veh");
        // Al llamar a d con el parámetro pertinente es igual a llamar la función que se pasa en el delegado
        d(Veh);
    }
}
// Añadir en el designer del formulario
this.textEdit1.Leave += new System.EventHandler(this.textEdit1_Leave);

// Parte del código que crea un objeto, le añade la función y se la pasa como parámetro
Silme.Nucleo.Forms.FormVehiculo fVeh = new Silme.Nucleo.Forms.FormVehiculo();
fVeh.AdicionaDelegado(new Silme.Nucleo.Forms.FormVehiculo.Delegado(PoliciaXPO.Forms.Utils.AvisoVehiculo));
fVeh.Show();