Al estar procesando un bucle For Next, que atrapa y muestra a tavés de un
MsgInfo(), las opciones de menús definidas en una clase TMenu, cominza a
correr y mientras el menú superior tenga un hijo SubMenú me sigue mostrando
las opciones, el problema surge cuando un Item ya no tiene un hijo SubMenú
que dependa del item superior ya que me muestra el siguiente error:
Subsistema: BASE
Código de error: 1004
Estado: .F.
Descripción: Class: 'NIL' has no exported method
Operación: AITEMS
Argumentos: [ 1] = Tipo: U Valor: NIL
Fichero:
Código error SO: 0
La pregunta es: Como hago para interceptar este error antes de que ocurra?
El código que ejecuta el proceso descrito es:
METHOD FormShow( oSender ) CLASS _Menu
//
Local l_oItemH
Local l_cItemH := ''
Local l_nItrH := 1
Local l_nLenH := 0
//
Local l_oItemV
Local l_cItemV := ''
Local l_nItrV := 1
Local l_nLenV := 0
//
Local l_oItemX
Local l_cItemX := ''
Local l_nItrX := 1
Local l_nLenX := 0
//
Local l_nCont := 1
//
l_oItemH := ::oMenu1:aItems
l_nLenH := Len(l_oItemH)
For l_nItrH := 1 to l_nLenH
l_cItemH := l_oItemH[l_nItrH]
MsgInfo('1 '+l_cItemH:cText)
l_nCont++
l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
l_nLenV := Len(l_oItemV)
For l_nItrV := 1 to l_nLenV
l_cItemV := l_oItemV[l_nItrV]
If Empty(l_cItemV:cText)
Loop
EndIf
MsgInfo('2 '+l_cItemV:cText)
l_nCont++
If
Empty(l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aI tems)
MsgInfo('Detectado')
EndIf
l_oItemX :=
l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aItems
l_nLenX := Len(l_oItemX)
For l_nItrX := 1 to l_nLenX
l_cItemX := l_oItemX[l_nItrX]
If Empty(l_cItemX:cText)
Loop
EndIf
MsgInfo('3 '+l_cItemX:cText)
l_nCont++
Next l_nItrX
Next l_nItrV
Next l_nItrH
MsgInfo(l_nCont)
//
RETURN Nil
Gracias
Guillermo Guevara Carrillo
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Como interceptar un error antes de que suceda
-
- Mensajes: 176
- Registrado: Sab Ene 19, 2008 5:52 pm
-
- Mensajes: 620
- Registrado: Jue Mar 23, 2006 2:39 am
Como interceptar un error antes de que suceda
Guillermo:
Prueba la estructura :
Try
codigo que puede causar el error
Catch oError
Codigo que corrige o intercepta el error
End
Revisa el manual de xHarbour para mas informacion.
Saludos
Rene Flores
http://www.ciber-tec.com
Guevara C. escribió:
> Al estar procesando un bucle For Next, que atrapa y muestra a tavés de un
> MsgInfo(), las opciones de menús definidas en una clase TMenu, cominza a
> correr y mientras el menú superior tenga un hijo SubMenú me sigue mostrando
> las opciones, el problema surge cuando un Item ya no tiene un hijo SubMenú
> que dependa del item superior ya que me muestra el siguiente error:
>
> Subsistema: BASE
> Código de error: 1004
> Estado: .F.
> Descripción: Class: 'NIL' has no exported method
> Operación: AITEMS
> Argumentos: [ 1] = Tipo: U Valor: NIL
> Fichero:
> Código error SO: 0
>
> La pregunta es: Como hago para interceptar este error antes de que ocurra?
>
> El código que ejecuta el proceso descrito es:
>
> METHOD FormShow( oSender ) CLASS _Menu
> //
> Local l_oItemH
> Local l_cItemH := ''
> Local l_nItrH := 1
> Local l_nLenH := 0
> //
> Local l_oItemV
> Local l_cItemV := ''
> Local l_nItrV := 1
> Local l_nLenV := 0
> //
> Local l_oItemX
> Local l_cItemX := ''
> Local l_nItrX := 1
> Local l_nLenX := 0
> //
> Local l_nCont := 1
> //
> l_oItemH := ::oMenu1:aItems
> l_nLenH := Len(l_oItemH)
> For l_nItrH := 1 to l_nLenH
> l_cItemH := l_oItemH[l_nItrH]
> MsgInfo('1 '+l_cItemH:cText)
> l_nCont++
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
> l_nLenV := Len(l_oItemV)
> For l_nItrV := 1 to l_nLenV
> l_cItemV := l_oItemV[l_nItrV]
> If Empty(l_cItemV:cText)
> Loop
> EndIf
> MsgInfo('2 '+l_cItemV:cText)
> l_nCont++
> If
> Empty(l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aI tems)
> MsgInfo('Detectado')
> EndIf
> l_oItemX :=
> l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aItems
> l_nLenX := Len(l_oItemX)
> For l_nItrX := 1 to l_nLenX
> l_cItemX := l_oItemX[l_nItrX]
> If Empty(l_cItemX:cText)
> Loop
> EndIf
> MsgInfo('3 '+l_cItemX:cText)
> l_nCont++
> Next l_nItrX
> Next l_nItrV
> Next l_nItrH
> MsgInfo(l_nCont)
> //
> RETURN Nil
>
> Gracias
>
> Guillermo Guevara Carrillo
>
>
Prueba la estructura :
Try
codigo que puede causar el error
Catch oError
Codigo que corrige o intercepta el error
End
Revisa el manual de xHarbour para mas informacion.
Saludos
Rene Flores
http://www.ciber-tec.com
Guevara C. escribió:
> Al estar procesando un bucle For Next, que atrapa y muestra a tavés de un
> MsgInfo(), las opciones de menús definidas en una clase TMenu, cominza a
> correr y mientras el menú superior tenga un hijo SubMenú me sigue mostrando
> las opciones, el problema surge cuando un Item ya no tiene un hijo SubMenú
> que dependa del item superior ya que me muestra el siguiente error:
>
> Subsistema: BASE
> Código de error: 1004
> Estado: .F.
> Descripción: Class: 'NIL' has no exported method
> Operación: AITEMS
> Argumentos: [ 1] = Tipo: U Valor: NIL
> Fichero:
> Código error SO: 0
>
> La pregunta es: Como hago para interceptar este error antes de que ocurra?
>
> El código que ejecuta el proceso descrito es:
>
> METHOD FormShow( oSender ) CLASS _Menu
> //
> Local l_oItemH
> Local l_cItemH := ''
> Local l_nItrH := 1
> Local l_nLenH := 0
> //
> Local l_oItemV
> Local l_cItemV := ''
> Local l_nItrV := 1
> Local l_nLenV := 0
> //
> Local l_oItemX
> Local l_cItemX := ''
> Local l_nItrX := 1
> Local l_nLenX := 0
> //
> Local l_nCont := 1
> //
> l_oItemH := ::oMenu1:aItems
> l_nLenH := Len(l_oItemH)
> For l_nItrH := 1 to l_nLenH
> l_cItemH := l_oItemH[l_nItrH]
> MsgInfo('1 '+l_cItemH:cText)
> l_nCont++
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
> l_nLenV := Len(l_oItemV)
> For l_nItrV := 1 to l_nLenV
> l_cItemV := l_oItemV[l_nItrV]
> If Empty(l_cItemV:cText)
> Loop
> EndIf
> MsgInfo('2 '+l_cItemV:cText)
> l_nCont++
> If
> Empty(l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aI tems)
> MsgInfo('Detectado')
> EndIf
> l_oItemX :=
> l_oItemH[l_nItrH]:oSubMenu:aItems[l_nItrV]:oSubMenu:aItems
> l_nLenX := Len(l_oItemX)
> For l_nItrX := 1 to l_nLenX
> l_cItemX := l_oItemX[l_nItrX]
> If Empty(l_cItemX:cText)
> Loop
> EndIf
> MsgInfo('3 '+l_cItemX:cText)
> l_nCont++
> Next l_nItrX
> Next l_nItrV
> Next l_nItrH
> MsgInfo(l_nCont)
> //
> RETURN Nil
>
> Gracias
>
> Guillermo Guevara Carrillo
>
>
Como interceptar un error antes de que suceda
Guillermo,
como te ha dicho René, lo más apropiado para 'capturar' los errores es la
estructura TRY / CATCH / FINALLY / END. No obstante, en este caso concreto
es más sencillo comprobar simplemente si la propiedad oSubmenu es NIL, así:
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
IF l_oItemV != Nil
...
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
como te ha dicho René, lo más apropiado para 'capturar' los errores es la
estructura TRY / CATCH / FINALLY / END. No obstante, en este caso concreto
es más sencillo comprobar simplemente si la propiedad oSubmenu es NIL, así:
> l_oItemV := l_oItemH[l_nItrH]:oSubMenu:aItems
IF l_oItemV != Nil
...
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info