FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour error con nomodal
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
error con nomodal
Posted: Fri Sep 16, 2016 03:18 PM
Hola
este es un trozo de mi codigo fuente
Code (fw): Select all Collapse
   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


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
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: error con nomodal
Posted: Fri Sep 16, 2016 03: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.

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: error con nomodal
Posted: Fri Sep 16, 2016 03: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 (fw): Select all Collapse
    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 (fw): Select all Collapse
cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



Saludos
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error con nomodal
Posted: 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
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: error con nomodal
Posted: 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 (fw): Select all Collapse
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
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error con nomodal SOLUCIONADO
Posted: 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
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error con nomodal
Posted: Sat Sep 17, 2016 01:48 AM
Gente:

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


Aqui mi cod. fuente

Code (fw): Select all Collapse
   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 (fw): Select all Collapse
  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 (fw): Select all Collapse
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
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: error con nomodal
Posted: Mon Sep 19, 2016 02: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

Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error con nomodal
Posted: 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 (fw): Select all Collapse
    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 (fw): Select all Collapse
cAliArticulo:= "Articulo"+ StrZero(nContadorAlias, 2)



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

Continue the discussion