¿Cómo se llama una función en VB .net?

Iniciado por Meta, 21 Marzo 2017, 07:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Haciendo pruebas ya que en VB .net no entiendo mucho. Tengo esta función tonta sin parámetros.

Código (vbnet) [Seleccionar]
Sub Mensaje1()
            Console.WriteLine()
            Console.WriteLine("Creando archivo al disco duro...")
        End Sub


Lo he intentado llamar directamete así y no funciona.
Código (vbnet) [Seleccionar]
mensaje1()

No sirve.

¿Cómo se le llama?

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

engel lex

eso no es una funcion, es un evento... tienes que llamarla con call si no me equivoco, intenta con un tutorial de vb.net o espera a que llegue alguien con experiencia en esto y te explique
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#2
Para aclarar las cosas:
No es una función ni tampoco un evento, sino un método... Sub sería el equivalente a void en C# (un bloque de código que no devuelve un valor de retorno).

En VB.NET no se utiliza la sentencia Call para nada, eso es de VB. Cabe mencionar que también se puede utilizar en VB.NET, pero si existe es solo por motivos de compatibilidad. Nadie lo usa.




Cita de: Meta en 21 Marzo 2017, 07:37 AMLo he intentado llamar directamete así y no funciona.
Código (vbnet) [Seleccionar]
mensaje1()

No sirve.

Lo estás llamando correctamente. El problema probablemente sea que la clase donde declaraste ese método tenga un nivel de acceso inferior a la clase desde donde lo estés intentando llamar, o que no hayas instanciado la clase donde declaraste dicho método. Corrije el nivel de visibilidad del método y/o de la clase (ej. Public Shared Sub MiMetodo()).

De todas formas no somos adivinos, no sé que significa "no funciona" o "no sirve". Muestra el mensaje de error por lo menos. Esto ya deberías tenerlo más que presente como usuario habitual del foro de programación, proporciona los detalles necesarios. Muestra la definición de la clase o del módulo donde tengas declarado ese método.

EDITO:
Formas en las que puedes llamar a ese método:


Código (vbnet) [Seleccionar]
<HideModuleName>
Public Module MyModule1

   Public Sub MyMethod()
   End Sub

End Module

Código (vbnet) [Seleccionar]
MyModule1.MyMethod()


Código (vbnet) [Seleccionar]
Public NotInheritable Class MyClass1

   Public Sub New()
   End Sub

   Public Sub MyMethod()
   End Sub

End Class

Código (vbnet) [Seleccionar]
Dim instance As New MyClass1()
instance.MyMethod()



Código (vbnet) [Seleccionar]
Public NotInheritable Class MyClass2

   Private Sub New()
   End Sub

   Public Shared Sub MyMethod()
   End Sub

End Class

Código (vbnet) [Seleccionar]
MyClass2.MyMethod()

¡Saludos!








Meta

#3
Hola:

Se me había pasado de que la función devuelve vaor y el método no.
http://es.stackoverflow.com/questions/7403/diferencias-entre-m%C3%A9todos-procedimiento-funci%C3%B3n-para-que-sirven-cada-uno-y-co
https://asm86.wordpress.com/2012/05/19/proceso-subrutina-funcion-y-metodo-son-cosas-diferentes/

Funciona así por lo que veo.

Código (vbnet) [Seleccionar]
Public Shared Sub Mensaje1()
           Console.WriteLine()
           Console.WriteLine("Creando archivo al disco duro...")
       End Sub


Esta parte y ano me da problemas.

He probado muchos convertidores y ninguno saca algo al 100 %. Gracias por la propuesta.  Ahora te toca convertir estas líneas que no lo hace bien.
http://converter.telerik.com/
http://www.mundoprogramacion.com/NET/WebServices/deCSaVB_web.aspx

El código es muy grande y no traduce bien todo. Voy partes por partes como este y este no convierte.
Código (vbnet) [Seleccionar]
Puerto_serie.DataReceived += New SerialDataReceivedEventHandler(DataReceivedHandler)

CitarGravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   BC32022   'Public Event DataReceived As SerialDataReceivedEventHandler' es un evento y no se puede llamar directamente. Use una instrucción 'RaiseEvent' para generar un evento.   Recibir_archivo_desde_Arduino_consola_VB   C:\Users\Usuario\documents\visual studio 2017\Projects\Recibir_archivo_desde_Arduino_consola_VB\Recibir_archivo_desde_Arduino_consola_VB\Module1.vb   48   Activo

Hay otra parte del código que traduce bien en teoría, pero hay muchos peros, da errores en VB .net.
De C#:
Código (csharp) [Seleccionar]
               SerialPort sp = (SerialPort)sender;
               string indata = sp.ReadExisting();
               string[] data = indata.Split('A');
               cantidadBytes = int.Parse(data[0]);


               switch (data[1].ToString())
               {
                   case "1":
                       Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                       Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: JPG");
                       break;

                   case "2":
                       Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                       Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: PNG.");
                       break;

                   default:
                       Console.WriteLine("Cosas raras en 'data': " + data.ToString()); // Por si hal algún error.
                       break;
               }

Código (csharp,3) [Seleccionar]

Dim sp As SerialPort = DirectCast(sender, SerialPort)
Dim indata As String = sp.ReadExisting()
Dim data As String() = indata.Split("A"C)
cantidadBytes = Integer.Parse(data(0))


Select Case data(1).ToString()
Case "1"
Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.")
Console.WriteLine("Foto: " + data(1) + ". Tipo de archivo: JPG")
Exit Select

Case "2"
Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.")
Console.WriteLine("Foto: " + data(1) + ". Tipo de archivo: PNG.")
Exit Select
Case Else

Console.WriteLine("Cosas raras en 'data': " + data.ToString())
' Por si hal algún error.
Exit Select
End Select




El código es muy largo, si quieren lo pongo, pero no intenten traducirlo de golpe todo porque no funcionará.

Gracias.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#4
Cita de: Meta en 21 Marzo 2017, 15:39 PMEl código es muy grande y no traduce bien todo. Voy partes por partes como este y este no convierte.
Código (vbnet) [Seleccionar]
Puerto_serie.DataReceived += New SerialDataReceivedEventHandler(DataReceivedHandler)

En VB.NET, para asociar eventos en tiempo de ejecución se hace con las sentencias AddHandler y AddressOf.

Código (vbnet) [Seleccionar]
AddHandler Puerto_serie.DataReceived, AddressOf Me.Puerto_serie_DataReceived

Pero a diferencia de C# en VB.NET esto es algo opcional, no es necesario asociarlo de esa manera a menos que el objeto en cuestión haya sido creado en tiempo de ejecución. En su lugar puedes usar al keyword Handles:
Código (vbnet) [Seleccionar]
Private Sub Puerto_serie_DataReceived(ByVal sender As Object, ByVal e As DataReceivedHandler) Handles Puerto_serie.DataReceived
   ' ...
End Sub





Código (csharp) [Seleccionar]
string[] data = indata.Split('A');
Código (vbnet) [Seleccionar]
Dim data As String() = indata.Split("A"c)

Esto ni siquiera tiene que ver con VB.NET. No existe ninguna sobrecarga del método String.Split en cuya firma acepte un caracter como parámetro, sino un array de caracteres. Al escribir "A"c se casteará automáticamente y puedes llamarlo así, pero no es un buen hábito hacerlo ya que no estás evitando el factor de error humano...

Código (csharp) [Seleccionar]
string[] data = indata.Split(new char[] { 'A' });
Código (vbnet) [Seleccionar]
Dim data As String() = indata.Split( { "A"c } )




Cita de: Meta en 21 Marzo 2017, 15:39 PMHay otra parte del código que traduce bien en teoría, pero hay muchos peros, da errores en VB .net.

A diferencia de C#, en VB.NET las cadenas de texto se concatenan usando el operador &, no +, el cual es un operador aritmético de suma. Se puede concatenar en ciertas circunstancias pero dará problemas ya que no es su propósito.

Aparte de eso, en VB.NET no es necesario escribir al final la sentencia Exit Select (break en C#). La instrucción ya va implícita en el código compilado.

Código (vbnet) [Seleccionar]
' Dim cantidadBytes As Integer

Dim sp As SerialPort = DirectCast(sender, SerialPort)
Dim indata As String = sp.ReadExisting()
Dim data As String() = indata.Split({"A"c})
cantidadBytes = Integer.Parse(data(0))

Select Case data(1).ToString()

   Case "1"
       Console.WriteLine("Tamaño: " & cantidadBytes & " Bytes.")
       Console.WriteLine("Foto: " & data(1) & ". Tipo de archivo: JPG")

   Case "2"
       Console.WriteLine("Tamaño: " & cantidadBytes & " Bytes.")
       Console.WriteLine("Foto: " & data(1) & ". Tipo de archivo: PNG.")

   Case Else
       Console.WriteLine("Cosas raras en 'data': " & data.ToString())

End Select


De todas formas tanto en C# como en VB.NET la concatenación tradicional (y fea) de strings puedes evitarlo, utilizando el método String.Format():
Código (vbnet) [Seleccionar]
Console.WriteLine(String.Format("Foto: {0}. Tipo de archivo: {1}.", data(1) ,"PNG"))


Todo lo que estás preguntando son cosas básicas que podrías averiguar con dos minutos en Google o leyendo la referencia de VB.NET y su modo de empleo en MSDN, hay ejemplos para todo.








Meta

Hola:

Parece que va cogiendo forma, aún así hay dos errores que no me deja en paz.

Código (vbnet) [Seleccionar]
AddHandler Puerto_serie.DataReceived, AddressOf Me.Puerto_serie_DataReceived

Concretamente el Me.
https://msdn.microsoft.com/es-es/library/20fy88e0.aspx

CitarGravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   BC30043   'Me' solo es válido en un método de instancia.   Recibir_archivo_desde_Arduino_consola_VB   C:\Users\Usuario\documents\visual studio 2017\Projects\Recibir_archivo_desde_Arduino_consola_VB\Recibir_archivo_desde_Arduino_consola_VB\Module1.vb   49   Activo

Otro error es este:
Código (vbnet) [Seleccionar]
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error BC30420 No se encontró 'Sub Main' en 'Recibir_archivo_desde_Arduino_consola_VB.Module1'. Recibir_archivo_desde_Arduino_consola_VB C:\Users\Usuario\documents\visual studio 2017\Projects\Recibir_archivo_desde_Arduino_consola_VB\Recibir_archivo_desde_Arduino_consola_VB\vbc 1 Activo


Llevo tiempo traquiniando y no lo campto.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

Cita de: Meta en 23 Marzo 2017, 09:42 AMHola:

Parece que va cogiendo forma, aún así hay dos errores que no me deja en paz.

Código (vbnet) [Seleccionar]
AddHandler Puerto_serie.DataReceived, AddressOf Me.Puerto_serie_DataReceived

Concretamente el Me.
https://msdn.microsoft.com/es-es/library/20fy88e0.aspx

Declara un método a nivel de clase, llámalo  "Puerto_serie_DataReceived" y úsalo para controlar el evento Puerto_serie.DataReceived.

En mi respuesta de arriba te puse un ejemplo de eso mismo.




Cita de: Meta en 23 Marzo 2017, 09:42 AMOtro error es este:
Código (vbnet) [Seleccionar]
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error BC30420 No se encontró 'Sub Main' en 'Recibir_archivo_desde_Arduino_consola_VB.Module1'. Recibir_archivo_desde_Arduino_consola_VB C:\Users\Usuario\documents\visual studio 2017\Projects\Recibir_archivo_desde_Arduino_consola_VB\Recibir_archivo_desde_Arduino_consola_VB\vbc 1 Activo


Llevo tiempo traquiniando y no lo campto.

El módulo principal de tu aplicación de consola necesita tener un punto de entrada (EntryPoint), tal y como en C#.

Código (vbnet) [Seleccionar]
Module Module1

    Public Sub Main()
        ' ...
    End Sub

End Module


Saludos