Programación General > Visual Basic 6.0 e inferiores
Error usando IsEmpty()
(1/1)
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
--- Fin de la cita ---
--- Código: Visual Basic ---Modulo1.bas''''''''''''''''''''''''If Not IsEmpty(Pasarela61850.Nodos61850) Then Cuando Pasarela61850 está definida en un módulo aparte y está declarada como pública:
--- Código: Visual Basic ---Modulo2.bas''''''''''''''''''''''''Public Pasarela61850 As tPasarela61850 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:
--- 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
--- Fin de la cita ---
--- Código: Visual Basic ---Modulo1.bas''''''''''''''''''''''''If Not IsEmpty(Pasarela61850.Nodos61850) Then Cuando Pasarela61850 está definida en un módulo aparte y está declarada como pública:
--- Código: Visual Basic ---Modulo2.bas''''''''''''''''''''''''Public Pasarela61850 As tPasarela61850 Lo que no termino de entender es lo de "los tipos definidos por el usuario de módulos de objeto públicos".
¡Gracias!
--- Fin de la cita ---
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
m0skit0:
--- Cita de: "F_Tanori" ---de donde haz tomado esa traduccion del error? no se entiende
--- Fin de la cita ---
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
--- Fin de la cita ---
Sí, está así de todas formas:
--- Código: Visual Basic ---'Modulo2.bas Public Type tNodos61850 Identificador As String DispositivoLogico As String Tipo As String IdSenial(11) As String AtributosAClientes(23) As StringEnd Type Public Type tPasarela61850 'Datos triviales Nombre As String Identificador As String 'Tipo de configuración mecánica Tipo As String 'Identificador del protocolo usado IdProtocolo As String 'Puertos de comunicaciones principal y alternativo TipoPuertoPpal As String NumPuertoPpal As Integer TipoPuertoAlt As String NumPuertoAlt As Integer 'Ethernet DireccionMAC As String 'Datos TCP/IP de la pasarela DireccionIP As String MascaraIP As String Gateway As String PuertoTCP As Long 'Datos serie de la pasarela TipoSerie As String Velocidad As Long Paridad As String BitsCaracter As Integer ControlPortadora As String ContencionCTS As String PrologoPortadora As Integer EpilogoPortadora As Integer 'Datos CC'X PeriodoTransmisionCC(11) As Long TiempoBuffer(11) As Long 'Datos del equipo que se comunica con la pasarela IdEquipoEsclavo As String IPEquipoEsclavo As String DirEnlaceEquipoEsclavo As Long 'Señales que llegan a la pasarela Seniales() As tSenial61850 NumeroSeniales As Integer 'Lista de los nodos 61850 (Hoja LOGICAL NODES) Nodos61850() As tNodos61850 HayNodos As BooleanEnd Type
Gracias por la respuesta
Nebire:
... 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 --- Dim t() As IntegerPrivate Sub Form_Load() If IsEmpty(t) = True Then MsgBox "t NO ha sido inicializada" else ' entrará aquí MsxBox "t SI ha sido inicializada" End IfEnd Sub
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 --- ' Dim t() As IntegerPrivate Sub Form_Load() If IsEmpty(t) = True Then ' entrará aquí MsgBox "t NO ha sido inicializada" else MsxBox "t SI ha sido inicializada" End IfEnd Sub
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".
--- Fin de la cita ---
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 --- Public Type tiempo ' aquí dará error estando dentro del formulario, o lo ponemos privado o lo movelos a un módulo. dias As Integer semanas As Integer meses As Byte bisiesto As Boolean 'mes As NombreMesesEnd TypeDim t As tiempoPrivate Sub Form_Load() t.bisiesto = True t.dias = 365 t.meses = 12End Sub
... 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...
m0skit0:
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()
--- Fin de la cita ---
[attachment=0:3ihpzhi8]001.JPG[/attachment:3ihpzhi8]
El caso es que es Nothing, pero tampoco me deja compararlo con Nothing:
--- Código: Visual Basic ---If Not Pasarela61850.Nodos61850 Is Nothing Then me da error de tipo.
--- Cita de: "Nebire" ---Los UDT (User Defined Types) cuando se usan en un formulario...
--- Fin de la cita ---
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.
Navegación
Ir a la versión completa