Hwgui / on lostfocus/ dehilite()
Enviado: 15 Set 2006 09:18
Olá fórum,
recentemente, o Alexander me deu uma dica para, com uma função, implementar um dehilite() no browse com a hwgui, que não tem o método.
Assim, coloquei o método no evento ON LOSTFOCUS, de modo que a barra de destaque fosse desabilitada quando o browse perdesse o foco.
A ação principal funciona, mas o foco não é transferido para os botões ou outros objetos, nem mesmo com o mouse.
O que pode ser ? É um bug?
Como resolver o problema?
Este é um código criado que mostra a situação.
#define x_BLUE 16711680
#define x_DARKBLUE 10027008
#define x_WHITE 16777215
#define x_CYAN 16776960
#define x_BLACK 0
#define x_RED 255
#define x_GREEN 32768
#define x_GRAY 8421504
#define x_YELLOW 65535
#include "windows.ch"
#include "guilib.ch"
FUNCTION MAIN()
LOCAL oMain, otest:="Maria helena"
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
CRIADBF()
INIT WINDOW oMain MAIN TITLE "Simple the best" ;
AT 0,0 ;
SIZE GetDesktopWidth(), GetDesktopHeight() - 28
MENU OF oMain
MENU TITLE "&Teste"
MENUITEM "Teste";
ACTION test1()
SEPARATOR
MENUITEM "Sair";
ACTION oMain:Close()
ENDMENU
ENDMENU
ACTIVATE WINDOW oMain
RETURN
FUNCTION test1()
//--------------
LOCAL oFont, oForm
LOCAL aComboBox, oComboBox, oEditBox
LOCAL oBmp
LOCAL oBrowse
aComboBox:={"asa1","asa2","asa3","asa4","asa5"}
oComboBox:=1
USE TESTE EXCLUSIVE
PREPARE FONT oFont NAME "Courier New" WIDTH 0 HEIGHT -11
INIT DIALOG oForm NOEXIT TITLE HB_OEMTOANSI("Cadastro - àrgÆo");
AT 000,000;
FONT oFont ;
SIZE 700,425;
STYLE DS_CENTER + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU
@ 005,000 SAY "Ordenar e/ou pesquisar por :";
SIZE 200,022
@ 005,022 COMBOBOX oComboBox;
ITEMS aComboBox;
SIZE 100,150;
STYLE WS_TABSTOP;
TOOLTIP "Selecione para ordenar a coluna"
@ 110,022 EDITBOX oEditBox;
SIZE 585,022;
STYLE WS_TABSTOP;
TOOLTIP "Digite o argumento para pesquisa"
@ 005,050 BROWSE oBrowse DATABASE OF oForm SIZE 690,325;
ON LOSTFOCUS {|ob|Deselect(ob)}; // Se desabilitar essa linha o foco funciona beleza
STYLE WS_VSCROLL + WS_HSCROLL + WS_TABSTOP
ADD COLUMN FieldBlock(Fieldname(1)) TO oBrowse;
HEADER HB_OEMTOANSI("C¢digo");
LENGTH 8;
PICTURE "999999";
JUSTIFY HEAD DT_CENTER;
JUSTIFY LINE DT_CENTER
ADD COLUMN FieldBlock(Fieldname(2)) TO oBrowse;
HEADER "Nome";
LENGTH 35;
PICTURE "@!";
JUSTIFY HEAD DT_CENTER;
JUSTIFY LINE DT_LEFT
@ 005,380 BUTTON "&Inserir" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 135,380 BUTTON "&Alterar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 265,380 BUTTON "&Excluir" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 395,380 BUTTON "&Visualizar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 525,380 BUTTON "&Retornar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
ACTIVATE DIALOG oForm
RETURN
FUNCTION CRIADBF()
LOCAL aCampos
IF !FILE("TESTE.DBF")
aCampos:={{"CAMPO1","C",06,00},;
{"CAMPO2","C",35,00},;
{"CAMPO3","C",35,00}}
DBCREATE("TESTE.DBF",aCampos)
USE TESTE EXCLUSIVE
DBAPPEND()
FIELDPUT(1,"000001")
FIELDPUT(2,"Registro 000001")
FIELDPUT(3,"Registro 000001")
DBCOMMIT()
DBAPPEND()
FIELDPUT(1,"000002")
FIELDPUT(2,"Registro 000002")
FIELDPUT(3,"Registro 000002")
DBCOMMIT()
USE
ENDIF
//Conforme dica do Alexander
Function Deselect(oBrowse)
Local brushSel := oBrowse:brushSel, bcolorSel := oBrowse:bcolorSel, tcolorSel := oBrowse:tcolorSel
oBrowse:brushSel := oBrowse:brush
oBrowse:bcolorSel:= oBrowse:bcolor
oBrowse:tcolorSel:= oBrowse:tcolor
oBrowse:RefreshLine() //se deixar somente essa linha o erro persiste
oBrowse:brushSel := brushSel
oBrowse:bcolorSel:= bcolorSel
oBrowse:tcolorSel:= tcolorSel
Return .t.
recentemente, o Alexander me deu uma dica para, com uma função, implementar um dehilite() no browse com a hwgui, que não tem o método.
Assim, coloquei o método no evento ON LOSTFOCUS, de modo que a barra de destaque fosse desabilitada quando o browse perdesse o foco.
A ação principal funciona, mas o foco não é transferido para os botões ou outros objetos, nem mesmo com o mouse.
O que pode ser ? É um bug?
Como resolver o problema?
Este é um código criado que mostra a situação.
#define x_BLUE 16711680
#define x_DARKBLUE 10027008
#define x_WHITE 16777215
#define x_CYAN 16776960
#define x_BLACK 0
#define x_RED 255
#define x_GREEN 32768
#define x_GRAY 8421504
#define x_YELLOW 65535
#include "windows.ch"
#include "guilib.ch"
FUNCTION MAIN()
LOCAL oMain, otest:="Maria helena"
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
CRIADBF()
INIT WINDOW oMain MAIN TITLE "Simple the best" ;
AT 0,0 ;
SIZE GetDesktopWidth(), GetDesktopHeight() - 28
MENU OF oMain
MENU TITLE "&Teste"
MENUITEM "Teste";
ACTION test1()
SEPARATOR
MENUITEM "Sair";
ACTION oMain:Close()
ENDMENU
ENDMENU
ACTIVATE WINDOW oMain
RETURN
FUNCTION test1()
//--------------
LOCAL oFont, oForm
LOCAL aComboBox, oComboBox, oEditBox
LOCAL oBmp
LOCAL oBrowse
aComboBox:={"asa1","asa2","asa3","asa4","asa5"}
oComboBox:=1
USE TESTE EXCLUSIVE
PREPARE FONT oFont NAME "Courier New" WIDTH 0 HEIGHT -11
INIT DIALOG oForm NOEXIT TITLE HB_OEMTOANSI("Cadastro - àrgÆo");
AT 000,000;
FONT oFont ;
SIZE 700,425;
STYLE DS_CENTER + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU
@ 005,000 SAY "Ordenar e/ou pesquisar por :";
SIZE 200,022
@ 005,022 COMBOBOX oComboBox;
ITEMS aComboBox;
SIZE 100,150;
STYLE WS_TABSTOP;
TOOLTIP "Selecione para ordenar a coluna"
@ 110,022 EDITBOX oEditBox;
SIZE 585,022;
STYLE WS_TABSTOP;
TOOLTIP "Digite o argumento para pesquisa"
@ 005,050 BROWSE oBrowse DATABASE OF oForm SIZE 690,325;
ON LOSTFOCUS {|ob|Deselect(ob)}; // Se desabilitar essa linha o foco funciona beleza
STYLE WS_VSCROLL + WS_HSCROLL + WS_TABSTOP
ADD COLUMN FieldBlock(Fieldname(1)) TO oBrowse;
HEADER HB_OEMTOANSI("C¢digo");
LENGTH 8;
PICTURE "999999";
JUSTIFY HEAD DT_CENTER;
JUSTIFY LINE DT_CENTER
ADD COLUMN FieldBlock(Fieldname(2)) TO oBrowse;
HEADER "Nome";
LENGTH 35;
PICTURE "@!";
JUSTIFY HEAD DT_CENTER;
JUSTIFY LINE DT_LEFT
@ 005,380 BUTTON "&Inserir" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 135,380 BUTTON "&Alterar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 265,380 BUTTON "&Excluir" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 395,380 BUTTON "&Visualizar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
@ 525,380 BUTTON "&Retornar" OF oForm;
ON CLICK {||MsgInfo("teste")};
SIZE 100, 32;
STYLE WS_TABSTOP
ACTIVATE DIALOG oForm
RETURN
FUNCTION CRIADBF()
LOCAL aCampos
IF !FILE("TESTE.DBF")
aCampos:={{"CAMPO1","C",06,00},;
{"CAMPO2","C",35,00},;
{"CAMPO3","C",35,00}}
DBCREATE("TESTE.DBF",aCampos)
USE TESTE EXCLUSIVE
DBAPPEND()
FIELDPUT(1,"000001")
FIELDPUT(2,"Registro 000001")
FIELDPUT(3,"Registro 000001")
DBCOMMIT()
DBAPPEND()
FIELDPUT(1,"000002")
FIELDPUT(2,"Registro 000002")
FIELDPUT(3,"Registro 000002")
DBCOMMIT()
USE
ENDIF
//Conforme dica do Alexander
Function Deselect(oBrowse)
Local brushSel := oBrowse:brushSel, bcolorSel := oBrowse:bcolorSel, tcolorSel := oBrowse:tcolorSel
oBrowse:brushSel := oBrowse:brush
oBrowse:bcolorSel:= oBrowse:bcolor
oBrowse:tcolorSel:= oBrowse:tcolor
oBrowse:RefreshLine() //se deixar somente essa linha o erro persiste
oBrowse:brushSel := brushSel
oBrowse:bcolorSel:= bcolorSel
oBrowse:tcolorSel:= tcolorSel
Return .t.