error con nomodal

Post Reply
artu01
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

error con nomodal

Post by artu01 »

Hola
este es un trozo de mi codigo fuente

Code: Select all | Expand


   IF lAbre
      IF !(  ;
         VALTYPE( oDbfArt:=AbreDbf("ARTICULO", .T., .F. , , cPathDBFE, {"articulo"  }, "Articulos" ) ) == "O"  ;
         )
         IIF( Select("ARTICULO"  ) <> 0, ARTICULO->( DBCLOSEAREA()  ), )
      endif
   ELSE
      SELECT ARTICULO
      DATABASE oDbfArt
   endif

   SELECT ARTICULO
   ARTICULO->(DBGotop())

   cBMP1 := LoadBitMap(GetResources(), "MARCA" )

   //Crea Ventana para el Browse
   IF nTipo=1
      DEFINE DIALOG oDlg RESOURCE "BRW_ARTICULOSA" TITLE "Maestro de Articulos" FONT oFontS
   ELSE
      DEFINE DIALOG oDlg RESOURCE "BRW_ARTICULOSB" TITLE "Maestro de Articulos" FONT oFontS
   ENDIF
   cString := ""
   REDEFINE SAY oSay PROMPT cString ID 111 OF oDlg

   REDEFINE LISTBOX oBrw                                           ;
      FIELDS ARTICULO->Cod                                         ;
            ,ARTICULO->DesG                                        ;
            ,Transform(ARTICULO->Pv, "999.9999")                   ;
            ," "                                                   ;
      FIELDSIZES 70, 250,120, 90, 10                               ;
      HEADERS OemToAnsi("C¢digo")                                  ;
            ,OemToAnsi("Descripci¢n")                              ;
            ,"Precio S/."                                          ;
            ," "                                                   ;
      COLOR 0, RGB(192,210,192)                                    ;
      ID 5000 OF oDlg                                              ;
      ON RIGHT CLICK MarcaPaso("ARTICULO", @oBrw)                  ;
      UPDATE                                                       ;
      ACTION ChTag("ARTICULO", 1, oBrw)                            ;
            ,ChTag("ARTICULO", 2, oBrw)

   oBrw:aJustify  := { .F., .F.,.F., .T., .F. }

    oBrw:bKeyDown   := { |nKey| ProcMtn(nKey, nTipo) }
    oBrw:bLDblClick := { || ProcMtn( 13, nTipo )     }

   REDEFINE BUTTON oBtn ID ID_CANCEL OF oDlg ;
      ACTION ( oDlg:End() ) CANCEL
      oBtn:cTooltip := "Sale de la ventana"

   REDEFINE BUTTON oBtn ID ID_NEW OF oDlg    ;
      ACTION ( ProcMtn(VK_INSERT) )
      oBtn:cTooltip := "Ingresa un nuevo registro"

   REDEFINE BUTTON oBtn ID ID_CHANGE OF oDlg ;
      ACTION ( ProcMtn(VK_RETURN) )
      oBtn:cTooltip := "Modifica el registro"

   REDEFINE BUTTON oBtn ID ID_DEL OF oDlg    ;
      ACTION ( ProcMtn(VK_DELETE) )
      oBtn:cTooltip := "Borra el registro"

   IF nTipo <> 1
      REDEFINE BUTTON oBtn ID ID_ENTER OF oDlg  ;
         ACTION ( oDbfArt:Load(), aValRet:={oDbfArt:Cod, oDbfArt:DESG, oDbfArt:uM};
                 ,oDlg:End() ) CANCEL
         oBtn:cTooltip := "Selecciona un registro"
   ENDIF

   ACTIVATE DIALOG oDlg CENTERED //NOWAIT    // si lo comento funciona bien pero no es nomodal
   IF lAbre
      CLOSE ARTICULO
   Else
      ARTiCULO->(DBSetOrder(nOrd))
   ENDIF
RETURN ( aValRet )

 

mis ventanas trabajan sin error cuando son modales pero ahora que quiero pasar a nomodal me sale error
Image

armo los recursos desde pellesC, debo de cambiar en propiedades de la vtna dentro del pelles? o tb en codigo fuente ?
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: error con nomodal

Post by cmsoft »

No cierres con CLOSE articulo porque el flujo del programa en un NOWAIT sigue.
Lo que tienes que hacer es una funcion que puede estar en el VALID del dialogo

ACTIVATE DIALOG oDlg CENTERED NOWAIT Valid(Cierra(lAbre,nOrd))
....

STATIC FUNCTION Cierra(lAbre,nOrd)
IF lAbre
CLOSE ARTICULO
Else
ARTiCULO->(DBSetOrder(nOrd))
ENDIF
RETURN .t.
hmpaquito
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: error con nomodal

Post by hmpaquito »

artu01,

Cuando vd. pone NOWAIT le indica al sistema que no "pare" el hilo de ejecucion mostrando la ventana, sino que siga el hilo de ejecucion, aunque muestre la ventana. Y es por eso que justo despues del ACTIVATE DIALOG directamente, sin parar en el ACTIVATE DIALOG, se ejecuta el codigo siguiente:

Code: Select all | Expand

   IF lAbre
      CLOSE ARTICULO
    Else
      ARTiCULO->(DBSetOrder(nOrd))
   ENDIF



SOLUCION:

Cierre Articulo en la clausula VALID del ACTIVATE DIALOG: Le valdrá para el caso Modal y NO Modal.


RECOMENDACION:


Use alias en variable, asi el usuario podrá entrar varias veces a la misma opcion del programa sin que se produzcan errores:

Code: Select all | Expand

cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



Saludos
artu01
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Post by artu01 »

Gracias cmsoft y hmpaquito ya funciona, gracias por su ayuda
RECOMENDACION:

Use alias en variable, asi el usuario podrá entrar varias veces a la misma opcion del programa sin que se produzcan errores:
cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



ahora bien estando la ventana abierta de articulos si vuelvo a querer abrir la misma ventana me sale que el Alias ya esta en uso
hmpaquito mencionas que lo controle con una variable nContadorAlias, en que momento le aumento valor a esta variable
tendria que ser de tipo publica la variable?
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: error con nomodal

Post by cmsoft »

Para simplificarla (y que no te de el error) puedes consultar al inicio de tu modulo si ese alias esta en uso, y si te da .t. salir

Code: Select all | Expand

IF SELECT("alias") <> 0 // Alias es el nombre que le pones a tu alias
   RETURN
ENDIF

Obviamente tienes que tener el cuidado de que este alias no lo uses en otro modulo que pudiese estar abierto. Simplemente usa un alias especial para ARTICULO en este modulo. A tu funcion AbreDBF deberas pasarle un parametro mas (si es que no es uno de los que le pasas) que sea el alias y al abrir la DBF hacer USE articulo ALIAS "artNoMod" por ejemplo
Espero te sirva
Saludos
artu01
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal SOLUCIONADO

Post by artu01 »

cmsoft se me ocurre que por cada modulo del sistema lo identifique con un numero y ese numero se lo ponga en el nombre del alias al momento
de abrir la tabla ...si me funciono tu ayuda del SELECT ("alias")
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Post by artu01 »

Gente:

Tengo otro problema con nomodal me bota error cuando presiono boton salir o al presionar ESC, como controlarlo?
Image

Aqui mi cod. fuente

Code: Select all | Expand


   IF lAbre .and. SELECT("articulo") = 0
      IF !(  ;
         VALTYPE( oDbfArt:=AbreDbf("ARTICULO", .T., .F. , , cPathDBFE, {"articulo"  }, "Articulos" ) ) == "O"  ;
         )
         IIF( Select("ARTICULO"  ) <> 0, ARTICULO->( DBCLOSEAREA()  ), )
      endif
   ELSE
      SELECT ARTICULO
      DATABASE oDbfArt
   endif

   SELECT ARTICULO
   ARTICULO->(DBGotop())

   cBMP1 := LoadBitMap(GetResources(), "MARCA" )

   //Crea Ventana para el Browse
   IF nTipo=1
      DEFINE DIALOG oDlg RESOURCE "BRW_ARTICULOSA" TITLE "Maestro de Articulos" FONT oFontS
   ELSE
      DEFINE DIALOG oDlg RESOURCE "BRW_ARTICULOSB" TITLE "Maestro de Articulos" FONT oFontS
   ENDIF
   cString := ""
   REDEFINE SAY oSay PROMPT cString ID 111 OF oDlg

   REDEFINE LISTBOX oBrw                                           ;
      FIELDS ARTICULO->Cod                                         ;
            ,ARTICULO->DesG                                        ;
            ,Transform(ARTICULO->Pv, "999.9999")                   ;
            ," "                                                   ;
      FIELDSIZES 70, 250,120, 90, 10                               ;
      HEADERS OemToAnsi("C¢digo")                                  ;
            ,OemToAnsi("Descripci¢n")                              ;
            ,"Precio S/."                                          ;
            ," "                                                   ;
      COLOR 0, RGB(192,210,192)                                    ;
      ID 5000 OF oDlg                                              ;
      ON RIGHT CLICK MarcaPaso("ARTICULO", @oBrw)                  ;
      UPDATE                                                       ;
      ACTION ChTag("ARTICULO", 1, oBrw)                            ;
            ,ChTag("ARTICULO", 2, oBrw)

   oBrw:aJustify  := { .F., .F.,.F., .T., .F. }

    oBrw:bKeyDown   := { |nKey| ProcMtn(nKey, nTipo) }
    oBrw:bLDblClick := { || ProcMtn( 13, nTipo )     }

   REDEFINE BUTTON oBtn ID ID_CANCEL OF oDlg ;
      ACTION (  msgalert(labre), Cierra((lAbre, nOrd)), oDlg:End()  ) CANCEL
      oBtn:cTooltip := "Sale de la ventana"

   REDEFINE BUTTON oBtn ID ID_NEW OF oDlg    ;
      ACTION ( ProcMtn(VK_INSERT) )
      oBtn:cTooltip := "Ingresa un nuevo registro"

   REDEFINE BUTTON oBtn ID ID_CHANGE OF oDlg ;
      ACTION ( ProcMtn(VK_RETURN) )
      oBtn:cTooltip := "Modifica el registro"

   REDEFINE BUTTON oBtn ID ID_DEL OF oDlg    ;
      ACTION ( ProcMtn(VK_DELETE) )
      oBtn:cTooltip := "Borra el registro"

   IF nTipo <> 1
      REDEFINE BUTTON oBtn ID ID_ENTER OF oDlg  ;
         ACTION ( oDbfArt:Load(), aValRet:={oDbfArt:Cod, oDbfArt:DESG, oDbfArt:uM};
                 ,oDlg:End() ) CANCEL
         oBtn:cTooltip := "Selecciona un registro"
   ENDIF
   ACTIVATE DIALOG oDlg CENTERED NOWAIT Valid(Cierra((lAbre, nOrd)))

RETURN ( aValRet )

Static Function Cierra(lAbre, nOrd)
   msgalert("hola")
   IF lAbre    // despues que presiono boton salir la variable labre vale nil, pero la primera vez vale .T.
      CLOSE ARTICULO
   Else
      ARTiCULO->(DBSetOrder(nOrd))
   ENDIF
Return .t.
 


Lo raro es que leo el valor de la variable labre antes de cerrar el dialogo y si vale .t. y lo paso como parametro a la funcion cierra
pero al evaluarlo alli vale NIL

Code: Select all | Expand


  REDEFINE BUTTON oBtn ID ID_CANCEL OF oDlg ;
      ACTION (  msgalert(labre), Cierra((lAbre, nOrd)), oDlg:End()  ) CANCEL  // aqui vale labre .t.
      oBtn:cTooltip := "Sale de la ventana"
 

Code: Select all | Expand


Static Function Cierra(lAbre, nOrd)
   msgalert("hola")
   IF lAbre    // al evaluar labre despues de haber cerrado el dialogo vale NIL por que?
      CLOSE ARTICULO
   Else
      ARTiCULO->(DBSetOrder(nOrd))
   ENDIF
Return .t.
 
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: error con nomodal

Post by cmsoft »

Prueba declarar lAbre como STATIC antes de la funcion que muestra el dialog.
Si es un parametro de la funcion que muestra el dialogo, asignaselo a una variable STATIC
artu01
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Post by artu01 »

Hola paquito
si el NOWAIT le indica al sistema que no pare el hilo de ejecucion mostrando la ventana, sino que salga del hilo de ejecucion aunque muestre la ventana entonces
como haria para llamar a este browse desde otra parte del sistema y que me devuelva lo que el usuario ha seleccionado?

hmpaquito wrote:artu01,

Cuando vd. pone NOWAIT le indica al sistema que no "pare" el hilo de ejecucion mostrando la ventana, sino que siga el hilo de ejecucion, aunque muestre la ventana. Y es por eso que justo despues del ACTIVATE DIALOG directamente, sin parar en el ACTIVATE DIALOG, se ejecuta el codigo siguiente:

Code: Select all | Expand

   IF lAbre
      CLOSE ARTICULO
    Else
      ARTiCULO->(DBSetOrder(nOrd))
   ENDIF



SOLUCION:

Cierre Articulo en la clausula VALID del ACTIVATE DIALOG: Le valdrá para el caso Modal y NO Modal.


RECOMENDACION:


Use alias en variable, asi el usuario podrá entrar varias veces a la misma opcion del programa sin que se produzcan errores:

Code: Select all | Expand

cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



Saludos
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Post Reply