Página 1 de 1

Passar o Foco para TextBox estando em Grid (HeadClick) !

Enviado: 27 Jun 2012 13:00
por Imatech
Evento: Header Click

Objetivo: Passar o Foco para TextBox ( SetFocus não funciona ! )

Como resolver ?

Código: Selecionar todos


#include <hmg.ch>

* Temporary Table Test by Grigory Filatov
* Slightly modified by Roberto Lopez

Function Main

CreateTemp()
   
   define window winMain ;
      at 0, 0 ;
      width 800 height 600 main ;
      title 'Passando o foco do controle GRID para TextBox : Não funciona !' ;
      ON INIT winMain.brwTemp.SetFocus()
      
      DEFINE TEXTBOX Text_1
            ROW    10
            COL    10
            WIDTH 580
            VALUE 'Hi!!!' 
            TOOLTIP 'TextBox' 
            MAXLENGTH 16 
            LOWERCASE .T.
            ONLOSTFOCUS MsgInfo('Text_1: Why Lost Focus !') 
            ONENTER MsgInfo('Enter pressed')
      END TEXTBOX

      DEFINE LABEL Label_1
         ROW   70
         COL   10
         VALUE    'Header Click: muda o foco para o TextBox (ou deveria !)'
         WIDTH    580
      END LABEL

      DEFINE GRID brwTemp
         COL 10
         ROW 100
         WIDTH 520
         HEIGHT 420
         HEADERS {"Item Code", "Item Description", "Rate"}
         WIDTHS {125, 300, 100}
         ROWSOURCE "curItem"
         COLUMNFIELDS {"itemcd", "itemnm", "rate"}
         ONHEADCLICK { {|| winMain.Text_1.SetFocus() }, { || winMain.Text_1.SetFocus() }, { || winMain.Text_1.SetFocus() } } 
      END GRID
      
   end window
   
   winMain.center
   winMain.activate

Return

function CreateTemp()
   local i := 0
   local aDbf := {}
   aadd(adbf,   {"itemcd", "c",   10, 0})
   aadd(adbf,   {"itemnm", "c",   40,   0})
   aadd(adbf,   {"rate",   "n",    8, 2})
   
   if !hb_dbcreatetemp("curItem", adbf)
      msgbox("Cannot create temporary table: Item")
      RELEASE WINDOW ALL
      return nil
   endif
   
   if select("curItem") = 0
      use curItem new
   endif
   select curItem

   FOR i := 1 To 10
     append blank
     curItem->itemcd := "CD_" + STRZERO( i, 7)
     curItem->itemnm := "Compact Disc Number " + STR( i, 15)
     curItem->rate := i
     unlock
   NEXT

return nil


Passar o Foco para TextBox estando em Grid (HeadClick) !

Enviado: 27 Jun 2012 19:57
por Pablo César
Oi Ronaldo, na linha 25 do seu código exemplo, substitua por:

ONLOSTFOCUS { ||MsgInfo('Text_1: Why Lost Focus !'),winMain.Text_1.SetFocus}

Passar o Foco para TextBox estando em Grid (HeadClick) !

Enviado: 27 Jun 2012 20:26
por Imatech
Olá Pablo !

Obrigado pela sugestão... mas
Na prática cria um problema maior... kkk

Pois o uso de outros componentes fica comprometido...

Exemplo: com dica do Pablo

Código: Selecionar todos


#include <hmg.ch>

* Temporary Table Test by Grigory Filatov
* Slightly modified by Roberto Lopez

Function Main

CreateTemp()
   
   define window winMain ;
      at 0, 0 ;
      width 800 height 600 main ;
      title "Changing focus grom GRID to TextBox : Doesn't Work !" ;
      ON INIT {|| winMain.Text_1.SetFocus() }
      
      DEFINE TEXTBOX Text_1
            ROW    10
            COL    10
            WIDTH 580
            VALUE '' 
            MAXLENGTH 16 
            LOWERCASE .T.
            ONLOSTFOCUS {|| winMain.Text_1.SetFocus() }
      END TEXTBOX

      DEFINE TEXTBOX Text_2
            ROW    40
            COL    10
            WIDTH 580
            VALUE '' 
            MAXLENGTH 16 
            LOWERCASE .T.
      END TEXTBOX

      DEFINE LABEL Label_1
         ROW   80
         COL   10
         VALUE    "HeadClick: Change focus grom GRID to TextBox : But doesn't Work !"
         WIDTH    580
      END LABEL

      DEFINE GRID brwTemp
         COL 10
         ROW 100
         WIDTH 520
         HEIGHT 420
         HEADERS {"Item Code", "Item Description", "Rate"}
         WIDTHS {125, 300, 100}
         ROWSOURCE "curItem"
         COLUMNFIELDS {"itemcd", "itemnm", "rate"}
         ONHEADCLICK { {|| winMain.Text_1.SetFocus() }, { || winMain.Text_1.SetFocus() }, { || winMain.Text_1.SetFocus() } } 
      END GRID
      
   end window
   
   winMain.center
   winMain.activate

Return

function CreateTemp()
   local i := 0
   local aDbf := {}
   aadd(adbf,   {"itemcd", "c",   10, 0})
   aadd(adbf,   {"itemnm", "c",   40,   0})
   aadd(adbf,   {"rate",   "n",    8, 2})
   
   if !hb_dbcreatetemp("curItem", adbf)
      msgbox("Cannot create temporary table: Item")
      RELEASE WINDOW ALL
      return nil
   endif
   
   if select("curItem") = 0
      use curItem new
   endif
   select curItem

   FOR i := 1 To 10
     append blank
     curItem->itemcd := "CD_" + STRZERO( i, 7)
     curItem->itemnm := "Compact Disc Number " + STR( i, 15)
     curItem->rate := i
     unlock
   NEXT

return nil


Passar o Foco para TextBox estando em Grid (HeadClick) !

Enviado: 28 Jun 2012 13:29
por Imatech
A gambiarra que teria funcionamento em alguns casos seria:
ON LOSTFOCUS {|| IIF( Empty( This.Value ), This.SetFocus(), NIL ) }

Entretanto no evento HeadClick teria que sempre apagar o conteudo do TEXTBOX, para a necessidade de se preservar o Texto tal gambiarra não funciona...

Código: Selecionar todos


17            DEFINE TEXTBOX Text_1
18	            ROW    10
19	            COL    10
20	            WIDTH 580
21	            VALUE ''
22	            MAXLENGTH 16
23	            LOWERCASE .T.
24	            ONLOSTFOCUS {|| IIF( Empty( This.Value ), This.SetFocus(), NIL ) }
25	      END TEXTBOX


Passar o Foco para TextBox estando em Grid (HeadClick) !

Enviado: 28 Jun 2012 15:53
por Imatech
Exemplo utilizando solução definitiva: Var lHeadClicked


Creditos: Sr.: Rathinagiri ( Adm HMG Forum)
HeadClick is an event which is getting completed by returning the focus to the grid. Therefore, after setting the focus to the textbox, it returns to the grid.

Código: Selecionar todos

#include <hmg.ch>

* Temporary Table Test by Grigory Filatov
* Slightly modified by Roberto Lopez

Function Main
Local lHeadClicked := .f.

CreateTemp()
   
   define window winMain ;
      at 0, 0 ;
      width 800 height 600 main ;
      title "Changing focus grom GRID to TextBox : Doesn't Work !" ;
      ON INIT winMain.brwTemp.SetFocus()
     
      DEFINE TEXTBOX Text_1
            ROW    10
            COL    10
            WIDTH 580
            VALUE 'Hi!!!'
            TOOLTIP 'TextBox'
            MAXLENGTH 16
            LOWERCASE .T.
//            ONLOSTFOCUS MsgInfo('Text_1: Why Lost Focus !')
//          ONENTER MsgInfo('Enter pressed')
      END TEXTBOX

      DEFINE LABEL Label_1
         ROW   70
         COL   10
         VALUE    "HeadClick: Change focus grom GRID to TextBox : But doesn't Work !"
         WIDTH    580
      END LABEL

      DEFINE GRID brwTemp
         COL 10
         ROW 100
         WIDTH 520
         HEIGHT 420
         HEADERS {"Item Code", "Item Description", "Rate"}
         ongotfocus iif( lHeadClicked, ( winMain.Text_1.SetFocus(), lHeadClicked := .f. ) , )
         WIDTHS {125, 300, 100}
         ROWSOURCE "curItem"
         COLUMNFIELDS {"itemcd", "itemnm", "rate"}
         ONHEADCLICK { {|| winMain.Text_1.SetFocus(),lHeadClicked := .t. }, { || winMain.Text_1.SetFocus(),lHeadClicked := .t. }, { || winMain.Text_1.SetFocus(),lHeadClicked := .t. } }
      END GRID
     
   end window
   
   winMain.center
   winMain.activate

Return

function CreateTemp()
   local i := 0
   local aDbf := {}
   aadd(adbf,   {"itemcd", "c",   10, 0})
   aadd(adbf,   {"itemnm", "c",   40,   0})
   aadd(adbf,   {"rate",   "n",    8, 2})
   
   if !hb_dbcreatetemp("curItem", adbf)
      msgbox("Cannot create temporary table: Item")
      RELEASE WINDOW ALL
      return nil
   endif
   
   if select("curItem") = 0
      use curItem new
   endif
   select curItem

   FOR i := 1 To 10
     append blank
     curItem->itemcd := "CD_" + STRZERO( i, 7)
     curItem->itemnm := "Compact Disc Number " + STR( i, 15)
     curItem->rate := i
     unlock
   NEXT

return nil