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

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

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

Mensagem 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

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

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

Mensagem 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}
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

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

Mensagem 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

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

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

Mensagem 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

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

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

Mensagem 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
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Responder