error con nomodal

error con nomodal

Postby artu01 » Fri Sep 16, 2016 3:18 pm

Hola
este es un trozo de mi codigo fuente
Code: Select all  Expand view

   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
artu01
 
Posts: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Postby cmsoft » Fri Sep 16, 2016 3:47 pm

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.
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: error con nomodal

Postby hmpaquito » Fri Sep 16, 2016 3:51 pm

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 view
   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 view
cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



Saludos
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: error con nomodal

Postby artu01 » Fri Sep 16, 2016 11:27 pm

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
artu01
 
Posts: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Postby cmsoft » Fri Sep 16, 2016 11:47 pm

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 view
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
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: error con nomodal SOLUCIONADO

Postby artu01 » Sat Sep 17, 2016 12:12 am

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: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Postby artu01 » Sat Sep 17, 2016 1:48 am

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 view

   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 view

  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 view

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
artu01
 
Posts: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: error con nomodal

Postby cmsoft » Mon Sep 19, 2016 2:27 pm

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
User avatar
cmsoft
 
Posts: 1202
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: error con nomodal

Postby artu01 » Fri Oct 21, 2016 11:10 pm

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 view
   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 view
cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



Saludos
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 25 guests