Página 1 de 1

Pesquisar em Browse de Array

Enviado: 14 Mar 2014 08:56
por asimoes
Pessoal,

Eu queria confirmar com quem já fez uso de browse com array se a minha rotina está certa:

Código: Selecionar todos

  clrT   :=hwg_RGB(0,0,255)     //Cor do texto
  clrB   :=hwg_RGB(211,237,250) //Cor de fundo do browser
  clrTSel:=hwg_RGB(0,0,255)     //Cor do texto do selecionado
  clrBSel:=hwg_RGB(255,255,0)   //Cor de fundo do selecionado
  HWG_AChoice( {"A 0123456789 0123456789","B 0123456789 0123456789","C 0123456789 0123456789"}, "Teste",,,, clrT, clrB, clrTSel, clrBSel, "Ok", "Sair" )

Código: Selecionar todos


FUNCTION HWG_AChoice( arr, cTitle, nLeft, nTop, oFont, clrT, clrB, clrTSel, clrBSel, cOk, cCancel )

LOCAL oDlg, oBrw, nChoice:=0, lArray:=.T., nField, lNewFont:=.F.
LOCAL i, aLen, nLen:=0, addX:=20, addY:=20, minWidth:=0, x1
LOCAL hDC, aMetr, nWidth, nHeight, aArea, aRect
LOCAL nStyle:=WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU //+ WS_SIZEBOX
LOCAL nLenArray
LOCAL oIconOk:=HIcon():AddResource("ICON_OK24")
   
   IF cTitle == Nil ; cTitle:="" ; ENDIF
   IF nLeft == Nil .AND. nTop == Nil ; nStyle += DS_CENTER ; ENDIF
   IF nLeft == Nil ; nLeft:=0 ; ENDIF
   IF nTop == Nil ; nTop:=0 ; ENDIF
   IF oFont == Nil
      oFont:=HFont():Add( "Courier New", 0, -18,550 ) //
      lNewFont:=.T.
   ENDIF
   IF cOk != Nil
      minWidth += 120
      IF cCancel != Nil
         minWidth += 100
      ENDIF
      addY += 30
   ELSE
      cOk:="Ok"
   ENDIF

   IF ValType( arr ) == "C"
      lArray:=.F.
      aLen:=RecCount()
      IF ( nField:=FieldPos( arr ) ) == 0
         RETURN 0
      ENDIF
      nLen:=dbFieldInfo( 3, nField )
   ELSE
      aLen:=Len( arr )
      IF ValType( arr[ 1 ] ) == "A"
         FOR i:=1 TO aLen
            nLen:=Max( nLen, Len( arr[ i, 1 ] ) )
         NEXT
      ELSE
         FOR i:=1 TO aLen
            nLen:=Max( nLen, Len( arr[ i ] ) )
         NEXT
      ENDIF
   ENDIF

   hDC:=hwg_Getdc( hwg_GetActiveWindow() )
   HWG_SelectObject( hDC, oFont:handle )
   aMetr:=HWG_GetTextMetric( hDC )
   aArea:=HWG_GetDeviceArea( hDC )
   aRect:=HWG_GetWindowRect( HWG_GetActiveWindow() )
   hwg_Releasedc( hwg_GetActiveWindow(), hDC )

   nLenArray:=aLen + 3
   nLenArray:=Min(23,nLenArray)
   nHeight:=( aMetr[ 1 ] + 1 ) * aLen + nLenArray + addY + nLenArray
   IF nHeight > aArea[ 2 ] - aRect[ 2 ] - nTop - 60
      nHeight:=aArea[ 2 ] - aRect[ 2 ] - nTop - 60
   ENDIF

   nWidth:=(nLen * aMetr[ 2 ]) + 60
   
   INIT DIALOG oDlg TITLE cTitle ;
               AT nLeft, nTop ;
               ICON HIcon():AddResource("ICON_ACHOICE") ;
               SIZE nWidth, nHeight ;
               STYLE nStyle ;
               FONT oFont ;
               CLIPPER ;
               NOEXIT ;
               ON INIT { | o | hwg_ResetWindowPos( o:handle ), o:nInitFocus:=oBrw }
   IF lArray
      @ 0,0 Browse oBrw Array
      oBrw:aArray:=Arr
      IF ValType( arr[ 1 ] ) == "A"
         oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent, 1 ] }, "C", nLen ) )
      ELSE
         oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent ] }, "C", nLen ) )
      ENDIF
      
   ELSE
      @ 0, 0 Browse oBrw DATABASE
      oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), ( o:Alias ) ->( FieldGet( nField ) ) }, "C", nLen ) )
   ENDIF

   oBrw:oFont  := oFont
   oBrw:bSize  := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, 10, x - addX, y - addY ) }
   oBrw:bEnter := { | o | nChoice := o:nCurrent, hwg_EndDialog( o:oParent:handle ) }
   oBrw:bKeyDown := {|o,key|HB_SYMBOL_UNUSED(o),IIF(key==27,(hwg_EndDialog(oDlg:handle),.F.),BrwKey(o,key))}
   
   oBrw:lDispHead:=.F.
   IF clrT != Nil
      oBrw:tcolor:=clrT
   ENDIF
   IF clrB != Nil
      oBrw:bcolor:=clrB
   ENDIF
   IF clrTSel != Nil
      oBrw:tcolorSel:=clrTSel
   ENDIF
   IF clrBSel != Nil
      oBrw:bcolorSel:=clrBSel
   ENDIF

   IF cOk != Nil
      x1 := Int( nWidth/2 ) - IIF( cCancel != Nil, 90, 40 )
      @ x1,nHeight - 36 OWNERBUTTON oOk SIZE 80,30 ;
                        TEXT cOk COORDINATES 35,0,0,0 ;
                        FONT HFont():Add( "Arial", 0, -13,550 ) ;
                        STYLE WS_TABSTOP ;
                        BITMAP "BMP_OK24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
                        ON CLICK { || nChoice := oBrw:nCurrent, hwg_EndDialog( oDlg:handle )} ;
                        TOOLTIP "Escolher a seleção." ;
                        THEMED
                        
      IF cCancel != Nil
         @ x1 + 100,nHeight - 36 OWNERBUTTON oSaida SIZE 80,30 ;
                                 TEXT cCancel COORDINATES 35,0,0,0 ;
                                 FONT HFont():Add( "Arial", 0, -13,550 ) ;
                                 STYLE WS_TABSTOP ;
                                 BITMAP "BMP_SAIR24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
                                 ON CLICK { || hwg_EndDialog( oDlg:handle )} ;
                                 TOOLTIP "Abandonar a seleção." ;
                                 THEMED
      ENDIF
   ENDIF
   
   oDlg:Activate()
   
   IF lNewFont
      oFont:Release()
   ENDIF

RETURN nChoice

STATIC FUNCTION BrwKey( oBrw, key )
LOCAL nPosicao   
   nPosicao:=ASCAN(oBrw:aArray,Chr(key))
   IF nPosicao # 0
      oBrw:nCurrent:=nPosicao
      //Eval( oBrw:bGoTo, oBrw, nPosicao )
      oBrw:Refresh()
   ENDIF
RETURN .T.


Pesquisar em Browse de Array

Enviado: 14 Mar 2014 12:01
por asimoes
Agora ficou do jeito que eu queria.

Código: Selecionar todos

STATIC FUNCTION BrwKey( oBrw, key )
LOCAL nPosicao, nKeyPress:=key
STATIC cProgressKey

   IF cProgressKey = Nil
      cProgressKey:="" 
   ENDIF

   IF IsData(nKeyPress) .AND. nKeyPress # 8 
      cProgressKey += Chr(nKeyPress)
      nPosicao:=ASCAN(oBrw:aArray,cProgressKey)
   ELSEIF nKeyPress = 8 .AND. LEN(cProgressKey) >= 1
      cProgressKey := LEFT(cProgressKey,LEN(cProgressKey) - 1)
      nPosicao:=ASCAN(oBrw:aArray,cProgressKey)
   ENDIF
   IF nPosicao # 0
      oBrw:nCurrent:=nPosicao
      //Eval( oBrw:bGoTo, oBrw, nPosicao )
      oBrw:Refresh()
   ENDIF
RETURN .T.

Pesquisar em Browse de Array

Enviado: 14 Mar 2014 12:52
por asimoes
A variável cProgressKey eu declarei como private iniciando com "" na função HWG_AChoice e eliminei a criação dela como static na função de pesquisa, isso poderia dar problema.

Pesquisar em Browse de Array

Enviado: 14 Mar 2014 17:24
por asimoes
Adicionei o componente label na função HWG_AChoice para saber o que está sendo pesquisado no browse.

Código: Selecionar todos

FUNCTION HWG_AChoice( arr, cTitle, nLeft, nTop, oFont, clrT, clrB, clrTSel, clrBSel, cOk, cCancel )

LOCAL oDlg, oBrw, nChoice:=0, lArray:=.T., nField, lNewFont:=.F.
LOCAL i, aLen, nLen:=0, addX:=20, addY:=50, minWidth:=0, x1
LOCAL hDC, aMetr, nWidth, nHeight, aArea, aRect
LOCAL nStyle:=WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU //+ WS_SIZEBOX
LOCAL nLenArray
LOCAL oIconOk:=HIcon():AddResource("ICON_OK24")
PRIVATE cProgressKey:="" 
   IF cTitle == Nil ; cTitle:="" ; ENDIF
   IF nLeft == Nil .AND. nTop == Nil ; nStyle += DS_CENTER ; ENDIF
   IF nLeft == Nil ; nLeft:=0 ; ENDIF
   IF nTop == Nil ; nTop:=0 ; ENDIF
   IF oFont == Nil
      oFont:=HFont():Add( "Courier New", 0, -18,550 ) //
      lNewFont:=.T.
   ENDIF
   IF cOk != Nil
      minWidth += 120
      IF cCancel != Nil
         minWidth += 100
      ENDIF
      addY += 30
   ELSE
      cOk:="Ok"
   ENDIF

   IF ValType( arr ) == "C"
      lArray:=.F.
      aLen:=RecCount()
      IF ( nField:=FieldPos( arr ) ) == 0
         RETURN 0
      ENDIF
      nLen:=dbFieldInfo( 3, nField )
   ELSE
      aLen:=Len( arr )
      IF ValType( arr[ 1 ] ) == "A"
         FOR i:=1 TO aLen
            nLen:=Max( nLen, Len( arr[ i, 1 ] ) )
         NEXT
      ELSE
         FOR i:=1 TO aLen
            nLen:=Max( nLen, Len( arr[ i ] ) )
         NEXT
      ENDIF
   ENDIF

   hDC:=hwg_Getdc( hwg_GetActiveWindow() )
   HWG_SelectObject( hDC, oFont:handle )
   aMetr:=HWG_GetTextMetric( hDC )
   aArea:=HWG_GetDeviceArea( hDC )
   aRect:=HWG_GetWindowRect( HWG_GetActiveWindow() )
   hwg_Releasedc( hwg_GetActiveWindow(), hDC )
   //nHeight:=( aMetr[ 1 ] + 1 ) * aLen + 4 + addY + 8
   nLenArray:=aLen + 3
   nLenArray:=Min(23,nLenArray)
   nHeight:=( aMetr[ 1 ] + 1 ) * aLen + nLenArray + addY + nLenArray
   IF nHeight > aArea[ 2 ] - aRect[ 2 ] - nTop - 60
      nHeight:=aArea[ 2 ] - aRect[ 2 ] - nTop - 60
   ENDIF

   //nWidth:=Max( aMetr[ 2 ] * 2 * nLen + addX, minWidth )
   
   //nWidth:=Max( aMetr[ 2 ] * 1.5 * nLen + addX, minWidth )
   
   nWidth:=(nLen * aMetr[ 2 ]) + 60
   
   INIT DIALOG oDlg TITLE cTitle ;
               AT nLeft, nTop ;
               ICON HIcon():AddResource("ICON_ACHOICE") ;
               SIZE nWidth, nHeight;
               STYLE nStyle ;
               FONT oFont ;
               CLIPPER ;
               NOEXIT ;
               ON INIT { | o | hwg_ResetWindowPos( o:handle ), o:nInitFocus:=oBrw }
   IF lArray
      @ 0,0 Browse oBrw Array
      oBrw:aArray:=Arr
      IF ValType( arr[ 1 ] ) == "A"
         oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent, 1 ] }, "C", nLen ) )
      ELSE
         oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent ] }, "C", nLen ) )
      ENDIF
      
   ELSE
      @ 0, 0 Browse oBrw DATABASE
      oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), ( o:Alias ) ->( FieldGet( nField ) ) }, "C", nLen ) )
   ENDIF

   oBrw:oFont  := oFont
   oBrw:bSize  := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, 10, x - addX, y - addY ) }
   oBrw:bEnter := { | o | nChoice := o:nCurrent, hwg_EndDialog( o:oParent:handle ) }
   oBrw:bKeyDown := {|o,key|HB_SYMBOL_UNUSED(o),IIF(key==27,(hwg_EndDialog(oDlg:handle),.F.),BrwKey(o,key))}
   
   oBrw:lDispHead:=.F.
   IF clrT != Nil
      oBrw:tcolor:=clrT
   ENDIF
   IF clrB != Nil
      oBrw:bcolor:=clrB
   ENDIF
   IF clrTSel != Nil
      oBrw:tcolorSel:=clrTSel
   ENDIF
   IF clrBSel != Nil
      oBrw:bcolorSel:=clrBSel
   ENDIF

   @ 0,0 SAY oLabel CAPTION "" ;
                    FONT HFont():Add( 'Arial',0,-13,550) ;
                    STYLE WS_DLGFRAME ;
                    COLOR hwg_RGB(0,0,255) BACKCOLOR 16777172

   oLabel:bSize  := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, nHeight - 63, x - addX, 20 ) }

   IF cOk != Nil
      x1 := Int( nWidth/2 ) - IIF( cCancel != Nil, 90, 40 )
      @ x1,nHeight - 36 OWNERBUTTON oOk SIZE 80,30 ;
                        TEXT cOk COORDINATES 35,0,0,0 ;
                        FONT HFont():Add( "Arial", 0, -13,550 ) ;
                        STYLE WS_TABSTOP ;
                        BITMAP "BMP_OK24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
                        ON CLICK { || nChoice := oBrw:nCurrent, hwg_EndDialog( oDlg:handle )} ;
                        TOOLTIP "Escolher a seleção." ;
                        THEMED
                        
      IF cCancel != Nil
         @ x1 + 100,nHeight - 36  OWNERBUTTON oSaida SIZE 80,30 ;
                                 TEXT cCancel COORDINATES 35,0,0,0 ;
                                 FONT HFont():Add( "Arial", 0, -13,550 ) ;
                                 STYLE WS_TABSTOP ;
                                 BITMAP "BMP_SAIR24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
                                 ON CLICK { || hwg_EndDialog( oDlg:handle )} ;
                                 TOOLTIP "Abandonar a seleção." ;
                                 THEMED
      ENDIF
   ENDIF
   
   oDlg:Activate()
   
   IF lNewFont
      oFont:Release()
   ENDIF

RETURN nChoice

STATIC FUNCTION BrwKey( oBrw, key )
LOCAL nPosicao:=0, nKeyPress:=key
LOCAL cRegEx := "[A-Z0-9 ]{1}"

   aResult:=HB_RegEx( cRegEx, Chr(nKeyPress) )

   IF Len(aResult) = 0  .AND. nKeyPress # 8
      RETURN .T.
   ENDIF
   
   IF IsData(nKeyPress) .AND. nKeyPress # 8 
      cProgressKey += Chr(nKeyPress)
      nPosicao:=ASCAN(oBrw:aArray,cProgressKey)
      oLabel:settext(cProgressKey)
   ELSEIF nKeyPress = 8 .AND. LEN(cProgressKey) >= 1
      cProgressKey:=LEFT(cProgressKey,LEN(cProgressKey) - 1)
      nPosicao:=ASCAN(oBrw:aArray,cProgressKey)
      oLabel:settext(cProgressKey)
   ENDIF
   IF nPosicao # 0
      oBrw:nCurrent:=nPosicao
      //Eval( oBrw:bGoTo, oBrw, nPosicao )
      oBrw:Refresh()
   ENDIF
RETURN .T.
Ficou assim:
Imagem

Pesquisar em Browse de Array

Enviado: 14 Mar 2014 18:51
por Toledo
Alexandre, ficou muito bom... parabéns!

Gostei do que você fez na função BrwKey() para fazer a busca.

Abraços,

Pesquisar em Browse de Array

Enviado: 15 Mar 2014 07:24
por asimoes
Agora exatamente o que eu queria.

Código: Selecionar todos

STATIC FUNCTION BrwKey( oBrw, key )
LOCAL nPosicao:=0, nKeyPress:=key
LOCAL cRegEx := "[a-zA-Z0-9 ]{1}"

   aResult:=HB_RegEx( cRegEx, Chr(nKeyPress) )

   IF Len(aResult) = 0  .AND. nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ "13|34|33|37|38|39|40"
      cProgressKey:=""
      oLabel:settext(cProgressKey)
      RETURN .T.
   ENDIF
   IF IsAscii(Chr(nKeyPress)) .AND. nKeyPress # 8 
      cProgressKey += Chr(nKeyPress)
      nPosicao:=AScan(oBrw:aArray,cProgressKey)
      oLabel:settext(cProgressKey)
   ELSEIF nKeyPress = 8 .AND. Len(cProgressKey) >= 1
      cProgressKey:=Left(cProgressKey,Len(cProgressKey) - 1)
      nPosicao:=AScan(oBrw:aArray,cProgressKey)
      oLabel:settext(cProgressKey)
   ENDIF
   IF nPosicao # 0
      oBrw:rowPos := nPosicao
      Eval( oBrw:bGoTo, oBrw, nPosicao )
      oBrw:Refresh()
   ENDIF
RETURN .T.