Página 2 de 2

Bug no browse ? ou uso incorreto ?

Enviado: 17 Mar 2023 09:08
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.

Bug no browse ? ou uso incorreto ?

Enviado: 17 Mar 2023 09:11
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

Bug no browse ? ou uso incorreto ?

Enviado: 17 Mar 2023 11:41
por jc101b
eu nao utilizava esse comando/recurso..vou estudar e me adaptar a minha lib a esse recurso

obg

Bug no browse ? ou uso incorreto ?

Enviado: 17 Mar 2023 12:30
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.

Bug no browse ? ou uso incorreto ?

Enviado: 17 Mar 2023 12:38
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.

Bug no browse ? ou uso incorreto ?

Enviado: 28 Mar 2023 10:04
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

Bug no browse ? ou uso incorreto ?

Enviado: 28 Mar 2023 10:28
por JoséQuintas
E porque não pode ser o mesmo ?
O que tem de especial em bfor?

Bug no browse ? ou uso incorreto ?

Enviado: 28 Mar 2023 13:41
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???

Bug no browse ? ou uso incorreto ?

Enviado: 28 Mar 2023 14:17
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.

Bug no browse ? ou uso incorreto ?

Enviado: 28 Mar 2023 14:19
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.

Bug no browse ? ou uso incorreto ?

Enviado: 29 Mar 2023 01:50
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.