Clipper On Line • Ver Tópico - TBrowse e variáveis locais

TBrowse e variáveis locais

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

TBrowse e variáveis locais

Mensagempor JoséQuintas » 03 Jun 2019 15:07

Alterei aqui e deu certo, serve de exemplo.
Devem pensar: como é que dá pra trabalhar sem variável PUBLIC/PRIVATE?
E não é que dá....
Situação: Usar o TBrowse para um array
Mas... e o contador de controle?
Colocar parcial aqui.

STATIC FUNCTION f_consulta()

   LOCAL oMyBrowse, oTbrowse, nBrowItem := 1
   LOCAL nKey := 0, lin := 4
   LOCAL aRecNoList := {}, nPos

   SELECT RQR3
   GOTO TOP
   DO WHILE ! Eof()
      AAdd( aRecNoList, { RQR3->( RecNo() ), .F. } )
      RQR3->( dbSkip() )
   ENDDO

   oMyBrowse := TBrowseDB( lin + 1, 3, MaxRow() - 4, MaxCol() - 4 )
   oMyBrowse:SkipBlock := { | nSkip, nTemp | nTemp := nBrowItem, nBrowItem := Max( 1, Min( Len( aRecnoList), nBrowItem + nSkip ) ), nBrowItem - nTemp }
   oMyBrowse:GoTopBlock := { || nBrowItem := 1 }
   oMyBrowse:GoBottomBLock := { || nBrowItem := Len( aRecnoList ) }
   oTBrowse := { ;
      { " "         , { || f_flag( aRecNoList, nBrowItem ) } }, ;
      { "R.M"       , { || RQR3->cod_rm } }, ;
      { " "         , { || RQR3->cod_pro } }, ;
      { "Produto"   , { || f_nome() } }, ;
      { "Quantidade", { || Transform( RQR3->qde_almc + RQR3->qde_alms,"99999.999" ) } }, ;
      { "Obra"      , { || RQR3->cod_pi } }, ;
      { "Emp"       , { || RQR3->cod_emp } } }

   ToBrowse( oTBrowse, oMyBrowse )

   DO WHILE .T.
      Mensagem( "<F3 Marca/Desmarca Item para Impressao> <F6 Imprime> <F7 Exclui> <Esc Sair>" )
      IF BrowseNavigate( oMyBrowse, @nKey )
      ELSEIF nKey == K_F3
         f_Marca( @aRecNoList )
         oMyBrowse:refreshCurrent()
      ELSEIF nKey == K_F6
         f_imparcial( aRecNoList )
         FOR nPos = Len( aRecNoList ) TO 1 STEP -1
            IF aRecNoList[ nPos, 2 ]
               ADel( aRecNoList, nPos )
               ASize( aRecNoList, Len( aRecNoList ) - 1 )
            ENDIF
         NEXT
         oMyBrowse:RefreshAll()

      ELSEIF nKey == K_F7
         IF ! Eof()
            IF MsgYesNo( AppUserName() + " confirma exclusao do registro atual?" )
               nPos := ASCan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) } )
               IF nPos != 0
                  ADel( aRecNoList, nPos )
                  ASize( aRecnoList, Len( aRecnoList ) - 1 )
               ENDIF
               RecLock()
               DELETE
               RecUnlock()
               oMyBrowse:RefreshAll()
            ENDIF
         ENDIF
      ELSEIF nKey == K_ESC
         EXIT
      ENDIF
   ENDDO

   RETURN .T.

STATIC FUNCTION f_flag( aRecNoList, nBrowItem )

   LOCAL nPos

   GOTO ( aRecnoList[ nBrowItem, 1 ] )
   nPos := AScan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) .AND. e[ 2 ] } )

   RETURN iif( nPos != 0, "*", " " )

STATIC FUNCTION f_Marca( aRecNoList )

   LOCAL nPos

   nPos := AScan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) } )

   IF nPos != 0
      aRecNoList[ nPos, 2 ] := ( ! aRecNoList[ nPos, 2 ] )
   ELSE
      AAdd( aRecnoList, { RecNo(), .T. } )
   ENDIF

   RETURN NIL


No começo o tbrowse era do arquivo, e o array só guardava a lista de marcados.
Precisei acelerar (aí não tem tudo) pra Flagship, então pensei no array.
O browse é de array, mas o arquivo vai acompanhando o array (f_Flag() posiciona)
O array contém o número de registro e a indicação se está marcado.
nBrowItem é atualizado durante a movimentação, e nem precisou ser PUBLIC/PRIVATE.

A gente acostuma com PUBLIC/PRIVATE, e acabam sendo as primeiras opções que vém à cabeça.
Como eu já evito ao máximo isso, acabei achando essa solução até interessante.

E a rotina é interessante, independente disso:
- Sem uso de PUBLIC/PRIVATE
- Browse com Array
- Browse com opção de marcar registros
- Usando array pra navegar no arquivo (com SET FILTER ficaria lento)

Nota: Agora daria pra retirar o Add() da função f_Marca(), mas ainda vou deixar lá, como precaução.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

TBrowse e variáveis locais

Mensagempor JoséQuintas » 03 Jun 2019 15:17

ToBrowse() é apenas uma rotina que transforma o array do fonte em um array a ser usado no tbrowse, e já configura algumas coisas do browse.
BrowseNavigate() é uma rotina com a parte repetitiva de acima, abaixo, pageup, pagedown, etc. que não muda nunca
São rotinas que todos tem em seus tbrowses, apenas deixei numa função pra reduzir fonte.

A parte "diferente" de um tbrowse comum é o que está aí.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18010
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: HASA e 21 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro