Page 1 of 2

Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Sun Jun 02, 2019 5:31 pm
by Armando
Hola Foreros:

Por aquí saludando y preguntando, tengo el siguiente pseudo código:

Code: Select all  Expand view

    DEFINE WINDOW oWnd MDICHILD OF oWindow FROM 0,0 TO 10,10;
        TITLE "Bitacora de viajes" ICON oIcono
….
….
….
        ACTIVATE DIALOG oDlg NOWAIT ON INIT oDlg:MOVE(0,0) VALID ! GetASyncKey(VK_ESCAPE)
    ACTIVATE WINDOW oWnd ON RESIZE ( IF( oWnd<>NIL, oWnd:SETSIZE(oDlg:nWidth,oDlg:nHeight+29), ));
        ON INIT (LaBarra(oWnd,oDlg,oBrw),oBrw:SetFocus()) VALID Cierra()
RETURN(NIL)


STATIC FUNCTION LaBarra(oWnd,oDlg,oBrw)
    LOCAL oBar
    LOCAL oBtns     := ARRAY(07)

    DEFINE BUTTONBAR oBar SIZE 28,28 OF oDlg CURSOR oCursor 2007

        DEFINE BUTTON oBtns[01] OF oBar RESOURCE "BtnAdd";
            ACTION Editar(oBrw,(.T.));
            MESSAGE "Agregar un nuevo vale"
        DEFINE BUTTON oBtns[02] OF oBar RESOURCE "BtnCan";
            WHEN oRsVia:State() = adStateOpen .AND. oRsVia:RecordCount > 0;     <--- Condición
            ACTION Cancelar(oBrw);
            MESSAGE "Cancelar vale"
RETURN(.T.)
 


Como vemos, el botón oBtns[02] esta condicionado, en otra función abro la tabla oRsVia
y seguro estoy que tiene registros pero el botón no se activa, aún con oDlg:AEValWhen()
Algo que me haga falta?

Saludos

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 2:11 pm
by armando.lagunas
Armando:

yo también tengo miles de dolores de cabeza al tratar de activar un botón con una condición, sugiero lo siguiente:

paso 1 : ( al colocar {|| } me funcionan en mi caso )

Code: Select all  Expand view
       DEFINE BUTTON oBtns[02] OF oBar RESOURCE "BtnCan";
            WHEN {|| ( oRsVia:State() = adStateOpen .AND. oRsVia:RecordCount > 0 ) }    ;     <--- Condición
            ACTION Cancelar(oBrw);
            MESSAGE "Cancelar vale"


paso 2 : trabajar el botón con Enable(), Disable() traspasando el control a una función independiente que te devuelva el valor deseado y activando o desactivando el control oBtns[2]

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 5:03 pm
by Armando
Tocayo:

Te agradezco la disponibilidad de apoyar pero no, no funciona como
me sugeriste, a ver si hay alguna otra recomendación.

Saludos

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 5:48 pm
by karinha
Intenta asi:

Code: Select all  Expand view

      :bChange       := { || oDlg:AEvalWhen() }

      ó

      oDlg:oWnd:AEvalWhen()

      ó

      oBar:oWnd:AEvalWhen()
 

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 8:11 pm
by Armando
Karinha:

Tampoco me funciona. :roll:

Saludos

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 9:23 pm
by jvtecheto
Hola Armando.

Si te interesa puedes probar lo que yo hago.
a la funcion que llamo con el boton le paso como parametros, el objeto menu y el boton
que es los que tengo que desabilitar.
Ejemplo.
Code: Select all  Expand view

FUNCTION EmpresBrw( oMenuEmp, oEmpres )

   
   oMenuEmp:Disable()
   oEmpres:Disable()
   // y luego cuando me salgo de la ventana
ACTIVATE WINDOW oWndEmp CENTERED VALID ( oMenuEmp:Enable(), oEmpres:Enable(), CierraEmp( cTrab ) ) .....

 


Supongo que no sera lo mas ortodoxo, pero pruebalo que funciona.

Saludos.

Jose.

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 9:25 pm
by jvtecheto
Perdona se me ha olvidado decirte que las variables
estan declaradas STATIC fuera de todo procedimiento , funcion.

Saludos.

Jose.

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Mon Jun 03, 2019 10:59 pm
by Armando
brakaman:

Agradezco el interés, pero no es exactamente mi escenario.

Te cuento:

Tengo un dialogo dentro de una ventana MDICHILD, al activar la ventana, en el ON INIT voy
a la función que crea una barra de botones que me sirven para AGREGAR, MODIFICAR,
ELIMINAR, etc.

Cuando abro el dialogo por primera vez la tabla está vacía y por tanto los botones están
disable, excepto el botón AGREGAR

Al agregar el primer registro a la tabla, necesito que se activen todos los botones, hasta ahí
todo funciona muy bien.

En el dialogo tengo un control DATEPICKER para dar opción al usuario de elegir movimientos
de otro día, cuando cambian la fecha hago el filtro a la tabla y muestro los nuevos registros
en un browse, ahí todo bien, pero los botones no se activan cuando que ya hay registros en
la tabla.

Saludos y gracias

Re: Activar botón con oDlg:AEValWhen()

PostPosted: Tue Jun 04, 2019 11:06 am
by russimicro
Buena dia...

Ya evaluó directamente el resultado de la condición ? : "oRsVia:State() = adStateOpen .AND. oRsVia:RecordCount > 0 "

... Lo uso así acorde a mi necesidad.

Code: Select all  Expand view


LOCAL lGenReg := .f.  ,oBotReg ,oPlaVeh  ,oPlaVeh


@ 15,110 GET oPlaVeh VAR oPlaVeh ;
         PICTURE "@!X" ;
         PIXEL SIZE 120*nAjuAnc,45 ;
         COLOR CLR_BLUE,CLR_YELLOW FONT M->oFonAc24 ;
         VALID ( defineRegistroClientePar(@lGenReg,oBotReg ) )


@ 97, 110 BTNBMP oBotReg ;
          SIZE 155,25 PIXEL OF oDlgPar ;
          RESOURCE "ADICIONAR" ;
          WHEN lGenReg ;
          ACTION ( grabarRegistroPar()
           
FUNCTION defineRegistroClientePar(lGenReg,oBotReg )


IF lGenReg
   oBotReg :enable()
ELSE
   oBotReg :disable()
ENDIF


return .t.
 



Johnson Russi
Colombia

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Tue Jun 04, 2019 4:57 pm
by Armando
Amigos:

Problema solucionado usando DISABLE y ENABLE.

Muchas gracias y larga vida al foro

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Thu Jun 06, 2019 5:10 am
by nageswaragunupudi
It should work even without calling oDlg:AEvalWhen() or oBar:AEvalWhen() even on a dialog in mdichild.

This is my sample code working without calling any AEvalwhen() or disable or enable.
Code: Select all  Expand view
#include "fivewin.ch"

static oCn

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oBar

   DEFINE WINDOW oWnd MDI
   DEFINE BUTTONBAR oBar OF oWnd SIZE 100,32 2007
   DEFINE BUTTON OF oBar PROMPT "Browse" ACTION MdiDlg()
   DEFINE BUTTON OF oBar PROMPT "Close"  ACTION oWnd:End()

   ACTIVATE WINDOW oWnd

   if oCn != nil
      oCn:Close()
   end

return nil

//----------------------------------------------------------------------------//

static function MdiDlg()

   local oRs, oDlg, oBar, oBrw, oFont, oRad
   local nState   := 1
   local aStates  := { "  ", "NY", "WA" }

   DEFAULT oCn := FW_OpenAdoConnection( "xbrtest.mdb" )
   oRs         := FW_OpenRecordSet( oCn, "customer" )
   oRs:Filter  := "STATE=NULL"

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
   DEFINE DIALOG oDlg SIZE 650,400 PIXEL TRUEPIXEL FONT oFont
   RELEASE FONT oFont

   DEFINE BUTTONBAR oBar OF oDlg SIZE 80,48 2007
   DEFINE BUTTON OF oBar PROMPT "Add"    FILE "c:\fwh\bitmaps\new2.bmp" ;
      ACTION oBrw:EditSource( .t. )
   DEFINE BUTTON OF oBar PROMPT "Modify" FILE "c:\fwh\bitmaps\edit.bmp"  ;
      WHEN oRs:RecordCount() > 0 ACTION oBrw:EditSource()
   DEFINE BUTTON OF oBar PROMPT "Delete" FILE "c:\fwh\bitmaps\16x16\delete.bmp" ;
      WHEN oRs:RecordCount() > 0 ACTION oBrw:Delete()

   @ 48,0 XBROWSE oBrw SIZE 500,0 PIXEL OF oDlg ;
      DATASOURCE oRs COLUMNS "FIRST","CITY","STATE" ;
      CELL LINES NOBORDER

   WITH OBJECT oBrw
      :CreateFromCode()
   END

   @ 050,520 RADIO oRad VAR nState ITEMS "None", "NY", "WA" ;
      SIZE 80,20 PIXEL OF oDlg ON CHANGE ( ;
         oRs:Filter := If( nState == 1, "STATE=NULL", "STATE='" + aStates[ nState ] + "'" ), ;
         oBrw:Refresh() )

   ACTIVATE DIALOG oDlg AS MDICHILD ;
      SETUP ( oWnd:bPostEnd := { || oRs:Close() } )

return nil

//----------------------------------------------------------------------------//
 


Image

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Thu Jun 06, 2019 2:21 pm
by Armando
Mr. Rao:

Thanks so much, I will test your sample.

Regards

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Thu Jun 06, 2019 4:39 pm
by Armando
Mr. Rao:

Please embed the dialogue in an MDI CHILD window

Regards

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Thu Jun 06, 2019 11:08 pm
by nageswaragunupudi
The command used
Code: Select all  Expand view

ACTIVATE DIALOG oDlg AS MDICHILD ....
 

embeds the dialog into mdichild.
Simple and standard way to embed dialogs in mdichild from FWH1810.

Whatsnew.txt
ACTIVATE DIALOG oDlg AS MDICHILD.
In an MDI environment, converts the dialog as mdichild and activates.
On activation, the variable oDlg now refers to the new mdichild window
and all actions and codeblocks using oDlg variable now act on the
mdichild window.
fwh\samples\mdidlg.prg
viewtopic.php?f=3&t=36244



May I know the version of FWH you are using? Let me try with the same version of FWH you are using.

Re: Activar botón con oDlg:AEValWhen() (SOLUCIONADO)

PostPosted: Fri Jun 07, 2019 12:21 am
by nageswaragunupudi
This is a working sample for FWH versions older than FWH1810. I have tested this sample with FWH1602 and is working well.
For the old versions I used
Code: Select all  Expand view

oDlg:oBar:AEvalWhen()
 

after changing the filter of oRs.

This sample gives exactly the same results as shown in the above animated gif.
Code: Select all  Expand view
#include "fivewin.ch"

// FOR FWH VERSIONS PRIOR TO FWH1806

static oCn

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oBar

   DEFINE WINDOW oWnd MDI
   DEFINE BUTTONBAR oBar OF oWnd SIZE 100,32 2007
   DEFINE BUTTON OF oBar PROMPT "Browse" ACTION MdiDlg()
   DEFINE BUTTON OF oBar PROMPT "Close"  ACTION oWnd:End()

   ACTIVATE WINDOW oWnd

   if oCn != nil
      oCn:Close()
   end

return nil

//----------------------------------------------------------------------------//

static function MdiDlg()

   local oRs, oDlg, oWnd, oBrw, oFont, oRad
   local nState   := 1
   local aStates  := { "  ", "NY", "WA" }

   DEFAULT oCn := FW_OpenAdoConnection( "xbrtest.mdb" )
   oRs         := FW_OpenRecordSet( oCn, "customer" )
   oRs:Filter  := "STATE=NULL"

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
   DEFINE DIALOG oDlg SIZE 650,400 PIXEL TRUEPIXEL FONT oFont
   RELEASE FONT oFont

   @ 48,0 XBROWSE oBrw SIZE 500,0 PIXEL OF oDlg ;
      DATASOURCE oRs COLUMNS "FIRST","CITY","STATE" ;
      CELL LINES NOBORDER

   WITH OBJECT oBrw
      :CreateFromCode()
   END

   @ 050,520 RADIO oRad VAR nState ITEMS "None", "NY", "WA" ;
      SIZE 80,20 PIXEL OF oDlg ON CHANGE ( ;
         oRs:Filter := If( nState == 1, "STATE=NULL", "STATE='" + aStates[ nState ] + "'" ), ;
         oBrw:Refresh(), oDlg:oBar:AEvalWhen() )

   DEFINE WINDOW oWnd MDICHILD OF WndMain() TITLE "Dialog"
   ACTIVATE DIALOG oDlg NOWAIT ;
      ON INIT ( BuildBar( oDlg, oBrw ), ChangeParent( oDlg, oWnd ) )
   oDlg:End()
   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//

static function BuildBar( oDlg, oBrw )

   local oBar

   DEFINE BUTTONBAR oBar OF oDlg SIZE 80,48 2007
   DEFINE BUTTON OF oBar PROMPT "Add"    FILE "c:\fwh\bitmaps\new2.bmp" ;
      ACTION oBrw:EditSource( .t. )
   DEFINE BUTTON OF oBar PROMPT "Modify" FILE "c:\fwh\bitmaps\edit.bmp"  ;
      WHEN oBrw:oRs:RecordCount() > 0 ACTION oBrw:EditSource()
   DEFINE BUTTON OF oBar PROMPT "Delete" FILE "c:\fwh\bitmaps\16x16\delete.bmp" ;
      WHEN oBrw:oRs:RecordCount() > 0 ACTION oBrw:Delete()

return nil

//----------------------------------------------------------------------------//

static function ChangeParent( oDlg, oWnd )

   local oControl

   for each oControl in oDlg:aControls
      SetParent( oControl:hWnd, oWnd:hWnd )
      AAdd( oWnd:aControls, oControl )
      oControl:oWnd  := oWnd
   next

   oWnd:SetSize( oDlg:nWidth, oDlg:nHeight )
   oWnd:SetColor( oDlg:nClrText, oDlg:nClrPane, oDlg:oBrush )

return nil

//----------------------------------------------------------------------------//