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

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBrowse e variáveis locais

Mensagem por JoséQuintas »

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.

Código: Selecionar todos

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBrowse e variáveis locais

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder