Olá, abaixo a função que vc precisa para criar um único Browse.
Dá uma estudada nos parämetros que funciona show de bola, só que utilizo a Visual Lib 2.0....
Neuber Ramos.
Código: Selecionar todos
////////////////////////////////////////////////////////////////////////////
// Nome..........: BROWTELA.PRG
// Programador ..: Neuber Ramos
// Data..........: 19 Maio de 1998
// Descricao.....: Apresenta dados em tela
////////////////////////////////////////////////////////////////////////////
#include "Inkey.ch"
#include "SetCurs.ch"
#include "Visual2.ch"
#include "Cwm.ch"
Function BrowseTela(nTop, nLeft, nBottom, nRight, nOp)
Static bInsToggle := {|| SetCursor( If( ReadInsert( !ReadInsert() ),;
SC_NORMAL, SC_INSERT ))} //Code Block para cursor
Local oB, n, lMore, cScrSave, lAppend, lKillAppend,;
nKey, nCursSave, lGotKey, bKeyBlock
Local aNomeCamp:={}
If ( !Used() )
Return (.F.) // Se nao tem arquivo aberto
Endif
If ( PCount() < 4 )
nTop := 4
nLeft := 4
nBottom := 20
nRight := 76
Endif
Win(03, 03, 21, 77, "Pesquisados",WT_VERM1CINZA,WD_VERM1CINZA)
BoxCor(04,04,20,76,LinMenu)
oB := TBrowseDB(nTop + 2, nLeft + 1, nBottom - 1, nRight - 1)
oB:headSep := "Ä"
oB:skipBlock := {|x| Skipped(x, lAppend)} // Cria TBrowse object
DO Case
Case nOp=0 // CLIENTES
AADD(aNomeCamp,{"Nome","Cpf","Rg","Data Inc.","Data Nasc.","1a.Descri‡Æo",;
"2a.Descri‡Æo","2a.Descri‡Æo","Fone","Endere‡o",;
"Bairro","Cidade","Estado","Cep"})
Case nOp=1 // FILMES
AADD(aNomeCamp,{"C¢digo","Nome","Nome Orig","Gˆnero","Diretor",;
"InlcusÆo","Distribuidora","Ator","Ator2","Ator3"})
Case nOp=2 // CONFERENCIA DE ACERVO
AADD(aNomeCamp,{"Filme","Dig.","Conf.","Div.","Nome do Filme"})
Case nOp=3 // PESQUISA CLIENTE
AADD(aNomeCamp,{"C¢digo","Titular","Telefone"})
Case nOp=4 // PESQUISA CLIENTE
AADD(aNomeCamp,{"C¢digo","Dependente","Titular","Telefone"})
Case nOp=5 // PESQUISA CLIENTE
AADD(aNomeCamp,{"Telefone","C¢digo","Titular"})
Case nOp=6 // PESQUISA CARTOES DE CREDITO/DEBITO
DbGotop()
AADD(aNomeCamp,{"C¢digo","Bandeira","Data Cadastro","N§ Opera‡äes",;
"N§ Estornos","Total Acumulado","Total Estornado",;
"Deb/Cr‚d","élt. Movto","élt. Cliente","Prz. Pagto",;
"Mov. Janeiro","Est. Janeiro","Mov. Fevereiro","Est. Fevereiro",;
"Mov. Março","Est. Março","Mov. Abril","Est. Abril","Mov. Maio",;
"Est. Maio","Mov. Junho","Est. Junho","Mov. Julho","Est. Julho",;
"Mov. Agosto","Est. Agosto","Mov. Setembro","Est. Setembro",;
"Mov. Outubro","Est. Outubro","Mov. Novembro","Est. Novembro",;
"Mov. Dezembro","Est. Dezembro"})
Case nOp=7 // PESQUISA DE CONTAS A PAGAR.
DbGoTop()
AADD(aNomeCamp,{"C¢digo","Parcela","Descricao reduzida","Posicao","Valor da parcela",;
"Documento","Emissao","Inclusao","Funcionario","Fornecedor",;
"Descricao completa","Valor total","Fixo ou Variavel","Vencimento",;
"Dias aviso"})
EndCase
For n := 1 To FCount() // adiciona uma coluna
oB:addColumn(TBColumnNew(aNomeCamp[1][n],FieldBlock(FieldName(n))))
Next
If (Eof())
DbGotop()
Endif
lAppend := lKillAppend := .F. //Inicio
nCursSave := SetCursor(0)
While ( !oB:stabilize() ) ; End While
If ( LastRec() == 0 )
nKey := K_DOWN // Arquivo
lGotKey := .t.
Else
lGotKey := .f.
Endif
lMore := .t.
While (lMore)
If ( !lGotKey )
While ( !oB:stabilize() ) // Esbilizacao sera interropida
If ( (nKey := Inkey()) != 0 ) // aperatar uma tecla keystroke
lGotKey := .t.
Exit
Endif
End While
Endif
If ( !lGotKey )
If ( oB:hitBottom ) // O objeto TBrowse esta stable
If ( !lAppend .or. RecNo() != LastRec() + 1 )
If ( lAppend )
oB:refreshCurrent()
While ( !oB:stabilize() ) ; End While
DbGoBottom()
Else
lAppend := .t.
SetCursor( If(ReadInsert(), SC_INSERT, SC_NORMAL) )
Endif
oB:down()
While ( !oB:stabilize() ) ; End While
oB:colorRect({oB:rowPos,1,oB:rowPos,oB:colCount},{2,2})
Endif
Endif
oB:Freeze=2
Statline(oB, lAppend)
While ( !oB:stabilize() ) ; End While
nKey := Inkey(0)
If (RecNo()=LastRec().and.nKey==24).or.(RecNo()=Lastrec().and.nKey==3)
Loop
Endif
If ( (bKeyBlock := SetKey(nKey)) != NIL )
EVAL(bKeyBlock, ProcName(1), ProcLine(1), "")
Loop
Endif
Else
lGotKey := .f.
Endif
do Case // tratamento do retorno
Case ( LastKey()==13 )
If nOp>=3 .and. nOp<=5
Cod01 := STR(CODIGO)
Elseif (nOp == 6)
nCart := CODCART
Else
If (nOp == 7)
nCodConta := CODIGOCONT
EndIF
EndIF
lMore := .f.
Case ( nKey == K_DOWN )
If ( lAppend )
oB:hitBottom := .t.
Else
oB:down()
Endif
Case ( nKey == K_UP )
If ( lAppend )
lKillAppend := .t.
Else
oB:up()
Endif
Case ( nKey == K_PGDN )
If ( lAppend )
oB:hitBottom := .t.
Else
oB:pageDown()
Endif
Case ( nKey == K_PGUP )
If ( lAppend )
lKillAppend := .t.
Else
oB:pageUp()
Endif
Case ( nKey == K_CTRL_PGUP )
If ( lAppend )
lKillAppend := .t.
Else
oB:goTop()
Endif
Case ( nKey == K_CTRL_PGDN )
If ( lAppend )
lKillAppend := .t.
Else
oB:goBottom()
Endif
Case ( nKey == K_RIGHT )
oB:Right()
Case ( nKey == K_LEFT )
oB:Left()
Case ( nKey == K_HOME )
oB:home()
Case ( nKey == K_END )
oB:End()
Case ( nKey == K_CTRL_LEFT )
oB:panLeft()
Case ( nKey == K_CTRL_RIGHT )
oB:panRight()
Case ( nKey == K_CTRL_HOME )
oB:panHome()
Case ( nKey == K_CTRL_END )
oB:panEnd()
Case ( nKey == K_INS )
If ( lAppend )
EVAL(bInsToggle)
Endif
Case ( nKey == K_DEL )
If ( RecNo() != LastRec() + 1 )
If ( Deleted() )
recall
Else
delete
Endif
Endif
Case ( nKey == K_ESC )
lMore := .f. //Sai do Browse
otherwise
If ( nKey >= 32 .and. nKey <= 255 )
KeyBoard Chr(K_RETURN) + Chr(nKey)
Endif
EndCase
If ( lKillAppend )
lKillAppend := .f.
lAppend := .f.
FreshOrder(oB)
SetCursor(0)
Endif
End While
SetCursor(nCursSave)
Return (.T.)
///////////////////////////////////////////////////////////////////////////////
// ExitKey()
//
// Determine the follow-up action after editing a Field
///////////////////////////////////////////////////////////////////////////////
static func ExitKey(lAppend)
Local nKey
nKey := Lastkey()
If ( nKey == K_PGDN )
If ( lAppend ) // move down If not Append mode
nKey := 0
Else
nKey := K_DOWN
Endif
ElseIf ( nKey == K_PGUP )
If ( lAppend ) // move up If not Append mode
nKey := 0
Else
nKey := K_UP
Endif
ElseIf ( nKey == K_RETURN .or. (nKey >= 32 .and. nKey <= 255) )
nKey := K_RIGHT // Return Key or Type out..move Right
ElseIf ( nKey != K_UP .and. nKey != K_DOWN )
nKey := 0 // no other action
Endif
Return (nKey)
///////////////////////////////////////////////////////////////////////////////
// FreshOrder()
//
// Refresh respecting any change in order
///////////////////////////////////////////////////////////////////////////////
static func FreshOrder(oB)
Local nRec
nRec := RecNo()
oB:refreshAll()
While ( !oB:stabilize() ) ; End While // stabilize To see If TBrowse
// moves the record pointer
If ( nRec != LastRec() + 1 )
While ( RecNo() != nRec ) //record pointer may move If
//Bof is on Screen falls through
oB:up() //unless record is closer To Bof
While ( !oB:stabilize() ) ; End While //than before
End While
Endif
Return (Nil)
///////////////////////////////////////////////////////////////////////////////
// Statline()
//
// display status at coordinates relative To TBrowse object
///////////////////////////////////////////////////////////////////////////////
static Func Statline(oB, lAppend)
Local nTop, nRight
nTop := oB:nTop - 1
nRight := oB:nRight
@ nTop, nRight - 31 Say "Record"
If ( LastRec() == 0 .and. !lAppend )
@ nTop, nRight - 20 Say "<none> " // File is Empty
ElseIf ( RecNo() == LastRec() + 1 )
@ nTop, nRight - 40 Say " " // no record number
@ nTop, nRight - 20 Say " <new>" //If Eof
Else
@ nTop, nRight - 40 Say If(Deleted(), "<Deleted>", " ")
@ nTop, nRight - 25 Say " "+Pad(Ltrim(Str(RecNo())) + "/" +;
Ltrim(Str(LastRec())), 16) +;
If(oB:hitTop, "<Inicio>", " ")
Endif
Return (Nil)
///////////////////////////////////////////////////////////////////////////////
// Skipped(n)
//
// Skip thru database and Return the
// actual number of records skipped
///////////////////////////////////////////////////////////////////////////////
static Func Skipped(nRequest, lAppend)
Local nCount
nCount := 0
If ( LastRec() != 0 )
If ( nRequest == 0 )
Skip 0
ElseIf ( nRequest > 0 .and. RecNo() != LastRec() + 1 )
While ( nCount < nRequest )
Skip 1
If ( Eof() )
If ( lAppend )
nCount++ // Eof record allowed If
Else // Append mode
// back To last actual record
Skip -1
Endif
Exit
Endif
nCount++
End While
ElseIf ( nRequest < 0 )
While ( nCount > nRequest )
Skip -1
If ( Bof() )
Exit
Endif
nCount--
End While
Endif
Endif
Return (nCount)