TGet bLostFocus yWHEN no entiendo bien la lógica[SOLUCIONADO

TGet bLostFocus yWHEN no entiendo bien la lógica[SOLUCIONADO

Postby VictorCasajuana » Fri Oct 21, 2022 12:02 pm

Hola.
(modifico y simplifico el post de antes)

Estoy realizando unos ajustes y me he topado con algo que a mi parecer es curioso. A ver si me explico, en el siguiente código:

Code: Select all  Expand view  RUN

#include 'fivewin.ch'

Function Main()

    Local oDlg := TDialog():New()
    Local oGet1 := Nil
    Local oGet2 := Nil
    Local cVar1 := 'XXXXXXXXXX'
    Local cVar2 := 'XXXXXXXXXX'

    @ 1, 1 GET oGet1 VAR cVar1 OF oDlg PICTURE '@S20' SIZE 40,10
               oGet1:bLostFocus := {||MsgInfo(1)}

    @ 2, 1 GET oGet2 VAR cVar2 OF oDlg PICTURE "@S20" SIZE 40,10
               oGet2:bLostFocus := {||MsgInfo(2)}

    oDlg:Activate()

Return ( Nil )
 


Cuando pulso enter en el get1 "primero" me evalúa el blostfocus de get2 y luego el blostfocus del get1, por lo que el resultado es primero MsgInfo(2) y luego MsgInfo(1).

Porque lo hace así? en caso de ser esta la forma en que realiza las evaluaciones, hay alguna forma de evaluar primero la salida del get1 antes de nada?

gracias y salud!
Last edited by VictorCasajuana on Tue Oct 25, 2022 10:05 am, edited 1 time in total.
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby Enrico Maria Giordano » Fri Oct 21, 2022 2:48 pm

Try this:

Code: Select all  Expand view  RUN
#include 'fivewin.ch'

Function Main()

    Local oDlg := TDialog():New()
    Local oGet1 := Nil
    Local oGet2 := Nil
    Local cVar1 := 'XXXXXXXXXX'
    Local cVar2 := 'XXXXXXXXXX'

    @ 1, 1 GET oGet1 VAR cVar1 OF oDlg PICTURE '@S20' SIZE 40,10;
           VALID ( MSGINFO(1), .T. )

    @ 2, 1 GET oGet2 VAR cVar2 OF oDlg PICTURE "@S20" SIZE 40,10;
           VALID ( MSGINFO(2), .T. )

    oDlg:Activate()

Return ( Nil )
User avatar
Enrico Maria Giordano
 
Posts: 8718
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Fri Oct 21, 2022 3:00 pm

Enrico Maria Giordano wrote:Try this:

Code: Select all  Expand view  RUN
#include 'fivewin.ch'

Function Main()

    Local oDlg := TDialog():New()
    Local oGet1 := Nil
    Local oGet2 := Nil
    Local cVar1 := 'XXXXXXXXXX'
    Local cVar2 := 'XXXXXXXXXX'

    @ 1, 1 GET oGet1 VAR cVar1 OF oDlg PICTURE '@S20' SIZE 40,10;
           VALID ( MSGINFO(1), .T. )

    @ 2, 1 GET oGet2 VAR cVar2 OF oDlg PICTURE "@S20" SIZE 40,10;
           VALID ( MSGINFO(2), .T. )

    oDlg:Activate()

Return ( Nil )


Thank you Enrico
With Valid it works and this is how I usually implement it, but I consider that bValid is to "validate" the content of the get and for some use cases it is more correct to use the bLostFocus since they are actions to perform when leaving the focus regardless of the content of the get. get. I think bLostFocus is not working properly or I don't quite understand its purpose.
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby karinha » Fri Oct 21, 2022 3:25 pm

Code: Select all  Expand view  RUN

// \samples\JOSE.PRG

#Include "FiveWin.ch"

FUNCTION Main()

   LOCAL oDlg, oGet1, oGet2, cGet1 := "Jose Alvarez       ", ;
         cGet2:= "Cambiando Foco de Jose"
   LOCAL lCambiaJose := .F., aGrad, oClp

   aGrad := { { 0.30, CLR_WHITE, CLR_WHITE },{ 0.50, CLR_WHITE, CLR_WHITE } }

   DEFINE DIALOG oDlg SIZE 400, 300 GRADIENT aGrad

   oDlg:lHelpIcon := .F.

   DEFINE CLIPBOARD oClp OF oDlg

   @ 3, 1 GET oGet1 VAR cGet1 OF oDlg  SIZE 100, 12 PICTURE "@K" UPDATE      ;
      VALID ( MsgInfo( "Valor antes del LostFocus " + cGet1), .T. )

   // Bloquear PASTE y CTRL+V en un GET
   oGet1:bGotFocus := { || oClp:SetText( '' ) }

   oGet1:bChange = { || lCambiaJose := .T. }

   oGet1:bLostFocus := { || If( lCambiaJose, Jose_Focus( oGet1 ), .T. ) }

   @ 5, 1 GET oGet2 VAR cGet2 OF oDlg  SIZE 100, 12 PICTURE "@!" UPDATE

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT( oGet1:bGotFocus := { || oGet1:SetPos( 0 ), Nil },             ;
               oGet1:SetFocus()  )

RETURN NIL

FUNCTION Jose_Focus( oGet1 )

   LOCAL cTxtJose

   cTxtJose := oGet1:cText

   // MsgInfo( "FiveWin The Best: " + cTxtJose )

   oGet1:bGotFocus := { || oGet1:SetPos( 0 ), Nil }

   oGet1:SetFocus()

RETURN( .T. )

// FIN / END

// + Ejemplos:

/*
   REDEFINE GET oGet[17] VAR wTEXTO MULTILINE ID 217 OF oDlg  ;
            COLOR CLR_BLUE, CLR_WHITE UPDATE FONT oFont      ;
            WHEN( lLigaCombo )                                ;
            ON CHANGE( SB_LimitText( oGet[17], oSay, oTransmite ) ) // By AleSB

   // oMemo:bChange   := { | o | if( Len( o:GetText() ) > 500, MsgInfo("longitud maxima excedida","Atencion"), )
   // oGet[17]:bChange := { | o | if( Len( o:GetText() ) > 20, MsgInfo("longitud maxima excedida","Atencion"), )

   /*
   oGet[17]:bChange = { || lCambiado := .T. }

   //oGet[17]:bLostFocus := {|| If(lCambiado, Graba(), nil) }
   oGet[17]:bLostFocus := {|| If(lCambiado, MsgInfo("longitud maxima excedida","Atencion"), nil) }
   */


   // viewtopic.php?f=3&t=34507

   /*
   oGet[17]:bGotFocus = { || oGet[17]:SetSel( 0, 0 ),;
                          oGet[17]:Goto( oGet[17]:GetLineCount() ),;
                          __Keyboard( Chr( VK_END ) ) }
   */

   oGet[17]:bGotFocus = { || oGet[17]:SetSel( 0, 0 ),;
                             oGet[17]:Goto( oGet[17]:GetLineCount() ),;
                             __Keyboard( Chr( VK_HOME ) ) }

   //oGet[17]:bGotFocus = { || oGet[17]:SetSel( 0, 0 ) }

   //oGet[17]:SETPOS(0)

      REDEFINE GET oGet[4] VAR cDest ID 21 OF oDlgEnv MEMO        ;
               FONT oFont1 UPDATE COLORS nRgb(0,0,220),nRgb(253,252,213)    ;
               VALID( CHECA_GET_Dest( ALLTRIM( cDest ) ) ) // ESTA EM RMAIL.PRG

      oGet[4]:bLostFocus := { || oGet[4]:SetColor( CLR_BLACK, CLR_WHITE) }
      oGet[4]:bGotFocus  := { || oGet[4]:SetColor( CLR_BLACK, nRGB( 255,255,45 )), oGet[4]:setsel(0,0) }

*/
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby nageswaragunupudi » Fri Oct 21, 2022 3:45 pm

Please do not use another dialog ( i.e., MsgInfo(..) ) inside bLostFocus code block. This changes focus from current dialog to a new dialog and then comes back.

This test works correctly
Code: Select all  Expand view  RUN
function TestLostFocus()

   local oDlg, oFont, oGet1, oGet2, oSay
   local cVar1 := Space( 10 )
   local cVar2 := Space( 10 )

   SetGetColorFocus()

   DEFINE FONT oFont NAME "VERDANA" SIZE 0,20
   DEFINE DIALOG oDlg SIZE 300,200 PIXEL TRUEPIXEL FONT oFont

   @ 20,20 GET oGet1 VAR cVar1 SIZE 100,30 PIXEL OF oDlg
   oGet1:bLostFocus := { || oSay:SetText( "ONE" ) }
   @ 55,20 GET oGet2 VAR cVar2 SIZE 100,30 PIXEL OF oDlg
   oGet2:bLostFocus := { || oSay:SetText( "TWO" ) }

   @ 100,20 SAY oSay PROMPT "   " SIZE 100,30 PIXEL OF oDlg CENTER VCENTER COLOR CLR_WHITE, CLR_HRED

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

return nil
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10646
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Fri Oct 21, 2022 4:25 pm

nageswaragunupudi wrote:Please do not use another dialog ( i.e., MsgInfo(..) ) inside bLostFocus code block. This changes focus from current dialog to a new dialog and then comes back.

This test works correctly
Code: Select all  Expand view  RUN
function TestLostFocus()

   local oDlg, oFont, oGet1, oGet2, oSay
   local cVar1 := Space( 10 )
   local cVar2 := Space( 10 )

   SetGetColorFocus()

   DEFINE FONT oFont NAME "VERDANA" SIZE 0,20
   DEFINE DIALOG oDlg SIZE 300,200 PIXEL TRUEPIXEL FONT oFont

   @ 20,20 GET oGet1 VAR cVar1 SIZE 100,30 PIXEL OF oDlg
   oGet1:bLostFocus := { || oSay:SetText( "ONE" ) }
   @ 55,20 GET oGet2 VAR cVar2 SIZE 100,30 PIXEL OF oDlg
   oGet2:bLostFocus := { || oSay:SetText( "TWO" ) }

   @ 100,20 SAY oSay PROMPT "   " SIZE 100,30 PIXEL OF oDlg CENTER VCENTER COLOR CLR_WHITE, CLR_HRED

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

return nil


Thanks Master, I hadn't realized that MsgInfo() made me lose focus and return.
Works correctly
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Mon Oct 24, 2022 9:02 am

nageswaragunupudi wrote:Please do not use another dialog ( i.e., MsgInfo(..) ) inside bLostFocus code block. This changes focus from current dialog to a new dialog and then comes back.

This test works correctly
Code: Select all  Expand view  RUN
function TestLostFocus()

   local oDlg, oFont, oGet1, oGet2, oSay
   local cVar1 := Space( 10 )
   local cVar2 := Space( 10 )

   SetGetColorFocus()

   DEFINE FONT oFont NAME "VERDANA" SIZE 0,20
   DEFINE DIALOG oDlg SIZE 300,200 PIXEL TRUEPIXEL FONT oFont

   @ 20,20 GET oGet1 VAR cVar1 SIZE 100,30 PIXEL OF oDlg
   oGet1:bLostFocus := { || oSay:SetText( "ONE" ) }
   @ 55,20 GET oGet2 VAR cVar2 SIZE 100,30 PIXEL OF oDlg
   oGet2:bLostFocus := { || oSay:SetText( "TWO" ) }

   @ 100,20 SAY oSay PROMPT "   " SIZE 100,30 PIXEL OF oDlg CENTER VCENTER COLOR CLR_WHITE, CLR_HRED

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

return nil


I have carried out the tests inside a folder and the result is not what I expected.
the following code
Code: Select all  Expand view  RUN

#include 'fivewin.ch'

static clogfile := 'log.txt'

Function Main()

    Local oDlg  := Nil
    Local oFld  := Nil
    Local oGet1a := Nil
    Local oGet1b := Nil
    Local oGet2a := Nil
    Local oGet2b := Nil
    Local cVar1a := 'XXXXXXXXXX'
    Local cVar1b := 'XXXXXXXXXX'
    Local cVar2a := 'XXXXXXXXXX'
    Local cVar2b := 'XXXXXXXXXX'
   
    ferase( cLogFile )

    TGet():lClrFocus := .T.

    DEFINE DIALOG oDlg TITLE "Test bLostFocus in Folder" ;
        FROM 5, 5 TO 20, 49

    @ 0.5, 1 FOLDER oFld PROMPT "one", "Two" ;
        OF oDlg SIZE 160, 90

    @ 1, 1 GET oGet1a VAR cVar1a OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1a:bLostFocus := {|| Write('FOLDER 1 GET 1')}

    @ 2, 1 GET oGet1b VAR cVar1b OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1b:bLostFocus := {|| Write('FOLDER 1 GET 2')}

    @ 1, 1 GET oGet2a VAR cVar2a OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2a:bLostFocus := {|| Write('FOLDER 2 GET 1')}

    @ 2, 1 GET oGet2b VAR cVar2b OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2b:bLostFocus := {|| Write('FOLDER 2 GET 2')}

    ACTIVATE DIALOG oDlg CENTERED

Return ( Nil )

Static Function Write( cText )

    hb_MemoWrit( cLogFile, hb_MemoRead( cLogFile ) + hb_eol() + Time() + ' ' + cText)

Return ( Nil )
 


When executing it, without performing any action with the keyboard, only when starting the dialog, it already executes the codeblock of some get controls several times. Why does it do this if no action has been taken on them?

This is an example:
Image
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby karinha » Mon Oct 24, 2022 12:45 pm

Buen día. Esta lógica no es correcta. ¿Donde lo vio? Use un botón para grabar, o use GET ACTION, e incluso entonces, necesita botones.

Good Morning. This logic is not correct. Where did you see that? Use a Button for recording, or use the GET ACTION, and even then, you need Buttons.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Mon Oct 24, 2022 12:55 pm

karinha wrote:Buen día. Esta lógica no es correcta. ¿Donde lo vio? Use un botón para grabar, o use GET ACTION, e incluso entonces, necesita botones.

Good Morning. This logic is not correct. Where did you see that? Use a Button for recording, or use the GET ACTION, and even then, you need Buttons.

Regards, saludos.


No se trata de lógica sobre un caso de uso, simplemente quiero tener un codeblock que se ejecute cuando el get pierda el foco ( que sí lo hace correctamente ), pero también se ejecuta cuando se inicia el diálogo con un folder. Seguro que estoy haciendo algo mal pero no lo veo... :shock:
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby karinha » Mon Oct 24, 2022 1:11 pm

Buen día. Si GET pierde el FOCUS, use SETFOCUS( oGet ) o xFocus( oGet )

Code: Select all  Expand view  RUN

//-------------------------------------------------------------------------//
// As vezes simples SetFocus( oObj ) nao faz um objeto ganhar foco
// neste caso pode apelar para estas duas funcoes a seguir
// Forcar foco para um objeto especifico - Ednaldo Rolim...
//-------------------------------------------------------------------------//
FUNCTION xFocus( oObj )

   xSetFocus( oObj )
   xSetFocus( oObj )

RETURN( .T. )

FUNCTION xSetFocus( oObj )    

   LOCAL _oWnd := oObj:oWnd, _oTempo := ""

   DEFINE TIMER _oTempo INTERVAL 10 OF _oWnd ;
          ACTION ( oObj:SetFocus(), _oTempo:End() )

   ACTIVATE TIMER _oTempo

RETURN( .T. )
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Mon Oct 24, 2022 2:38 pm

karinha wrote:Buen día. Si GET pierde el FOCUS, use SETFOCUS( oGet ) o xFocus( oGet )

Code: Select all  Expand view  RUN

//-------------------------------------------------------------------------//
// As vezes simples SetFocus( oObj ) nao faz um objeto ganhar foco
// neste caso pode apelar para estas duas funcoes a seguir
// Forcar foco para um objeto especifico - Ednaldo Rolim...
//-------------------------------------------------------------------------//
FUNCTION xFocus( oObj )

   xSetFocus( oObj )
   xSetFocus( oObj )

RETURN( .T. )

FUNCTION xSetFocus( oObj )    

   LOCAL _oWnd := oObj:oWnd, _oTempo := ""

   DEFINE TIMER _oTempo INTERVAL 10 OF _oWnd ;
          ACTION ( oObj:SetFocus(), _oTempo:End() )

   ACTIVATE TIMER _oTempo

RETURN( .T. )
 


Regards, saludos.


Hola karinha, creo que no me he explicado bien, el problema no es en perder el foco y darle el foco a un get, el problema es que mientras monta el diálogo, se evalúan los codeblocks de bLostFocus si están en un folder.
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby karinha » Mon Oct 24, 2022 3:04 pm

Honestamente no entiendo. ¿Puedes reproducir el problema en una DEMO simple usando FOLDER o FOLDEREX? Ponga el Mega Upload para descargar y probar. Gracias.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby hmpaquito » Mon Oct 24, 2022 3:44 pm

Hola Víctor.

No he usado demasiado bLostFocus. Sí más en táctil
Tu ejemplo y video perfecto para presentar un problema. Si todos se presentasen asi seguro que obtendrian mejor y más ayuda.

Con respecto al tema. Lo que yo haría sería grabar la ristra de procnames al perder el foco para tratar de ver si tiene sentido que bLostFocus se evalue en el momento de cargar el dialogo. Si lo puedes hacer y nos lo pegas por aquí, pues eso que vamos aprendiendo/ recordando todos

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

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby cmsoft » Mon Oct 24, 2022 4:22 pm

Si, efectivamente los arma y ejecuta el bLostFocus, incluso si creamos otro control y le damos el foco el en init.
Code: Select all  Expand view  RUN


#include 'fivewin.ch'

static clogfile := 'log.txt'

Function Main()

    Local oDlg  := Nil
    Local oFld  := Nil
    Local oGet1a := Nil
    Local oGet1b := Nil
    Local oGet2a := Nil
    Local oGet2b := Nil
    Local oBt1, oBt2
    Local cVar1a := 'XXXXXXXXXX'
    Local cVar1b := 'XXXXXXXXXX'
    Local cVar2a := 'XXXXXXXXXX'
    Local cVar2b := 'XXXXXXXXXX'
   
    ferase( cLogFile )

    TGet():lClrFocus := .T.

    DEFINE DIALOG oDlg TITLE "Test bLostFocus in Folder" ;
        FROM 5, 5 TO 20, 49

    @ 0.5, 1 FOLDER oFld PROMPT "one", "Two" ;
        OF oDlg SIZE 160, 90

    @ 1, 1 GET oGet1a VAR cVar1a OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1a:bLostFocus := {|| Write('FOLDER 1 GET 1')}

    @ 2, 1 GET oGet1b VAR cVar1b OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1b:bLostFocus := {|| Write('FOLDER 1 GET 2')}
    @ 3,1 BUTTON oBt1 PROMPT "OK" OF oFld:aDialogs[1]          

    @ 1, 1 GET oGet2a VAR cVar2a OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2a:bLostFocus := {|| Write('FOLDER 2 GET 1')}

    @ 2, 1 GET oGet2b VAR cVar2b OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2b:bLostFocus := {|| Write('FOLDER 2 GET 2')}
    @ 3,1 BUTTON oBt2 PROMPT "OK" OF oFld:aDialogs[2]          

    ACTIVATE DIALOG oDlg CENTERED ON INIT oBt1:SetFocus()

Return ( Nil )

Static Function Write( cText )

    hb_MemoWrit( cLogFile, hb_MemoRead( cLogFile ) + hb_eol() + Time() + ' ' + cText)

Return ( Nil )

 

Log
Code: Select all  Expand view  RUN

13:16:32 FOLDER 1 GET 1
13:16:32 FOLDER 1 GET 1
13:16:32 FOLDER 2 GET 1
13:16:32 FOLDER 2 GET 1
13:16:32 FOLDER 1 GET 1
 


Ahora, si creamos primero los botones y luego los gets, no genera nada en el log, excepto que efectivamente perdamos el foco del get
Code: Select all  Expand view  RUN


#include 'fivewin.ch'

static clogfile := 'log.txt'

Function Main()

    Local oDlg  := Nil
    Local oFld  := Nil
    Local oGet1a := Nil
    Local oGet1b := Nil
    Local oGet2a := Nil
    Local oGet2b := Nil
    Local oBt1, oBt2
    Local cVar1a := 'XXXXXXXXXX'
    Local cVar1b := 'XXXXXXXXXX'
    Local cVar2a := 'XXXXXXXXXX'
    Local cVar2b := 'XXXXXXXXXX'
   
    ferase( cLogFile )

    TGet():lClrFocus := .T.

    DEFINE DIALOG oDlg TITLE "Test bLostFocus in Folder" ;
        FROM 5, 5 TO 20, 49

    @ 0.5, 1 FOLDER oFld PROMPT "one", "Two" ;
        OF oDlg SIZE 160, 90
    @ 3,1 BUTTON oBt1 PROMPT "OK" OF oFld:aDialogs[1]              
    @ 1, 1 GET oGet1a VAR cVar1a OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1a:bLostFocus := {|| Write('FOLDER 1 GET 1')}

    @ 2, 1 GET oGet1b VAR cVar1b OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1b:bLostFocus := {|| Write('FOLDER 1 GET 2')}
   
    @ 3,1 BUTTON oBt2 PROMPT "OK" OF oFld:aDialogs[2]  
    @ 1, 1 GET oGet2a VAR cVar2a OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2a:bLostFocus := {|| Write('FOLDER 2 GET 1')}

    @ 2, 1 GET oGet2b VAR cVar2b OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2b:bLostFocus := {|| Write('FOLDER 2 GET 2')}
             

    ACTIVATE DIALOG oDlg CENTERED ON INIT oBt1:SetFocus()

Return ( Nil )

Static Function Write( cText )

    hb_MemoWrit( cLogFile, hb_MemoRead( cLogFile ) + hb_eol() + Time() + ' ' + cText)

Return ( Nil )
 
User avatar
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: TGet bLostFocus y WHEN no entiendo bien la lógica...

Postby VictorCasajuana » Mon Oct 24, 2022 5:16 pm

karinha wrote:Honestamente no entiendo. ¿Puedes reproducir el problema en una DEMO simple usando FOLDER o FOLDEREX? Ponga el Mega Upload para descargar y probar. Gracias.

Regards, saludos.

Al principio de este post he puesto el fuente y gif que representa el problema.

cmsoft wrote:Ahora, si creamos primero los botones y luego los gets, no genera nada en el log, excepto que efectivamente perdamos el foco del get
Code: Select all  Expand view  RUN


#include 'fivewin.ch'

static clogfile := 'log.txt'

Function Main()

    Local oDlg  := Nil
    Local oFld  := Nil
    Local oGet1a := Nil
    Local oGet1b := Nil
    Local oGet2a := Nil
    Local oGet2b := Nil
    Local oBt1, oBt2
    Local cVar1a := 'XXXXXXXXXX'
    Local cVar1b := 'XXXXXXXXXX'
    Local cVar2a := 'XXXXXXXXXX'
    Local cVar2b := 'XXXXXXXXXX'
   
    ferase( cLogFile )

    TGet():lClrFocus := .T.

    DEFINE DIALOG oDlg TITLE "Test bLostFocus in Folder" ;
        FROM 5, 5 TO 20, 49

    @ 0.5, 1 FOLDER oFld PROMPT "one", "Two" ;
        OF oDlg SIZE 160, 90
    @ 3,1 BUTTON oBt1 PROMPT "OK" OF oFld:aDialogs[1]              
    @ 1, 1 GET oGet1a VAR cVar1a OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1a:bLostFocus := {|| Write('FOLDER 1 GET 1')}

    @ 2, 1 GET oGet1b VAR cVar1b OF oFld:aDialogs[1] PICTURE '@S20' SIZE 40,10
               oGet1b:bLostFocus := {|| Write('FOLDER 1 GET 2')}
   
    @ 3,1 BUTTON oBt2 PROMPT "OK" OF oFld:aDialogs[2]  
    @ 1, 1 GET oGet2a VAR cVar2a OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2a:bLostFocus := {|| Write('FOLDER 2 GET 1')}

    @ 2, 1 GET oGet2b VAR cVar2b OF oFld:aDialogs[2] PICTURE '@S20' SIZE 40,10
               oGet2b:bLostFocus := {|| Write('FOLDER 2 GET 2')}
             

    ACTIVATE DIALOG oDlg CENTERED ON INIT oBt1:SetFocus()

Return ( Nil )

Static Function Write( cText )

    hb_MemoWrit( cLogFile, hb_MemoRead( cLogFile ) + hb_eol() + Time() + ' ' + cText)

Return ( Nil )
 


"deduzco" por tu código que al crear los folder en el init e insertarlos en el Diálogo, por algún motivo evalúa los bLostFocus de los get, en cambio no lo hace con los botones. Curioso, aunque no creo que es lo correcto, en teoría tendría que tener el mismo comportamiento si se crea un diálogo sin folders o con folders.
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 265
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 43 guests