• Viernes 8 de Noviembre de 2024, 13:04

Autor Tema:  Error usando IsEmpty()  (Leído 2300 veces)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Error usando IsEmpty()
« en: Lunes 1 de Diciembre de 2008, 10:32 »
0
Hola a todxs

Me ha surgido un error que me tiene intrigado. A ver si alguno sabe de qué se trata:

Cita de: "VB"
Sólo los tipos definidos por el usuario de módulos de objeto públicos se pueden pasar a funciones enlazadas en tiempo de ejecución o forzar a o desde  un Variant

Código: Visual Basic
  1. Modulo1.bas
  2. ''''''''''''''''''''''''
  3. If Not IsEmpty(Pasarela61850.Nodos61850) Then
  4.  
Cuando Pasarela61850 está definida en un módulo aparte y está declarada como pública:

Código: Visual Basic
  1. Modulo2.bas
  2. ''''''''''''''''''''''''
  3. Public Pasarela61850 As tPasarela61850
  4.  
Lo que no termino de entender es lo de "los tipos definidos por el usuario de módulos de objeto públicos".

¡Gracias!

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Error usando IsEmpty()
« Respuesta #1 en: Lunes 1 de Diciembre de 2008, 12:26 »
0
Cita de: "m0skit0"
Hola a todxs

Me ha surgido un error que me tiene intrigado. A ver si alguno sabe de qué se trata:

Cita de: "VB"
Sólo los tipos definidos por el usuario de módulos de objeto públicos se pueden pasar a funciones enlazadas en tiempo de ejecución o forzar a o desde  un Variant

Código: Visual Basic
  1. Modulo1.bas
  2. ''''''''''''''''''''''''
  3. If Not IsEmpty(Pasarela61850.Nodos61850) Then
  4.  
Cuando Pasarela61850 está definida en un módulo aparte y está declarada como pública:

Código: Visual Basic
  1. Modulo2.bas
  2. ''''''''''''''''''''''''
  3. Public Pasarela61850 As tPasarela61850
  4.  
Lo que no termino de entender es lo de "los tipos definidos por el usuario de módulos de objeto públicos".

¡Gracias!

de donde haz tomado esa traduccion del error? no se entiende

el tipo de dato definido por el usuarios es el tPasarela61850 el cual es el que debe estar en un modulo, Pasarela61850  es una variable

No se si eso sea el problema , tendras el menesaje o numero de error original? o mostrar mas detalles de tu codigo

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error usando IsEmpty()
« Respuesta #2 en: Lunes 1 de Diciembre de 2008, 15:02 »
0
Cita de: "F_Tanori"
de donde haz tomado esa traduccion del error? no se entiende
Está copiado tal cual del error que da. Está mal redactado, desde luego. Pero lo que no sé es qué es un módulo de objeto público. No tiene ningún número, simplemente pone "Error de compilación" seguido de la frase anteriormente mencionada.

Cita de: "F_Tanori"
el tipo de dato definido por el usuarios es el tPasarela61850 el cual es el que debe estar en un modulo, Pasarela61850 es una variable
Sí, está así de todas formas:

Código: Visual Basic
  1. 'Modulo2.bas
  2.  
  3. Public Type tNodos61850
  4.     Identificador As String
  5.     DispositivoLogico As String
  6.     Tipo As String
  7.     IdSenial(11) As String
  8.     AtributosAClientes(23) As String
  9. End Type
  10.  
  11. Public Type tPasarela61850
  12.     'Datos triviales
  13.     Nombre As String
  14.     Identificador As String
  15.     'Tipo de configuración mecánica
  16.     Tipo As String
  17.    
  18.     'Identificador del protocolo usado
  19.     IdProtocolo As String
  20.    
  21.     'Puertos de comunicaciones principal y alternativo
  22.     TipoPuertoPpal As String
  23.     NumPuertoPpal As Integer
  24.     TipoPuertoAlt As String
  25.     NumPuertoAlt As Integer
  26.    
  27.     'Ethernet
  28.     DireccionMAC As String
  29.    
  30.     'Datos TCP/IP de la pasarela
  31.     DireccionIP As String
  32.     MascaraIP As String
  33.     Gateway As String
  34.     PuertoTCP As Long
  35.    
  36.     'Datos serie de la pasarela
  37.     TipoSerie As String
  38.     Velocidad As Long
  39.     Paridad As String
  40.     BitsCaracter As Integer
  41.     ControlPortadora As String
  42.     ContencionCTS As String
  43.     PrologoPortadora As Integer
  44.     EpilogoPortadora As Integer
  45.    
  46.     'Datos CC'X
  47.     PeriodoTransmisionCC(11) As Long
  48.     TiempoBuffer(11) As Long
  49.    
  50.     'Datos del equipo que se comunica con la pasarela
  51.     IdEquipoEsclavo As String
  52.     IPEquipoEsclavo As String
  53.     DirEnlaceEquipoEsclavo As Long
  54.    
  55.     'Señales que llegan a la pasarela
  56.     Seniales() As tSenial61850
  57.     NumeroSeniales As Integer
  58.    
  59.     'Lista de los nodos 61850 (Hoja LOGICAL NODES)
  60.     Nodos61850() As tNodos61850
  61.     HayNodos As Boolean
  62. End Type
  63.  

Gracias por la respuesta

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Error usando IsEmpty()
« Respuesta #3 en: Lunes 1 de Diciembre de 2008, 23:21 »
0
... a ver Moxkito... la expresión If Not IsEmpty(Pasarela61850.Nodos61850) Then visto el código siempre devolverá 'not false' (not porque le preguntas not empty).

IsEmpty tiene 'utilidad práctica' cuando se usa con los variants, para otros casos no es muy útil... te pongo 1 sencillo ejemplo

supongamos un formulario:
Código: Visual Basic
  1.  
  2. Dim t() As Integer
  3. Private Sub Form_Load()
  4.     If IsEmpty(t) = True Then
  5.         MsgBox "t NO ha sido inicializada"
  6.     else
  7.        ' entrará aquí
  8.        MsxBox  "t SI ha sido inicializada"
  9.     End If
  10. End Sub
  11.  
  12.  

Ahora supon el código casi idéntico, pero nota que la línea de declaración de la matriz 't' está comentada:
Código: Visual Basic
  1.  
  2. ' Dim t() As Integer
  3. Private Sub Form_Load()
  4.     If IsEmpty(t) = True Then
  5.         ' entrará aquí
  6.         MsgBox "t NO ha sido inicializada"
  7.     else
  8.         MsxBox  "t SI ha sido inicializada"
  9.     End If
  10. End Sub
  11.  
  12.  

Como en tu código declaras tanto 'pasarela' (as ...) entonces nunca te dará true (dentro del propio módulo, fuera sólo si es privada), porque está inicializada... ( en el caso de  la matriz 'nodo61850'  si no fuera declarado daría un error diciendo que no es un miembro de tPasarela61850 y se inicializa tan pronto como haces una declaración de una variable que es del tipo al que pertenece)
Quizás lo que quieras preguntarle es si tiene asignación de datos válidos... para eso usa isnull() ó quizás más adecuadamente quieras preguntarle si el array está inicializado,  para eso acuérdate de aquella conversación que mantuvimos acerca de saber si un array estaba o no inicializado, repásalo...

Cita de: "m0skit0"
Lo que no termino de entender es lo de "los tipos definidos por el usuario de módulos de objeto públicos".

Siempre he pensado que es 'lioso' como para que no se entienda adecuadamente.... trataré de explicarlo.
Los UDT (User Defined Types) cuando se usan en un formulario tienen forzosamente que ser declarados privados, al igual que las API declaradas dentro del formulario, la razón se apoya en la forma que VB6.0 'divide' el código público y privado, se detalla más abajo (dim equivale a escribir Private en vb6.0)

Por ejemplo al intentar ejecutar el siguiente código:
Código: Visual Basic
  1.  
  2. Public Type tiempo   ' aquí dará error estando dentro del formulario, o lo ponemos privado o lo movelos a un módulo.
  3.        dias As Integer
  4.        semanas As Integer
  5.        meses As Byte
  6.        bisiesto As Boolean
  7.        'mes As NombreMeses
  8. End Type
  9. Dim t As tiempo
  10. Private Sub Form_Load()
  11.      t.bisiesto = True
  12.      t.dias = 365
  13.      t.meses = 12
  14. End Sub
  15.  
  16.  

... dará error porque si declaramos la estructura (UDT, TDU en español) Tiempo en el (dentro del) formulario tendremos que cambiarlo a privado para poderlo usarlo, y además por ser privado sólo podremos usarlo dentro del formulario. Si queremos que pueda ser usado fuera del formulario entonces lo podremos declarar público pero entonces deberemos moverlo a un módulo.

Esto sucede así porque la forma que tiene visualbasic de definir código público disponible en el proyecto es a través del módulo. Lo que confunde es que esto sólo se refiere a constantes, Tipos definidos por el usuario (estructuras, TDU), matrices y declaraciones (de DLLs).   Un módulo puede también tener código privado. Pero un  formulario que tenga algo de lo marcado en otro color anteriormente sólo puede contenerlo si se declara privado. Nota que en cambio las funciones y  rutinas (SUBs) si pueden ser públicas o privadas en el formulario.

Saludos...
«Ma non troppo»
----> ModoVacaciones = False<----

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error usando IsEmpty()
« Respuesta #4 en: Martes 2 de Diciembre de 2008, 09:03 »
0
Gracias por las respuestas.

Cita de: "Nebire"
Quizás lo que quieras preguntarle es si tiene asignación de datos válidos... para eso usa isnull()
[attachment=0:3ihpzhi8]001.JPG[/attachment:3ihpzhi8]

El caso es que es Nothing, pero tampoco me deja compararlo con Nothing:

Código: Visual Basic
  1. If Not Pasarela61850.Nodos61850 Is Nothing Then
  2.  
me da error de tipo.

Cita de: "Nebire"
Los UDT (User Defined Types) cuando se usan en un formulario...
No es en un formulario, es un módulo (mira bien el código expuesto anteriormente).

Definitivamente, VB es un lenguaje que cada día me desagrada más. Pero hay que cobrar :P Lo hice de otra forma, añadiendo una variable booleana que se pone a verdadero cuando se rellena el array. Más sencillo, más entendible, menos complicaciones y menos código enrevesado, aunque sea a costa de un byte.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.