Bug no browse ? ou uso incorreto ?

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

jc101b escreveu:se alguem interessar posso mostrar no TBrowse/GTwvw q uso no momento...
Voltando nesta parte.
Até que o browse da hwgui segue o tbrowse.
Se fez pro tbrowse, tá pronto pro browse da hwgui.
Ou quase.... já que o "inkey" da hwgui não é igual ao inkey do Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

Só tem mais codeblocks do que o tbrowse.

Código: Selecionar todos

FUNCTION BrowseSet( oBrowse, oBrowseList )

   LOCAL oElement

   oBrowse:bSkip  := { | o, nSkip | ADOSkipper( o:aArray, nSkip ) }
   oBrowse:bGotop := { | o | o:aArray:MoveFirst() }
   oBrowse:bGobot := { | o | o:aArray:MoveLast() }
   oBrowse:bEof   := { | o | o:nCurrent > o:aArray:RecordCount() }
   oBrowse:bBof   := { | o | o:nCurrent == 0 }
   oBrowse:bRcou  := { | o | o:aArray:RecordCount() }
   oBrowse:bRecno := { | o | o:aArray:AbsolutePosition() }
   oBrowse:bRecnoLog := oBrowse:bRecno
   oBrowse:bGOTO  := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }

   RETURN Nil
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
jc101b
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 17 Jun 2013 19:12
Localização: Santo Angelo-RS

Bug no browse ? ou uso incorreto ?

Mensagem por jc101b »

eu nao utilizava esse comando/recurso..vou estudar e me adaptar a minha lib a esse recurso

obg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

jc101b escreveu:eu nao utilizava esse comando/recurso..vou estudar e me adaptar a minha lib a esse recurso
No hbrowse você encontra esses codeblocks pré-definidos pra DBF e Array.
Mas pode trocá-los pra rotinas próprias.
O que mostrei é trocando pra uso de ADO, que acaba trocando todos.
E isso é feito no aplicativo, não dentro da rotina da HWGUI.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

Código: Selecionar todos

#include "hwgui.ch"
#include "inkey.ch"
#include "hbgtinfo.ch"

PROCEDURE PTESHWGUIBrowse( cModule, cTitle, ... )

   LOCAL cnSQL := ADOLocal(), oTBrowse, cCampoKeyboard := "CODIGO", xValue

   hb_Default( @cTitle, "PESQUISA DE CIDADES" )
   WITH OBJECT cnSQL
      :Execute( "SELECT CINOME, CIUF, CIIBGE, IDCIDADE" + ;
         " FROM JPCIDADE" + ;
         " ORDER BY CINOME" )
      oTBrowse := { ;
         { "NOME", { || :String( "CINOME", 40 ) } }, ;
         { "UF",   { || :String( "CIUF", 2 ) } }, ;
         { "IBGE", { || :String( "CIIBGE", 7 ) } }, ;
         { "ID",   { || Str( :Number( "IDCIDADE" ), 6 ) } } }
      xValue := HWGUIBrowse( cTitle, cnSQL, oTBrowse, "CINOME", ;
         iif( cCampoKeyboard == "CODIGO", { || Str( :Number( "IDCIDADE" ), 6 ) }, { || :String( "CINOME", Len( GetActive():VarGet ) ) } ) )
      IF xValue != Nil
         MsgExclamation( Transform( xValue, "" ) )
      ENDIF
      :CloseRecordset()
   ENDWITH
   ( cModule )

   RETURN

FUNCTION HwguiBrowse( cTitle, cnSQL, oBrowseList, cFilterList, bCode )

   LOCAL oDlg, oBrowse, cFilter := "", lSelected := .F., xValue := Nil, oBtnList := {}

   hb_Default( @cFilter, "" )

   INIT DIALOG oDlg ;
      AT AppWindowRect( 1 ), AppWindowRect( 2 ) SIZE AppWindowRect( 3 ), AppWindowRect( 4 ) ;
      TITLE cTitle ;
      STYLE WS_DLGFRAME + WS_SYSMENU

   @ 11, 101 BROWSE ARRAY oBrowse ;
      SIZE oDlg:nWidth - 20, oDlg:nHeight - 140 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL + DS_CENTER ;
      ON CLICK { || lSelected := .T., oDlg:Close() } ;
      ON KEYDOWN { | oBrw, nkey | oBrowseKey( oDlg, oBrw, nkey, @cFilter, lSelected, cFilterList ) }
   oBrowse:aArray := cnSQL
   BrowseSet( oBrowse, oBrowseList )
   CreateButtons( oDlg, oBrowse, @oBtnList )

   ACTIVATE DIALOG oDlg CENTER

   IF lSelected .AND. bCode != Nil
      xValue := Eval( bCode )
   ENDIF
   ( cFilterList )

   RETURN xValue

FUNCTION BrowseSet( oBrowse, oBrowseList )

   LOCAL oElement

   oBrowse:bSkip  := { | o, nSkip | ADOSkipper( o:aArray, nSkip ) }
   oBrowse:bGotop := { | o | o:aArray:MoveFirst() }
   oBrowse:bGobot := { | o | o:aArray:MoveLast() }
   oBrowse:bEof   := { | o | o:nCurrent > o:aArray:RecordCount() }
   oBrowse:bBof   := { | o | o:nCurrent == 0 }
   oBrowse:bRcou  := { | o | o:aArray:RecordCount() }
   oBrowse:bRecno := { | o | o:aArray:AbsolutePosition() }
   oBrowse:bRecnoLog := oBrowse:bRecno
   oBrowse:bGOTO  := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }

   FOR EACH oElement IN oBrowseList
      ADD COLUMN oElement[ 2 ] TO oBrowse HEADER oElement[ 1 ] LENGTH Int( Len( Transform( Eval( oElement[ 2 ] ), "" ) ) * 1.2 ) + 1
   NEXT

   RETURN Nil

FUNCTION ADOSkipper( cnSQL, nSkip )

   LOCAL nRec := cnSQL:AbsolutePosition()

   IF ! cnSQL:Eof()
      cnSQL:Move( nSkip )
      IF cnSQL:Eof()
         cnSQL:MoveLast()
      ENDIF
      IF cnSQL:Bof()
         cnSQL:MoveFirst()
      ENDIF
   ENDIF

   RETURN cnSQL:AbsolutePosition() - nRec

STATIC FUNCTION oBrowseKey( oDlg, oBrowse, nKey, cFilter, lSelected, cFilterList )

   nKey := hb_KeyStd( nKey )
   DO CASE
   CASE nKey == K_ENTER .OR. nKey == K_ESC
      IF nKey == K_ENTER
         lSelected := .T.
      ENDIF
      oDlg:Close()
      RETURN .F.
   CASE IsAscChar( nKey )
      IF nKey == K_BS
         IF Len( cFilter ) > 0
            cFilter := Left( cFilter, Len( cFilter ) - 1 )
         ENDIF
      ELSE
         cFilter += Upper( Chr( nKey ) )
      ENDIF
      oBrowse:aArray:Filter( iif( Empty( cFilter ), "", cFilterList + " LIKE '%" + cFilter + "%'" ) )
      IF oBrowse:aArray:Eof() .AND. Len( cFilter ) > 0
         cFilter := Substr( cFilter, 1, Len( cFilter ) - 1 )
         oBrowse:aArray:Filter( iif( Empty( cFilter ), "", cFilterList + " LIKE '%" + cFilter + "%'" ) )
      ENDIF
      oBrowse:Refresh()
   ENDCASE

   RETURN .T.

STATIC FUNCTION IsAscChar( nKey )

   DO CASE
   CASE nKey == VK_BACK
   CASE nKey >= Asc( "A" ) .AND. nKey <= Asc( "Z" )
   CASE nKey >= Asc( "a" ) .AND. nKey <= Asc( "z" )
   CASE nKey >= Asc( "0" ) .AND. nKey <= Asc( "9" )
   CASE hb_AScan( { " " }, { | e | nKey == Asc( e ) } ) != 0
   OTHERWISE
      RETURN .F.
   ENDCASE

   RETURN .T.

STATIC FUNCTION CreateButtons( oDlg, oBrowse, oBtnList )

   LOCAL nRow, nCol, oBtn, nRowLine := 1
   LOCAL acOptions := { ;
      { "First",      "icoGoTop",    { || oBrowse:Top() } }, ;
      { "PrevPage",   "icoGoPgUp",   { || oBrowse:PageUp() } }, ;
      { "Previous",   "icoGoUp",     { || oBrowse:LineUp() } }, ;
      { "Next",       "icoGoDown",   { || oBrowse:LineDown() } }, ;
      { "NextPage",   "icoGoPgDn",   { || oBrowse:PageDown() } }, ;
      { "Last",       "icoGoBottom", { || oBrowse:Bottom() } }, ;
      { "Filter",     "icoFilter",   { || Nil } }, ;
      { "Exit",       "icoDoor",     { || oDlg:Close() } } }

   nCol := 10
   nRow := 10
   oBtnList := {}
   FOR EACH oBtn IN acOptions
      @ nCol, nRow OWNERBUTTON oBtn OF oDlg SIZE 80,80 ;
         ON CLICK oBtn[ 3 ] ;
         BITMAP ;
         /* AppLoadImage( cIcon, WIN_IMAGE_ICON, 70, 70 ) */ ;
         HICON():AddResource( oBtn[ 2 ], 60, 60 ) COORDINATES 5, 5, 60, 60 ;
         TEXT oBtn[ 1 ] COORDINATES 5, 61, 75, 5 ;
         Tooltip oBtn[ 1 ]
      oBtn:aStyle := ze_StyleBtn()
      IF nCol > AppWindowRect( 3 ) - AppWindowRect( 1 ) - 10 - 85
         nRowLine += 1
         nRow += 85
         nCol := AppWindowRect( 3 ) - AppWindowRect( 1 ) - 10 - 85
      ENDIF
      AAdd( oBtnList, oBtn )
      nCol += iif( nRowLine == 1, 85, -85 )
   NEXT

   RETURN Nil
A rotina inteira que criei.
Mas lembrando:
Sou principiante em hwgui
São só testes de principiante em hwgui
Só não sou principiante em Harbour, mas continuo sendo principiante em hwgui, só testes eventuais.
Aviso isso porque podem existir formas melhores de usar o browse, e não sei dizer se o exemplo é bom ou ruim, só sei que funciona.
Nota: testo junto com meu aplicativo, acho que ainda tem algumas funções simples que estão no aplicativo, mas dá pra trocar fácil.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
jc101b
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 17 Jun 2013 19:12
Localização: Santo Angelo-RS

Bug no browse ? ou uso incorreto ?

Mensagem por jc101b »

Ola Quintas...

obg pela dica do OrdScope()...ficou perfeita a substituicao da minha clausula/block ::bWhile no TBrowse...
agora eu quero um comando/funcao q substitua a minha clausula/block ::bFor...
quero dizer... que entre o os meus ::ScopeBof/::ScopeEof... quero pular uns registros que nao atende o meu ::bFor...
tem como??
senao vou ter que manter essa clausula/block ::bFor...
despois que adaptar o TBrowse...dai vou ver se passo HBrowse da hwgui

Atenciosamente
JC
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

E porque não pode ser o mesmo ?
O que tem de especial em bfor?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
jc101b
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 17 Jun 2013 19:12
Localização: Santo Angelo-RS

Bug no browse ? ou uso incorreto ?

Mensagem por jc101b »

como eu falei antes...
entre o ordscope/inicio e o ordscope/fim,
tem registros que NAO atende o meu criterio...q tá especificado no codeblock ::bFor...
nao testei o ordCondSet()...eu uso... até agora ...pra criar indices temporarios de relatorios....
nao seria uma opcao???
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

jc101b escreveu:como eu falei antes...
entre o ordscope/inicio e o ordscope/fim,
tem registros que NAO atende o meu criterio...q tá especificado no codeblock ::bFor...
nao testei o ordCondSet()...eu uso... até agora ...pra criar indices temporarios de relatorios....
nao seria uma opcao???
Então, mas como usa hoje ?
O SET FILTER faz isso, mas pode ser lento dependendo do filtro e o que vai ser filtrado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Bug no browse ? ou uso incorreto ?

Mensagem por JoséQuintas »

Outras opções:

Temporário ADO pode ser mais rápido e ter mais recursos do que DBF ou arquivo em memória do Harbour.

ADO + ADS Local, acesso rápido e possibilidade de usar comandos SQL encima de DBF

E outras opções intermediárias, como arquivo temporário parcial.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Bug no browse ? ou uso incorreto ?

Mensagem por alxsts »

Olá!

Parece que o jc101b utiliza as rotinas de browse condicional criadas pelo Rick Spence... se procurar aqui no fórum vai encontrar...

Nunca usei mas na HwGUI tem o controle BROWSE FILTER. Este controle tem o bWhile e o bFor...
4.3.14. @ <x>,<y> BROWSE <oBrw> FILTER

@ <x>,<y> BROWSE <oBrowse> FILTER
[ OF <oWnd> ];
[ ID <nId> ]
[ SIZE <width>, <height> ]
[ ON INIT <bInit> ]
[ ON SIZE <bSize> ]
[ ON PAINT <bDraw> ]
[ ON CLICK <bClick> ]
[ ON RIGHTCLICK <bRClick> ]
[ ON GETFOCUS <bGetFocus> ]
[ ON LOSTFOCUS <bLostFocus> ]
[ STYLE <nStyle> ]
[ <lNoVScr: NO VSCROLL> ]
[ <lNoBord: NO BORDER> ]
[ FONT <oFont> ]
[ APPEND ]
[ AUTOEDIT ]
[ ON UPDATE <bUpdate> ]
[ ON KEYDOWN <bKeyDown> ]
[ ON POSCHANGE <bPosChg> ]
[ MULTISELECT ]
[ DESCEND> ]
[ WHILE <bWhile> ]
[ FIRST <bFirst> ]
[ LAST <bLast> ]
[ FOR <bFor> ]
deve haver exemplos aqui no fórum.
[]´s
Alexandre Santos (AlxSts)
Responder