none
No se puede obtener acceso a una referencia de instancia y problema con delegado EventHandler RRS feed

  • Pregunta

  • Saludos amigos!

    Estamos trabajando con un equipo MEI CF 7000 para recibir pagos de monedas, el caso es que los demos que le acompañan son en VB .net, y estoy tratando de convertirlos a C# .net, y pues estoy con detalles, les dejo el código en VB.net y lo que hice para llevarlo a otro proyecto a C#.

    Código vb.net

    Imports VendingProV10
    
    
    Public Class Form1
    
    
        Dim amount As Double
    
        Dim WithEvents instace As New VendingMaster
    
        Dim DINERO_INGRESADO As Double
        Dim DINERO_EGRESADO As Double
        Dim CAMBIO_NO_DEVUELTO As Double
        Dim MONEDA_10P_DISPENSADA As Integer
        Dim MONEDA_5P_DISPENSADA As Integer
        Dim MONEDA_2P_DISPENSADA As Integer
        Dim MONEDA_1P_DISPENSADA As Integer
        Dim MONEDA_50cP_DISPENSADA As Integer
    
        Private Sub Test_Money(ByVal amount As Double) Handles instace.Cash_Recived
            DINERO_INGRESADO = amount
            Me.Invoke(New EventHandler(AddressOf Imprime_Dinero_Ingresado))
        End Sub
    
        Public Sub Imprime_Dinero_Ingresado()
            Label1.Text = FormatCurrency(DINERO_INGRESADO.ToString, , , TriState.True, TriState.True)
        End Sub
    
    
    
        Private Sub Test_Money(ByVal Cash_Disp As Double,
                                            ByVal Cash_Not_Disp As Double,
                                            ByVal COIN10P As Integer,
                                            ByVal COIN5P As Integer,
                                            ByVal COIN2P As Integer,
                                            ByVal COIN1P As Integer,
                                            ByVal COIN50cP As Integer) Handles instace.Coins_Dispensed
            DINERO_EGRESADO = Cash_Disp
            CAMBIO_NO_DEVUELTO = Cash_Not_Disp
            MONEDA_10P_DISPENSADA = COIN10P
            MONEDA_5P_DISPENSADA = COIN5P
            MONEDA_2P_DISPENSADA = COIN2P
            MONEDA_1P_DISPENSADA = COIN1P
            MONEDA_50cP_DISPENSADA = COIN50cP
            Me.Invoke(New EventHandler(AddressOf Imprime_Dinero_Egresado))
        End Sub
        Public Sub Imprime_Dinero_Egresado()
            Label2.Text = FormatCurrency(DINERO_EGRESADO.ToString, , , TriState.True, TriState.True)
            Label3.Text = FormatCurrency(CAMBIO_NO_DEVUELTO.ToString, , , TriState.True, TriState.True)
            Label4.Text = MONEDA_10P_DISPENSADA
            Label5.Text = MONEDA_5P_DISPENSADA
            Label6.Text = MONEDA_2P_DISPENSADA
            Label7.Text = MONEDA_1P_DISPENSADA
            Label8.Text = MONEDA_50cP_DISPENSADA
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim i As Integer
            For i = 0 To My.Computer.Ports.SerialPortNames.Count - 1
                ComboBox1.Items.Add(My.Computer.Ports.SerialPortNames(i))
            Next
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            VendingMaster.VendingEnable()
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            VendingMaster.VendingEnable()
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            MsgBox(VendingMaster.USB_Test())
        End Sub
    
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    
            Dim Cambio_A_Enviar As Double
    
            If TextBox1.Text <> "" Then
                Cambio_A_Enviar = CDbl(TextBox1.Text)
            Else
                Cambio_A_Enviar = 0
            End If
    
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 6 PUERTO DE TARJETA DESCONECTADO
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 5 then NO SE PUEDE DISPENSAR FRACCIONES DIFERENTES A .50 CENTAVOS
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 4 then NO SE PUEDE DISPENSAR MAS DE 250 PESOS
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 3 then CAMBIO DEBE DE SER MAYOR A 0
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 2 then ERROR EN LA OPERACIÓN 
            ' si VendingMaster.Send_Change_MDB(Cambio_A_Enviar) = 1 then CAMBIO SE ENVIO CORRECTAMENTE
    
            MsgBox(VendingMaster.Send_Change_MDB(Cambio_A_Enviar))
        End Sub
    
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            MsgBox(VendingMaster.SetVending(ComboBox1.SelectedItem.ToString))
        End Sub
    End Class
    

    El código arriba expuesto funciona bien... pero al emigrarlo tengo los siguientes detalles en lo que esta en negritas:

    using System;
    using System.Runtime.CompilerServices;
    using System.Windows.Forms;
    using VendingProV10;
    using System.IO.Ports;
    
    namespace MEIC
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private double amount;
    
            private VendingMaster _instace;
            private VendingMaster instace
            {
                [MethodImpl(MethodImplOptions.Synchronized)]
                get
                {
                    return _instace;
                }
                [MethodImpl(MethodImplOptions.Synchronized)]
                set
                {
                    if (_instace != null)
                    {
                        _instace.Cash_Recived -= Test_Money;
                        _instace.Coins_Dispensed -= Test_Money;
                    }
                    _instace = value;
                    if (_instace != null)
                    {
                        _instace.Cash_Recived += Test_Money;
                        _instace.Coins_Dispensed += Test_Money;
                    }
                }
            }
    
            private double DINERO_INGRESADO;
            private double DINERO_EGRESADO;
            private double CAMBIO_NO_DEVUELTO;
            private double MONEDA_10P_DISPENSADA;
            private double MONEDA_5P_DISPENSADA;
            private double MONEDA_2P_DISPENSADA;
            private double MONEDA_1P_DISPENSADA;
            private double MONEDA_50cP_DISPENSADA;
    
            private void Test_Money(Double amount)
            {
                DINERO_INGRESADO = amount;
                this.Invoke(new EventHandler(Imprime_Dinero_Ingresado));
            }
    
            public void Imprime_Dinero_Ingresado()
            {
                Label1.Text = String.Format(DINERO_INGRESADO.ToString(), UseParensForNegativeNumbers: TriState.True, GroupDigits: TriState.True);
            }
    
            private void Test_Money(double Cash_Disp, double Cash_Not_Disp, int COIN10P, int COIN5P, int COIN2P, int COIN1P, int COIN50cP)
            {
                DINERO_EGRESADO = Cash_Disp;
                CAMBIO_NO_DEVUELTO = Cash_Not_Disp;
                MONEDA_10P_DISPENSADA = COIN10P;
                MONEDA_5P_DISPENSADA = COIN5P;
                MONEDA_2P_DISPENSADA = COIN2P;
                MONEDA_1P_DISPENSADA = COIN1P;
                MONEDA_50cP_DISPENSADA = COIN50cP;
                this.Invoke(new EventHandler(Imprime_Dinero_Egresado));
            }
            public void Imprime_Dinero_Egresado()
            {
                Label2.Text = String.Format(DINERO_EGRESADO.ToString(), UseParensForNegativeNumbers: TriState.True, GroupDigits: TriState.True);
                Label3.Text = String.Format(CAMBIO_NO_DEVUELTO.ToString(), UseParensForNegativeNumbers: TriState.True, GroupDigits: TriState.True);
                Label4.Text = MONEDA_10P_DISPENSADA.ToString();
                Label5.Text = MONEDA_5P_DISPENSADA.ToString();
                Label6.Text = MONEDA_2P_DISPENSADA.ToString();
                Label7.Text = MONEDA_1P_DISPENSADA.ToString();
                Label8.Text = MONEDA_50cP_DISPENSADA.ToString();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string[] PuertosDisponibles = SerialPort.GetPortNames();
                foreach (string puerto_simple in PuertosDisponibles)
                {
                    ComboBox1.Items.Add(puerto_simple);
                }
            }
    
            private void Button1_Click(object sender, EventArgs e)
            {
                VendingMaster.VendingEnable();
            }
    
            private void Button2_Click(object sender, EventArgs e)
            {
                VendingMaster.VendingEnable();
            }
    
            private void Button3_Click(object sender, EventArgs e)
            {
                MessageBox.Show(VendingMaster.USB_Test().ToString());
            }
    
            private void Button4_Click(object sender, EventArgs e)
            {
                Double Cambio_A_Enviar;
                if (TextBox1.Text != "")
                {
                    Cambio_A_Enviar = Convert.ToDouble(TextBox1.Text);
                }
                else
                {
                    Cambio_A_Enviar = 0;
                }
                MessageBox.Show(VendingMaster.Send_Change_MDB(Cambio_A_Enviar));
            }
    
        }
        
    }
    

    Me indica

    Así como tambien este error:

    Agradeceria su orientación, muchisimas gracias...

    martes, 27 de agosto de 2019 20:19

Respuestas

  • hola

    Habria que analizar el codigo de  la clase VendingMaster ya que parece ser que no expones el handler

    Para que usas el Invoke() ? no aplicas ningun thread o similar, podrias invoxarlo directo

            private void Test_Money(Double amount)
            {
                DINERO_INGRESADO = amount;
                Imprime_Dinero_Ingresado();
            }
    

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator miércoles, 28 de agosto de 2019 16:03
    • Marcado como respuesta Marco Bueno miércoles, 28 de agosto de 2019 16:52
    martes, 27 de agosto de 2019 21:06

Todas las respuestas

  • hola

    Habria que analizar el codigo de  la clase VendingMaster ya que parece ser que no expones el handler

    Para que usas el Invoke() ? no aplicas ningun thread o similar, podrias invoxarlo directo

            private void Test_Money(Double amount)
            {
                DINERO_INGRESADO = amount;
                Imprime_Dinero_Ingresado();
            }
    

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator miércoles, 28 de agosto de 2019 16:03
    • Marcado como respuesta Marco Bueno miércoles, 28 de agosto de 2019 16:52
    martes, 27 de agosto de 2019 21:06
  • Saludos !

    Este es el namespace:


    using System;
    using System.IO.Ports;
    
    namespace VendingProV10
    {
        public class VendingMaster : EventArgs
        {
            public VendingMaster();
    
            public static SerialPort SerialPort1 { get; set; }
    
            public static event Cash_RecivedEventHandler Cash_Recived;
            public static event Coins_DispensedEventHandler Coins_Dispensed;
    
            public static string BytetoHex(byte[] comByte);
            public static void Processing_RX_Buffer(string displayChar);
            public static object Send_Change_MDB(double cambio);
            public static object SetVending(string PortName);
            public static object USB_Test();
            public static void VendingDisable();
            public static void VendingEnable();
    
            public delegate void Cash_RecivedEventHandler(double amount);
            public delegate void Coins_DispensedEventHandler(double Cash_Disp, double Cash_Not_Disp, int COIN10P, int COIN5P, int COIN2P, int COIN1P, int COIN50cP);
        }
    }

    Ya conseguí conectar con el MEI C7000, solo me queda por hacer la instancia a Cash_Recived y Coins_Dispensed... lo cual me controla la entrada de monedas y salida...

    Agradeceria cualquier orientación de como realizarlo... muchas gracias.



    • Editado Marco Bueno martes, 27 de agosto de 2019 21:58 Actualizacion de codigo
    martes, 27 de agosto de 2019 21:24