como configurar foco no textbox?

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

pena
Usuário Nível 3
Usuário Nível 3
Mensagens: 331
Registrado em: 06 Jul 2004 18:08
Localização: CACHOEIRA DO SUL-RS

como configurar foco no textbox?

Mensagem por pena »

Bom dia pessoal, seguinte, quando usamos o enter ou o tab para mudar de campo entre textbox a coisa flui normalmente, ou seja, vc inicializou uma variavel e disse que ela seria zero, no momento em que cai no textbox, ele tipo seleciona todo campo e vc digita qq numero que ira substituir o zero, porem se ir com o mouse ate o textbox, ele não seleciona todo conteudo, vc clica no textbox e fica o zero la, e quando vai digitar por exemplo o 1, ao sair do campo fica 10, como resolver isso?

var:= 0

DEFINE TEXTBOX T_tcredito
ROW 140
COL 595
WIDTH 120
HEIGHT 24
INPUTMASK "999,999.99"
NUMERIC .T.
VALUE var
END TEXTBOX
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

como configurar foco no textbox?

Mensagem por HASA »

:-O
Esse é um problema me parece ter sido herdado do excel ou coisa parecida, então se for apontar o mouse para um textbox oriento os clientes a selecionar o campo e NÃO clicar lá dentro em qualquer lugar, se selecionar e digitar fica valendo o que digitar se clicar o valor que estiver no campo ficará lá juntando ao que digitar fazenfo um 1 + 0 = 10 ok.
Hasa
:-o
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á

como configurar foco no textbox?

Mensagem por Pablo César »

Pois é... esse efeito que causa ao clicar dentro do TEXT_BOX dependendo a posição, pode gerar um resultado indesejável. Quando isso acontecia num GET no Clipper era fácil manipular o objeto, eu as vezes dava um KEYBOARD CHR(25) que simula um Ctrl Y (apaga conteúdo) e posicionava-me no primeiro lugar do GET COM OUTRO KEYBOARD CHR(1) que aciona a tecla Home. Tentei fazer esta simulação chamando uma função própria através do GETFOCUS e acionando KEYBOARD mas nenhuma tecla foi produzida. Talvez algo possa ser feito em C como neste exemplo que serve pra ler o teclado mas teria quer ser para enviar uma tecla como se fosse pressionado (um SET).

Código: Selecionar todos

****************************************************************************
* PROGRAMA: READ THE KEYBOARD
* LENGUAJE: HARBOUR-MINIGUI 3.0.29
* FECHA:    13 ABRIL 2010
* AUTOR:    CLAUDIO SOTO
* PAIS:     URUGUAY
* E-MAIL:   srvet@adinet.com.uy
****************************************************************************

#include "minigui.ch"

FUNCTION MAIN

foco := ""
   
   DEFINE WINDOW frmMain ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT 400 ;
      TITLE "VENTANA A" ;
      MAIN;
      ON GOTFOCUS {|| foco := "A"}


      @ 10 , 10 LABEL Label_1 VALUE "PRESIONE: A, B, C, Z o alguna otra tecla" AUTOSIZE
     
* MUY IMPORTANTE *********************************
      INSTALL_READ_KEYBOARD ()                                  // <=== Instala el manejador del teclado, esto solo lo que
                                                                //      hace es almacenar en una varibale la tecla presionada
                                                                //      y GET_LAST_VK() devuelve el valor de dicha variable.
                                                                       
     DEFINE TIMER timer_1 INTERVAL 100 ACTION _EvalKeyPress( ) // <== Esto es lo que llama la funcion que procesa las teclas
    
**************************************************     
         
   END WINDOW

   frmMain.CENTER
   frmMain.ACTIVATE
RETURN





PROCEDURE _EvalKeyPress( )
   LOCAL nKeyPress := GET_LAST_VK( )
   
   If ( nKeyPress >= 65 .AND. nKeyPress <= 90 )
     
* MUY IMPORTANTE *********************************************     
      PAUSE_READ_VK (.T.) // pausa la lectura del teclado para procesar la tecla presionada
      frmMain.Timer_1.Enabled := .F.
**************************************************************       
       
       DO CASE
          CASE nKeyPress = 65
               frmMain.setfocus
                   
          CASE nKeyPress = 66
               Ventana2 ()
               
          CASE nKeyPress = 67
               Ventana3 ()
         
          CASE nKeyPress = 90
               MsgBox ("El Foco lo tiene la ventana: "+ foco)
         
          OTHERWISE
               MsgBox( "La tecla oprimida se encuentra en el rango","Test..." )     
       ENDCASE   
       
* MUY IMPORTANTE **************************************************     
      frmMain.Timer_1.Enabled := .T.
      PAUSE_READ_VK (.F.) // restablece la lectura del teclado luego de la pausa
*******************************************************************
 
   Endif
RETURN 
   


Procedure Ventana2

if IsWindowDefined  (Vent2) = .F.
   DEFINE WINDOW Vent2 ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT 400 ;
      TITLE "VENTANA B" ;
      CHILD;
      ON GOTFOCUS {|| foco := "B"}
     
   END WINDOW
   
* MUY IMPORTANTE **** SIEMPRE ANTES DEL ACTIVE WINDOW*********   
   frmMain.Timer_1.Enabled := .T.
   PAUSE_READ_VK (.F.) // restablece la lectura del teclado
**************************************************************   
   
   vent2.ACTIVATE
   
ELSE
   vent2.setfocus   
ENDIF

Return


Procedure Ventana3

if IsWindowDefined  (Vent3) = .F.
   DEFINE WINDOW Vent3 ;
      AT 100,100 ;
      WIDTH 400 ;
      HEIGHT 400 ;
      TITLE "VENTANA C" ;
      CHILD;
      ON GOTFOCUS {|| foco := "C"}
     
   END WINDOW

* MUY IMPORTANTE **** SIEMPRE ANTES DEL ACTIVE WINDOW*********   
   frmMain.Timer_1.Enabled := .T.
   PAUSE_READ_VK (.F.) // restablece la lectura del teclado
**************************************************************   
   
   vent3.ACTIVATE
   
ELSE
   vent3.setfocus   
ENDIF

Return



*#########################################################################################################################
*   FUNCIONES EN C       
*#########################################################################################################################

#pragma begindump

#include <windows.h>
#include "hbapi.h"

BOOL flag_hhk = FALSE;
BOOL PAUSE_hhk = FALSE;
HHOOK hhk = NULL;
long VK_PRESIONADO = 0;
LONG VK_lParam = 0;


LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(hhk, nCode, wParam, lParam);
       
    if (PAUSE_hhk == FALSE)
    {   VK_PRESIONADO = (long) wParam;
        VK_lParam = (LONG) lParam;
    }
    else   
    {   VK_PRESIONADO = 0;
        VK_lParam = 0;
    }   
   
    return CallNextHookEx(hhk, nCode, wParam, lParam);
}


HB_FUNC (GET_STATE_VK_SHIFT)
{
   if (GetKeyState(VK_SHIFT) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}


HB_FUNC (GET_STATE_VK_CONTROL)
{
   if (GetKeyState(VK_CONTROL) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}


HB_FUNC (GET_STATE_VK_ALT)
{
   if (GetKeyState(VK_MENU) & 0x8000)
       hb_retl (TRUE);
   else   
       hb_retl (FALSE);
}


HB_FUNC (GET_LAST_VK)
{  if (flag_hhk == TRUE)
       hb_retnl (VK_PRESIONADO);
   else
      hb_retnl (0);   
}


HB_FUNC (GET_LAST_VK_NAME)
{  CHAR cadena [128];

   if (flag_hhk == TRUE)
      {  GetKeyNameText (VK_lParam, (LPTSTR) &cadena, 128);
         hb_retc (cadena);
      }
   else
      hb_retc ("");   
}


HB_FUNC (PAUSE_READ_VK)
{  if (hb_pcount () == 1 && hb_parinfo (1) == HB_IT_LOGICAL)   
   {   if (hb_parl (1) == TRUE)
       {   VK_PRESIONADO = 0;
           VK_lParam = 0;
       }     
       PAUSE_hhk = hb_parl (1);
   }
}


HB_FUNC (INSTALL_READ_KEYBOARD)
{  if (flag_hhk == FALSE)
   {    hhk = SetWindowsHookEx (WH_KEYBOARD, KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId());
       
        if (hhk == NULL)
            hb_retl (FALSE);
        else
        {   flag_hhk = TRUE;   
            hb_retl (TRUE);                       
        }   
   }
   else
      hb_retl (TRUE);     
}


HB_FUNC (UNINSTALL_READ_KEYBOARD)
{  if (flag_hhk == TRUE)
   {   if (UnhookWindowsHookEx (hhk) == TRUE)
       {   flag_hhk = FALSE;
           hb_retl (TRUE);           
       }
       else
           hb_retl (FALSE);   
   }
   else
      hb_retl (TRUE);     
}

#pragma enddump
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.
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

como configurar foco no textbox?

Mensagem por HASA »

:-O
É verdade, agora vamos aguardar tem feras no forum que até podem fazer isso, eu infelizmente não tenho conhecimento para tanto, ok
:%
Hasa
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

como configurar foco no textbox?

Mensagem por asimoes »

Olá,

Teste isso:

Código: Selecionar todos

var:= 0

DEFINE TEXTBOX T_tcredito
ROW 140
COL 595
WIDTH 120
HEIGHT 24
INPUTMASK "999,999.99"
NUMERIC .T.
VALUE var
ON GOTFOCUS  {||LimparCampo()}
END TEXTBOX

FUNCTION LimparCampo
nHandle  := GetControlHandle( 'Text_1', 'test' )
CLEAR_TEXT( nHandle )
RETURN Nil

#pragma BEGINDUMP


#include <windows.h>
#include "hbapi.h"


/*

   Clear_Text( nHandle )
      
*/

HB_FUNC( CLEAR_TEXT )
{
   SetFocus( (HWND) hb_parnl( 1 ) );
   SendMessage( ( HWND ) hb_parnl( 1 ), WM_CLEAR, 0 , 0 );
}

/*

   Paste_Text( nHandle )
   Paste text from the clipboard into the window

*/

HB_FUNC( PASTE_TEXT )
{
   SetFocus( ( HWND ) hb_parnl( 1 ) );
   SendMessage( ( HWND ) hb_parnl( 1 ), WM_PASTE, 0 , 0 );
}


#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
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á

como configurar foco no textbox?

Mensagem por Pablo César »

Yeahhh ! Obrigado Simões ! Essa pode ser uma boa idéia, claro que a função pode ser melhorada, imaginemos que ao clicar novamente no Text_Box tenha apagado o seu conteúdo anterior e deseja sair sem alterar, podendo restaurar seu valor ao pressionar ESC para sair do focus. Compilei o seu exemplo e deixei a função mais flexivel assim serveria para outros campos.

Código: Selecionar todos

#include <hmg.ch>

Function Main
var1:= 0 ; var2:= 0
DEFINE WINDOW Form_1 ;
	AT 0,0 ;
	WIDTH 640 ;
	HEIGHT 480 ;
	TITLE 'Hello World!' ;
	MAIN 

	DEFINE TEXTBOX Text_1
		ROW 140
		COL 195
		WIDTH 120
		HEIGHT 24
		INPUTMASK "999,999.99"
		NUMERIC .T.
		VALUE var1
		ON GOTFOCUS  {||LimparCampo()}
	END TEXTBOX
	
	DEFINE TEXTBOX Text_2
		ROW 240
		COL 195
		WIDTH 120
		HEIGHT 24
		INPUTMASK "999,999.99"
		NUMERIC .T.
		VALUE var2
		ON GOTFOCUS  {||LimparCampo()}
	END TEXTBOX
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1    
Return Nil

FUNCTION LimparCampo()
nHandle  := GetControlHandle( This.Name,ThisWindow.Name )
CLEAR_TEXT( nHandle )
RETURN Nil

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

/*

   Clear_Text( nHandle )
      
*/

HB_FUNC( CLEAR_TEXT )
{
   SetFocus( (HWND) hb_parnl( 1 ) );
   SendMessage( ( HWND ) hb_parnl( 1 ), WM_CLEAR, 0 , 0 );
}

/*

   Paste_Text( nHandle )
   Paste text from the clipboard into the window

*/

HB_FUNC( PASTE_TEXT )
{
   SetFocus( ( HWND ) hb_parnl( 1 ) );
   SendMessage( ( HWND ) hb_parnl( 1 ), WM_PASTE, 0 , 0 );
}

#pragma ENDDUMP
Ficou legal e parabéns colega pela sua idéia.
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.
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á

como configurar foco no textbox?

Mensagem por Pablo César »

Eu escreveu:Text_Box tenha apagado o seu conteúdo anterior e deseja sair sem alterar, podendo restaurar seu valor ao pressionar ESC para sair do focus
Pensando bem... isto iria demandar um monte de código e não sei se iria ficar bem isso. De todas formas, temos que deixar de lado o antigo conceito comportamental, pois as aplicações GUI não ficam monitorando as teclas pressionadas como era feito no Clipper, então o usuário também terá que fazer a sua parte e aceitar um novo conceito.
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.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

como configurar foco no textbox?

Mensagem por asimoes »

O código pode ser melhorado.

Código: Selecionar todos

Function Main

PRIVATE nLastValue:=0, nVar1:=0, nVar2:=0
DEFINE WINDOW Form_1 ;
   AT 0,0 ;
   WIDTH 640 ;
   HEIGHT 480 ;
   TITLE 'Hello World!' ;
   MAIN 
 	
   DEFINE TEXTBOX Text_1
      ROW 140
      COL 195
      WIDTH 120
      HEIGHT 24
      INPUTMASK "999,999.99"
      NUMERIC .T.
      VALUE nVar1
      ON GOTFOCUS  {||LimparCampo()}
      ON LOSTFOCUS {||nVar1:=This.Value}
   END TEXTBOX
   
   DEFINE TEXTBOX Text_2
      ROW 240
      COL 195
      WIDTH 120
      HEIGHT 24
      INPUTMASK "999,999.99"
      NUMERIC .T.
      VALUE nVar2
      ON GOTFOCUS  {||LimparCampo()}
      ON LOSTFOCUS {||nVar2:=This.Value}
   END TEXTBOX
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1    
Return Nil

FUNCTION UndoCampo(cCampo,cJanela)
IF cCampo = "Text_1"
   Form_1.Text_1.Value:=nVar1
   Form_1.Text_1.SetFocus
ELSE
   Form_1.Text_2.Value:=nVar2
   Form_1.Text_2.SetFocus
ENDIF
RETURN .T.

FUNCTION LimparCampo
Local cFrmName:=thiswindow.name, cObjName:=This.Name
nHandle:=GetControlHandle( This.Name,ThisWindow.Name )
CLEAR_TEXT( nHandle )
ON KEY ESCAPE OF &cFrmName ACTION UndoCampo(cObjName,cFrmName)
RETURN Nil
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
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á

como configurar foco no textbox?

Mensagem por Pablo César »

Ficou jóia ! Parabéns !
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.
Responder