Página 1 de 1

TBROWSE

Enviado: 04 Abr 2006 10:25
por managercorp
Alguem tem aquel texto (DISERCANDO O TBROWSE)
Ou algo nesse sentido que me ajude.
To precisando editar os dados dentro de uma tabela, como o dbedit
e pelo que vi so vou conseguir isto com o tbrowse, to certo ?

Outra coisa tenho que linkar meu sistema com que LIb ?
pois quando uso o tbcolummnew da UM ERRO DE TBCOLUMMNE (E COMO SE O CLIPPER SO LESE ATE A LETRA E OU SEJA 10 CARACTERES, e fica dando erro unresolved externals TBCOLUMMNE

Uso o exospace com clipper 5.3
QUal a BIBLIOTECA QUE TENHO DE USAR PARA USUFLUIR DO TBROWSE

alexandre pessoa
81-9615.2319
alexandre@managercorp.com.br
MSN -> solucoeshotel@hotmail.com

Enviado: 04 Abr 2006 12:23
por Antonio
O nome é TBColumnNew()

Enviado: 04 Abr 2006 12:27
por Grings
mandei p/seu email
Nota de Moderação:
por [url=https://pctoledo.org/forum/memberlist.php?mode=viewprofile&u=100899][color=#00AA00]Pablo César[/color][/url]: (de acordo a sua ultima citação) 
 
Enviar por email, resolver através de meios privados são práticas não aceitas aqui no fórum. Desestimulamos este tipo de procedimento, já que o objetivo do fórum é para servir como fonte centralizadora de informações, onde os usuários possam compartilhar de forma pública e não exclusiva. Favor ler a Regra Geral do Fórum (itens 10,11,12 e 13).

Enviado: 04 Abr 2006 14:47
por And
Amigo Grings,

Se não for pedir muito, gostaria de receber o texto ou se possivel que publicasse ele aqui
ou disponibilizasse um link para que todos pudessem baixa-lo.



Grato,

Enviado: 04 Abr 2006 16:53
por MARCELOG
Olá companheiros,
o meu primeiro contato com clipper, por incrível que pareça, foi com o tbrowse.
Uma rabeira só!
Consegui comprar num sebo de BH um livro sobre clipper (nem era o 5.2) do Antônio Ramalho.
Relativamente ao tbrowse, os ensinamentos do professor foram demais, sem falar na linguagem fácil e didática, inclusive piadinhas.
Mas o que mais me marcou foi um dica que o livro linha em relação ao tbrowse.
Segundo o livro, você deveria comerça pequeno e ir crescendo, crescendo, etc.
Nas pastas do clipper existem vários exemplos com tbrowse, inclusive de arrays, com edição, etc.
Dê uma olhada neles, são interessantes e te dão uma noção grande da pontencialidade da classe.
Veja também o NG da classe.
Agora, o "dissecando o tbrowse", que eu conheço, somente no site do Anderson Cardoso (caclipperwebsite) e mediante uma contribuição monetária.
Embora o trabalho seja bom, prá quem ta começando é meio complicado, pois o Anderson carregou em recursos de programação, com arrays, etc.
Assim, embora o texto, que é uma explicação da função em si, seja muito bom, sem a base de programação fica difícil entender.
Todavia, dos source, do clipper, tem o seguinte:

Código: Selecionar todos

 * TBR10.PRG
 *
 * Clipper tbr10
 * RTLINK FILE tbr10
 *
 */

#include "inkey.ch"
#include "setcurs.ch"

#define     COLSEP     CHR(32)  + CHR(179) + CHR(32)
#define     HEADSEP    CHR(205) + CHR(209) + CHR(205)
#define     FOOTSEP    CHR(205) + CHR(207) + CHR(205)
#define     MYCOLORS   "W+/BG,N/W,W/N,N," +;
                       "GR+/W,N/BG,B+/BG,GR+/BG"

FUNCTION Main()
   LOCAL b, column, nKey, cScreen

   cScreen := savescreen()
   SET SCOREBOARD OFF
   SET CONFIRM    ON

   USE test INDEX test3 NEW
   SETCURSOR(SC_NONE)
   SETCOLOR("N/W")
   SCROLL()
   SETCOLOR("W+/BG")
   SCROLL( 2, 6, 22, 72 )
   @  2, 6 TO 22,72
   @ MAXROW(), 0 SAY ;
     PADC("ENTER - Edit      ESC - Quit",;
     MAXCOL() + 1) COLOR "W+/RB"

   b := TBrowseDB( 3, 7, 21, 71 )
   b:colorSpec := MYCOLORS
   b:colSep    := COLSEP
   b:headSep   := HEADSEP

   // Columns
   column := TBColumnNew( "Field 3", FIELDBLOCK("fld3") )
   b:addColumn( column )
   column := TBColumnNew( "Field 7", FIELDBLOCK("fld7") )
   b:addColumn( column )
   column := TBColumnNew( "Field 4", FIELDBLOCK("fld1") )
   b:addColumn( column )
   column := TBColumnNew( "Field 5", FIELDBLOCK("fld5") )
   b:addColumn( column )

   WHILE .T.
      ForceStable( b )

      IF ( b:hitTop .OR. b:hitBottom )
         TONE(87.3,1)
         TONE(40,3.5)

      ENDIF
      nKey := INKEY(0)

      IF !TBMoveCursor( b, nKey )
         IF ( nKey == K_ESC )
            SCROLL()
            EXIT

         ELSEIF ( nKey == K_ENTER )
            DoGet( b )

         ENDIF

      ENDIF

   END
   restscreen(,,,,cScreen)
   RETURN (NIL)

/*****
 *
 * Forces stabilization
 *
 */

STATIC FUNCTION ForceStable( obj )
   DISPBEGIN()
   WHILE !obj:stabilize()
   END
   DISPEND()
   RETURN (NIL)

/*****
 *
 * Cursor Movement Methods
 *
 */

STATIC FUNCTION TBMoveCursor( o, nKey )
   LOCAL nFound
   STATIC aKeys := ;
       { K_DOWN      , {|obj| obj:down()},;
         K_UP        , {|obj| obj:up()},;
         K_PGDN      , {|obj| obj:pageDown()},;
         K_PGUP      , {|obj| obj:pageUp()},;
         K_CTRL_PGUP , {|obj| obj:goTop()},;
         K_CTRL_PGDN , {|obj| obj:goBottom()},;
         K_RIGHT     , {|obj| obj:right()},;
         K_LEFT      , {|obj| obj:left()},;
         K_HOME      , {|obj| obj:home()},;
         K_END       , {|obj| obj:end()},;
         K_CTRL_LEFT , {|obj| obj:panLeft()},;
         K_CTRL_RIGHT, {|obj| obj:panRight()},;
         K_CTRL_HOME , {|obj| obj:panHome()},;
         K_CTRL_END  , {|obj| obj:panEnd()} }

   nFound := ASCAN( aKeys, nKey )
   IF (nFound != 0)
      EVAL( aKeys[++nFound], o )

   ENDIF
   RETURN (nFound != 0)

/*****
 *
 * @...GET
 *
 */

STATIC FUNCTION DoGet( obj )
   LOCAL nCursSave, xOldKey, xNewKey
   LOCAL column, get, nKey

   // Cursors are for GETs, so:
   nCursSave := SETCURSOR(SC_NORMAL)

   // make sure browse is stable
   WHILE ( !obj:stabilize() )
   END

   column := obj:getColumn( obj:colPos )

   // create a corresponding GET and READ it
   get := GetNew(ROW(), COL(), column:block,;
               column:heading,, "W+/BG,W+/B")

   // Get old key value or NIL
   xOldKey := IF( EMPTY(INDEXKEY()), NIL, &(INDEXKEY()) )
   READMODAL( {get} )
   SETCURSOR(nCursSave)

   // When a TBrowse object stabilizes, it always
   // tries to leave the same "cell" highlighted
   // as was previously.
   // That is, it always tries to keep the highlight at
   // the same position within the browse window unless
   // it is explicitly moved via an up() or down()
   // message. The TBrowse positions the data source in a
   // corresponding fashion. If there are not enough rows
   // left in a data source (i.e. EOF encontered while
   // trying to adjust the database to match the window),
   // the TBrowse willrelent and move the cursor upward,
   // leaving it on the correct record but with part of
   // the window unfilled.
   // That works OK for logical EOF, but a problem can
   // occur when a GET on a key field causes the current
   // record to move so close to logical BOF that it is
   // impossible to highlight the current record while
   // leaving the highlight in the same position within
   // the window. In this case, TBrowse opts to leave the
   // highlight in the same position within the window,
   // even though that position no longer corresponds with
   // the same record as before. That is, it repositions
   // the database as far it will go, then leaves the
   // highlight where it was. The result is that you end up
   // with the highlight on a different record than the one
   // just edited. This will fix the behavior.

   // Get records key value or NIL
   xNewKey := IF( EMPTY(INDEXKEY()), NIL, &(INDEXKEY()) )

   // If key was changed
   IF xOldKey != xNewKey
      // Refresh
      obj:refreshAll()
      ForceStable( obj )

      // Make sure we are still in the right record
      // after stabilizing
      WHILE &(INDEXKEY()) > xNewKey .AND. !obj:hitTop()
         obj:up()
         ForceStable( obj )

      END

   ELSE
      obj:refreshCurrent()
      ForceStable( obj )

   ENDIF

   // check exit key
   nKey := LASTKEY()
   IF ( nKey == K_UP .OR. nKey == K_DOWN .OR. ;
      nKey == K_PGUP .OR. nKey == K_PGDN )
      KEYBOARD CHR( nKey )

   ENDIF
   RETURN (.T.)

// EOF - TBR10.PRG //
Ps: precisa do arquivo test.dbf (vai na pasta do clipper /sources... e pega).

Espero ter ajudado.

MarceloG

Enviado: 04 Abr 2006 20:58
por And
ok.

Obrigado Marcelo.

TO QUASE LA, ME AJUDEM

Enviado: 05 Abr 2006 15:12
por managercorp
Oi pessoal fiz um demo usando o tbrowse e coloquei um referencial no fim da tela mostrando em qual coluna,linha e campo o cursor esta no momento.
So que nao consigo colocar o campo em que o cursor esta.
Pleeeeaaassse, me ajudem comecei agora com o tbrowse.
A minha ideia e editar os dados direto no grid, so que para isto preciso saber a linha, a coluna e qual o campo que dei enter para poder abrir o get, o problema e que exatamente o campo nao consigo identificar.

Código: Selecionar todos

SET DATE BRIT
ANNOUNCE RDDSYS
REQUEST DBFCDX
RDDSETDEFAUT("DBFCDX")
XUSUARIO=SPACE(10)
#include "inkey.ch"
clear
***********************
PRIV aCampos:={{"V_SOLTE","@r 99,999.99","SOLTEIRO"},;
{"V_DUPLO","@r 99,999.99","DUPLO"},;
{"V_TRIPL","@r 99,999.99","TRIPLO"},;
{"V_QUADR","@r 99,999.99","QUADRUPLO"},;
{"V_EXTRA","@r 99,999.99","EXTRA"},;
{"V_CRIAN","@r 99,999.99","CRIANCA"}}
SELE 1
USE vtarifa
SET INDEX TO vtarifa1
SET COLOR TO W/B
EXPLODE(2,3,20,76)
BRW_ARQ(2,3,20,76,aCampos)
retu
*********************
PROC BRW_ARQ
PARAMETERS brw_ls,brw_cs,brw_li,brw_ci,brw_campos
brw:=TBrowseNew(brw_ls+1,brw_cs+1,brw_li-1,brw_ci-1)
brw:colorspec := "B/BG,R/BG,G/BG,W+/W,N/BG"
brw:headsep:=chr(205)+chr(209)+chr(205)
brw:colsep:=" "+chr(179)+" "
brw:gotopblock({|| dbGoTop()})
brw:gobottomblock({|| dbGoBottom()})
brw:skipblock({|_1| MOV_PTR(_1)})
FOR i_=1 TO LEN(brw_campos)
   cp_titu:=brw_campos[i_,3]
   cp_masc:=brw_campos[i_,2]
   cp_:=brw_campos[i_,1]
   brw:addcolumn(tbcolumnnew(cp_titu,&("{||TRAN("+cp_+",["+cp_masc+"])}")))
   brw:getcolumn(i_):width := LEN(TRAN(&cp_.,cp_masc))
   brw:getcolumn(i_):colorblock=&("{||IF(cor='A',{1,4},IF(cor='B',{2,4},"+;
   "IF(cor='C',{3,4},{5,4})))}")
NEXT
volta_db=.t.
DO WHILE volta_db
   SETCOLOR("W+/B")
   SET CURSO OFF
   DO WHILE !brw:stabilize() .AND. NEXTKEY()=0
   ENDD
   READINSERT(.f.)
   x_ = COL() ; y_ = ROW()
   @ 21,01 SAY 'LINHA  -> '
   @ 22,01 SAY 'COLUNA -> '
   @ 23,01 SAY 'CAMPO  -> '
   @ 21,12 SAY Y_ PICT '99'
   @ 22,12 SAY X_ PICT '99'
   @ 23,12 SAY '[color=red]**** AQUI E QUE NAO SEI QUAL VARIAVEL SE REFERE AO CAMPO QUE ESTOU ***'[/color]   tecl_p=INKEY(0)
   carac_ = UPPER(CHR(tecl_p))
   SET CURSO ON
   brw:dehilite()
   DO CASE
   CASE TECL_P =  K_ENTER
      *ALTERA()
   CASE tecl_p = K_ESC
      volta_db=.f.
   CASE tecl_p = K_UP
      brw:up()
   CASE tecl_p = K_DOWN
      brw:down()
   CASE tecl_p = K_RIGHT
      brw:right()
   CASE tecl_p = K_LEFT
      brw:left()
   CASE tecl_p = K_HOME
      brw:home()
   CASE tecl_p = K_END
      brw:end()
   CASE tecl_p = K_PGUP
      brw:pageup()
   CASE tecl_p = K_PGDN
      brw:pagedown()
   CASE tecl_p = K_CTRL_PGDN
      brw:gobottom()
   CASE tecl_p = K_CTRL_PGUP
      brw:gotop()
   CASE tecl_p = K_CTRL_END
      brw:panend()
   CASE tecl_p = K_CTRL_HOME
      brw:panhome()
   CASE tecl_p = K_CTRL_LEFT
      brw:panleft()
   CASE tecl_p = K_CTRL_RIGHT
      brw:panright()
   ENDC
ENDD
SET CURSO ON
RETU
****************************
FUNC MOV_PTR(a_pular)
LOCAL ja_pulado := 0, chv_
IF a_pular = 0
   SKIP 0
ELSE
DO WHILE !EOF() .AND. !BOF() .AND.;
   a_pular != ja_pulado
   IF a_pular > 0
      SKIP
      ja_pulado++
   ELSE
      SKIP -1
      ja_pulado--
   ENDI
ENDD
IF EOF() .OR. BOF()
   IF a_pular > 0
      GO BOTTOM
      ja_pulado--
   ELSE
      GO TOP
      ja_pulado++
   ENDI
ENDI
ENDI
RETU ja_pulado
************************
Static Function Altera(xLin,xColuna)
MCAMPO=V_SOLTE
@ xLin,xColuna Get mCampo pict '@r 99,999.99'
Read
if reglock(5)
   replace v_solte with mcampo
endif
dbunlock()
dbcommit()
Return(0)

Enviado: 05 Abr 2006 17:50
por Alessandro
Experimente pegar o row() dentro da função ALTERA()

Uso assim e não tenho problemas.

Ok

Enviado: 05 Abr 2006 18:11
por Lopes
Vou colocar aqui um exemplo de código que uso num módulo de um sistema meu:

Código: Selecionar todos

               Coluna   := oItemBr:GetColumn(oItemBr:ColPos)
               If oItemBr:ColPos = 2
                  Loop
               ElseIf oItemBr:ColPos = 3
                  MCORRIDA := VetItens[E,10]
                  JanCorr  := AbreJanela(11,28,13,52)

                  @ 12,30 Say "Corrida:"
                  @ 12,39 Get MCORRIDA Picture Coluna:Cargo[2]
                  Read
                  If LastKey() = 27
                     FechaJanela(JanCorr)
                     __Keyboard(Chr(1))
                     Inkey(.01)
                     Loop
                  EndIf

                  VetItens[E,10] := MCORRIDA
                  FechaJanela(JanCorr)
               ElseIf oItemBr:ColPos = 4
                  MMAT_PART := VetItens[E,9]
                  JanPart   := AbreJanela(11,25,13,56)
                  @ 12,27 Say "Mat.Partida:"
                  @ 12,40 Get MMAT_PART Picture Coluna:Cargo[2]
                  Read
                  If LastKey() = 27
                     FechaJanela(JanPart)
                     __Keyboard(Chr(1))
                     Inkey(.01)
                     Loop
                  EndIf

                  VetItens[E,9] := MMAT_PART
                  FechaJanela(JanPart)
               ElseIf oItemBr:ColPos = 5
                  MPADRAO := VetItens[E,11]
                  JanPad  := AbreJanela(11,22,13,58)
                  @ 12,24 Say "Padr„o:"
                  @ 12,32 Get MPADRAO Picture Coluna:Cargo[2]
                  Read
                  If LastKey() = 27
                     FechaJanela(JanPad)
                     __Keyboard(Chr(1))
                     Inkey(.01)
                     Loop
                  EndIf

                  VetItens[E,11] := MPADRAO
                  FechaJanela(JanPad)
               ElseIf oItemBr:ColPos = 6
Como pode ver usando o método :ColPos do TBrowse você consegue saber em qual coluna está, daí usando o :GetColumn vc joga o conteúdo da coluna pra uma variável e edita ela como quiser.


Edit: Achei outro exemplo aqui nos meus fonte e creio que seja o que vc está querendo fazer, nesse módulo eu edito diretamente os bancos de dados que carreguei previamente para um objeto TBrowse

Código: Selecionar todos

            ElseIf xTecla = 13 .and. Rp_Senha(ADM_NIV,"_BROW",2)
               While !Rlock(); EndDo
               cValor := FieldGet(oBrowSub:ColPos)
               lSaiu := .T.
               SetKey(05,{|| __KeyBoard(Chr(13)+Chr(05)) , (lSaiu := .F.) })
               SetKey(24,{|| __KeyBoard(Chr(13)+Chr(24)) , (lSaiu := .F.) })
               @ Row(), Col() Get cValor
               Read
               If LastKey() # 27
                  FieldPut(oBrowSub:ColPos,cValor)
                  If nCpoUsr > 0 .and. FieldGet(nCpoUsr) != ADM_COD
                     FieldPut(nCpoUsr,ADM_COD)
                  EndIf
                  If nCpoDta > 0 .and. FieldGet(nCpoDta) != Date()
                     FieldPut(nCpoDta,Date())
                  EndIf
                  If FieldName(oBrowSub:ColPos) $ IndexKey()
                     DbStabilize(oBrowSub)
                  EndIf
                  If lSaiu .and. oBrowSub:ColPos != oBrowSub:ColCount
                     __KeyBoard(Chr(04)+Chr(13))
                  EndIf
               EndIf
               SetKey(05,NIL)
               SetKey(24,NIL)
               DbUnlock()
               DbCommit()

            ElseIf xTecla = 07 .and. Rp_Senha(ADM_NIV,"_BROW",3)
               If TemAcesso .or. ChecaAcesso()
                  If Firma(,,"Confirma "+If(Deleted(),"recuperação","exclusão?")) = 1
                     While !Rlock(); EndDo
                     If !Deleted()
                        DbDelete()
                     Else
                        DbRecall()
                     EndIf
                     DbCommitAll()
                     DbUnlockAll()
                     If Eof() // .or. Deleted()
                        DbSkip(-1)
                     EndIf
                     DbStabilize(oBrowSub)
                  EndIf
                  TemAcesso := .T.
               EndIf

            ElseIf xTecla = 22 .and. Rp_Senha(ADM_NIV,"_BROW",1)
               nRecno1 := Recno()
               DbGoBottom()
               DbSkip()
               lAppend := .T.
               oBrowSub:RefreshAll()
               oBrowSub:ForceStable()
               oCol    := oBrowSub:getColumn(oBrowSub:colPos)
               mGetVar := Eval(oCol:block)
               oGet    := GetNew(Row(), Col(),   ;
                           {|x| if(PCount() == 0, mGetVar, mGetVar := x)}, ;
                           "mGetVar")
               If oGet:type == "C" .AND. LEN( oGet:varGet() ) > 78
                  oGet:picture := "@S78"
               Endif
               ReadModal( {oGet} )
               If LastKey() # 27
                  DbAppend()
                  While !RLock(); EndDo
                  FieldPut(oBrowSub:colPos,mGetVar)
                  DbCommit()
                  DbUnlock()
                  If oBrowSub:ColPos != oBrowSub:ColCount
                     __KeyBoard(Chr(04)+Chr(13))
                  EndIf
               Else
                  DbGoTo(nRecno1)
               EndIf
               lAppend := .F.
               DbStabilize(oBrowSub)

O Amigo nao entendeu

Enviado: 05 Abr 2006 18:13
por managercorp
A linha eu ja tenho, a coluna tambem
o que nao tenho e o campo que estou

ex: estou navegando com a seta pelo grid
desci uma linha, andei duas colunas, entao o cursor esta em cima do
campo triplo, entao quando eu der enter nesse local, a minha
variavel mcampo da funcao altera tem de ser v_tripl que e o nome do campo do meu arquivo que estou no momento com o cursor em cima.

E N T E N D E U A G O R A ????????

Enviado: 05 Abr 2006 18:46
por MARCELOG
Caro Amigo,
pegue o nome do campo com FieldName().
Lembre-se, apesar de estar vendo um tbrowse, você está "folheando" o arquivo de dados ou array.

Se a Tbrowse estiver destacando o campo1, este será o nome retornado e assim sucessivamente.

Você pode, na criação do objeto tbcolumnew, utilizar o objeto cargo para guardar este nome e, usá-lo posteriormente com ajuda do método getcolumn.

oCol:=tbcolumnnew(cp_titu,&("{||TRAN("+cp_+",["+cp_masc+"])}"))
oCol:cargo:=<nome do campo>
brw:addcolumn(oCol)

...

? brw:GetColumn(brw:Colpos()):cargo

Espero ter ajudado.

MarceloG