Tenho um Browse pra navegar numa array e que saber como colocar uma busca de um determinado valor numa determinada coluna, tipo um SEEK, só q como é array, a rotina deve percorrer a coluna em que está o foco e buscar pelo valor informado pelo usuário.
Por exemplo, a coluna "Nome Credor", onde o usuário quer pesquisar e focar o nome "Francisco", por exemplo, daí o usuário pressionaria Ctrl+F, abria uma tela pra Get do valor a pesquisar, e o ideal, é que a Classe TBrowse tivesse um método Find ou algo assim.
Desde já, fico grato pela ajuda.
Segue meus fontes:
Código: Selecionar todos
#pragma -w0
#pragma -es0
#xtrans :data => :cargo\[1]
#xtrans :recno => :cargo\[2]
#include "GAS.ch"
#include "TBrowse.ch"
#include "inkey.ch"
Function EMP_RAPGet( cAlias )
Local aDados := {}
If cAlias <> NIL
Select (cAlias)
Set Filter To ((emp_valor - emp_vlanu) - emp_totliq > 0.00 .or. emp_totliq - emp_totpag > 0.00) .and.;
exportado <> 'S'
Go Top
Do While !Eof()
AAdd(aDados, {;
'NÆo',;
emp_codigo,;
emp_numero,;
emp_dd,;
emp_mm,;
emp_uo,;
(emp_valor - emp_vlanu),; //07
(emp_valor - emp_vlanu) - emp_totliq,; //07
emp_totliq - emp_totpag,; //08
emp_nome,;
tlc_codigo } )
Skip
EndDo
EndIf
aSort(aDados,,, { |x, y| x[10]+x[5]+x[4] < y[10]+y[5]+y[4]} )
Return aDados
/////////////////////////////////////////////////////////////////////////////
Function EMP_RapBRow(nLi, nCi, nLf, nCf, aACab, aADados )
LOCAL lContinue := .T. ,;
nKeyPressed := 0,;
nArryRowNo := 1,;
i, bBlock, oTBColumn, oCol, xVar, mVar
Private mQtd := 0, aDados := {}
If Len(aADados) = 0
msg := 'Não existe dados a serem importados.'
MsgAtencao( msg )
Return aDados
EndIf
* Draw a box around Browse window
If AbreJanela( 'EMPENHOS COM SALDO A IMPORTAR PARA RESTOS A PAGAR:', nLi, nCi, nLf, nCf, ) == 0
MsgError( "Erro ao abrir Janela de dados." )
Return
EndIf
* Define a new TBrowse object
oBrowse := TBrowse():New( nLi + 1, nCi, nLf-1, nCf )
aDados := aAdados
oBrowse:cargo := {aDados, 1}
oBrowse:colorspec := drvcorbox + ", " + drvcorhlp + ", " + drvcorenf + ", " + drvcorGet + ", " + INVCOR(drvcorpad)
oBrowse:headsep := chr(205) + chr(203) + chr(205) // separador do cabecalho (Í-Í)
oBrowse:colsep := " " + chr(179) + " " // separador das colunas ( ³ )
oBrowse:footSep := chr(205) + chr(202) + chr(205) // separador do cabecalho (Í-Í)
@ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Qtd: ' + AllTrim( Str(Len(aDados), 5) ) + ' / ' + AllTrim( Str(mQtd, 5) ) Color corcampo
@ oBrowse:nBottom + 1, oBrowse:nleft + 1 Say 'Tecle [Enter] para selecionar e [ESC] para sair e continuar o processamento dos [Selecionados].'
oBrowse:goTopBlock := {|| oBrowse:recno := 1 }
oBrowse:goBottomBlock := {|| oBrowse:recno := Len( oBrowse:data ) }
oBrowse:SkipBlock := { | nSkip | ArraySkipper( nSkip, oBrowse ) }
For i := 1 To Len(aAcab)
bBlock := ArrayBlock( oBrowse, i )
oTBColumn := TBColumn():New( aAcab[i, 1], bBlock )
oTBColumn:width := aACab[ i, 2 ]
oTBColumn:picture := aACab[ i, 3 ]
oBrowse:AddColumn( oTBColumn )
Next
While lContinue // Browse's loop
IF NextKey() = 0
oBrowse:RefreshCurrent()
While .not. oBrowse:stabilize()
EndDo // Stabilizing loop
oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 5, 5 } ) // linha está com o cursor
oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor
oCol := oBrowse:getColumn(1)
mVar := EVal(oCol:block)
If Left(mVar, 1) = 'S'
For i := 1 TO oBrowse:colcount // atualiza as cores das colunas
oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
Next
Else
For i := 1 TO oBrowse:colcount // atualiza as cores das colunas
oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
Next
EndIf
IF ! Empty( oBrowse:Freeze ) // Marcar parte congelada
oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:Freeze }, { 5, 5 } )
EndIf
@ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Qtd: ' + AllTrim( Str(Len(aDados), 5) ) + ' / ' + AllTrim( Str(mQtd, 5) ) Color corcampo
wvw_DrawFocusRect(, oBrowse:RowPos + nLi + 2, oBrowse:nLeft, oBrowse:RowPos + nLi + 2, oBrowse:nRight ) // linha está com o cursor
EndIf
nKeyPressed := Inkey(0)
lContinue := TBrApplyKey( oBrowse, nKeyPressed )
IF nKeyPressed = 0 // nao teclou nada, sai pelo
oBrowse:refreshall() // tempo de "refresh" entao
LOOP // na tela e volta
EndIf
EndDo
SetPos( 23, 0 )
FechaJanela()
RETURN aDados
Static FUNCTION TBrApplyKey( oBrowse, nKey )
LOCAL lRVal := .T., mVar, i
DO CASE
CASE nKey == K_ENTER //K_SPACE
oCol := oBrowse:getColumn(1)
mVar := EVal(oCol:block)
If Left(mVar, 1) = 'N'
//oCol := oBrowse:getColumn(11)
mQtd ++ //= EVal(oCol:block)
aDados[oBrowse:recno, 1] := 'Sim'
For i := 1 TO oBrowse:colcount // atualiza as cores das colunas
oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
Next
Else
//oCol := oBrowse:getColumn(11)
mQtd -- //= EVal(oCol:block)
aDados[oBrowse:recno, 1] := 'NÆo'
For i := 1 TO oBrowse:colcount // atualiza as cores das colunas
oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
Next
EndIf
oBrowse:refreshcurrent() // refaz so' a linha do browse
CASE nKey == K_UP
oBrowse:Up()
CASE nKey == K_LEFT
oBrowse:Left()
CASE nKey == K_RIGHT
oBrowse:Right()
CASE nKey == K_DOWN
oBrowse:down()
CASE nKey == K_HOME
oBrowse:home()
CASE nKey == K_END
oBrowse:end()
CASE nKey == K_PGUP
oBrowse:pageUp()
CASE nKey == K_PGDN
oBrowse:pageDown()
CASE nKey == K_CTRL_PGDN
oBrowse:goBottom()
CASE nKey == K_CTRL_PGUP
oBrowse:goTop()
CASE nKey == K_ESC
// End of Browse and program
lRVal := .F.
ENDCASE
RETURN lRVal // TBrApplyKey()
