Onde consigo a função SP_BROWSE2D ?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Onde consigo a função SP_BROWSE2D ?

Mensagem por Vlademiro »

Olá, pessoal

Estou precisando de uma rotina genérica para matriz (tipo browse).

Vi nesse link que tem o que eu preciso porque a minha eu perdi e já fucei por todo canto e não encontrei.

https://vivaclipper.wordpress.com/2013/ ... _browse2d/

Alguém sabe onde consigo essa função ? Ou então, teria alguma função genérica que possa disponibilizar ?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

A rotina pra array é a mesma pra DBF, o que altera são as rotinas de posicionamento.
Peguei dos fontes em Flagship, um fonte qualquer.
ToBrowse() e BrowseNavigate() é a parte genérica pra qualquer browse, e pra deixar tudo no mesmo padrão.
Pra estas, tanto faz se é dbf ou array.

O Browse do array

Código: Selecionar todos

STATIC FUNCTION MostDaT( aBrowList )

   LOCAL n_lin := 4
   LOCAL nkey := 0
   LOCAL nBrowIndex := 1                                    // INDEX in the array
   LOCAL oMyBrowse := TBROWSENEW (n_lin,30,n_lin+16,78)    // create TBrowse object
   LOCAL oTBrowse

   *   SetColor( cmens )
   Scroll( n_lin,30,n_lin+16,78 )

   oTBrowse := { ;
      { "Nota", {|| aBrowList[nBrowIndex][1]} }, ;
      { "Valor ", {|| aBrowList[nBrowIndex][2] } }, ;
      { "Emissao", {|| aBrowList[nBrowIndex][3]} }, ;
      { "Observacao ", {|| aBrowList[nBrowIndex][4] } } }
   ToBrowse( oTBrowse, oMyBrowse )

   oMyBrowse:SKIPBLOCK := { |input, temp| temp := nBrowIndex,    ;
      nBrowIndex := MAX(1, MIN(Len(aBrowList), ;
      nBrowIndex + input)), nBrowIndex - temp }

   DO WHILE .T.

      Mensagem( " <F2 Produtos>      <F4 Duplicatas>   <F6 Periodo>      <ESC Sair>" )

      oMyBrowse:ForceStable()

      DO CASE
      CASE BrowseNavigate( oMyBrowse, @nKey )
      CASE nkey == K_ESC                            // sai
         Scroll( n_lin,30,n_lin+16,78 )
         EXIT

      CASE nKey == K_F2                    // Produtos
         Prodnota( aBrowList[ nBrowIndex ][ 1 ] )
         oMyBrowse:refreshAll()

      CASE nKey == K_F4                    // Duplicatas
         f_DuplCl( aBrowList[ nBrowIndex ][ 1 ] )

      CASE nKey == K_F6                    // Periodo
         oMyBrowse:refreshAll()

      ENDCASE
   ENDDO

   RETURN NIL
A configuração default, tanto faz dbf ou array

Código: Selecionar todos

FUNCTION Tobrowse( oTBrowse, oMyBrowse )

   LOCAL nCont, oColumn

   oMyBrowse:headsep   := "-"
   oMyBrowse:colsep    := " "
   oMyBrowse:ColorSpec := SetColTBrowse()
   FOR nCont = 1 TO Len( oTBrowse )
      oColumn := TBColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] )
      IF Len( oTBrowse[ nCont ] ) > 2
         oColumn:ColorBlock := oTBrowse[ nCont, 3 ]
      ENDIF
      oMyBrowse:AddColumn( oColumn )
   NEXT

   RETURN NIL
A navegação, tanto faz dbf ou array

Código: Selecionar todos

FUNCTION BrowseNavigate( oBrowse, nKey )

   LOCAL lNavigate := .T.

   hb_Default( @nKey,  0 )
   DO WHILE ! oBrowse:Stable
      oBrowse:Stabilize()
   ENDDO
   //oBrowse:RefreshCurrent()
   oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:ColCount }, { 3, 3 } ) // linha está com o cursor
   oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor
   nKey := Inkey(0)
   DO CASE
   CASE nKey == K_UP         ; oBrowse:up()
   CASE nKey == K_DOWN       ; oBrowse:down()
   CASE nKey == K_LEFT       ; oBrowse:left()
   CASE nKey == K_RIGHT      ; oBrowse:right()
   CASE nKey == K_HOME       ; oBrowse:GoTop();    oBrowse:RefreshAll()  // oBrowse:Home()
   CASE nKey == K_END        ; oBrowse:GoBottom(); oBrowse:RefreshAll()  // oBrowse:End()
   CASE nKey == K_PGUP       ; oBrowse:pageup();   oBrowse:RefreshAll()
   CASE nKey == K_PGDN       ; oBrowse:pagedown(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_PGUP  ; oBrowse:gotop();    oBrowse:RefreshAll()
   CASE nKey == K_CTRL_PGDN  ; oBrowse:gobottom(); oBrowse:RefreshAll()
   CASE nKey == K_CTRL_HOME  ; oBrowse:panhome()
   CASE nKey == K_CTRL_END   ; oBrowse:panend()
   CASE nKey == K_CTRL_LEFT  ; oBrowse:panleft()
   CASE nKey == K_CTRL_RIGHT ; oBrowse:panright()
   OTHERWISE
      lNavigate := .F.
   ENDCASE

   oBrowse:RefreshCurrent()
   DO WHILE ! oBrowse:Stable
      oBrowse:Stabilize()
   ENDDO
   oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:ColCount }, { 3, 3 } ) // linha está com o cursor
   oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor

   RETURN lNavigate
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

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

SetColTBrowse() é a lista de cores a serem usadas. Deixo assim pra ficar default pra tudo, ou poder alterar tudo num lugar só.

Código: Selecionar todos

FUNCTION SetColTBrowse();   RETURN "W/B," + SetColFocus() + ",W/N*,W/BG,W/RB"
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

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

Só agora olhei o link.
Se for usar pra directory() como menciona lá, só definir as colunas:

Código: Selecionar todos

oTBrowse := { ;
      { "Nome", {|| aBrowList[nBrowIndex][F_NAME]} }, ;
      { "Tamanho", {|| aBrowList[nBrowIndex][F_SIZE] } }, ;
      { "Data", {|| aBrowList[nBrowIndex][F_DATE]} }, ;
      { "Hora ", {|| aBrowList[nBrowIndex][F_TIME] } } }
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
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Onde consigo a função SP_BROWSE2D ?

Mensagem por Vlademiro »

Obrigado Quintas

Eu já tinha começado a fazer aqui baseado em um exemplo do Toledo, que eu achei aqui nos meus CDs, quando vi a sua resposta.

Vou aproveitar as duas rotinas e criar uma classe aproveitando o que há de melhor.

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

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

Só um comentário a mais:

Existe diferença sobre a otimização: dá pra fazer otimização somente se alguma coisa não depender de atualizar posicionamento.

Exemplo:
Digita 10 vezes PGUP... o tbrowse pode ser otimizado, evitando ficar atualizando toda tela 10 vezes.
Mas precisa tomar cuidado pra não estar posicionado errado se durante essa atualização atualiza outra parte da tela, ou obrigatoriamente atualizar ao teclar ENTER.
Até por isso acabei não otimizando ao máximo esse tbrowse que mostrei.

No meu aplicativo "oficial" acabo tendo duas rotinas diferentes: uma com otimização pra onde é só consulta, e outra pra quando tem digitação durante o tbrowse.

Como disse que vai criar uma pra uso mais genérico, é bom levar isso em conta.
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/
Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

Onde consigo a função SP_BROWSE2D ?

Mensagem por Paredes01 »

Es de la librería
super.lib
BROWSE2D()

Short:
------
BROWSE2D() Popup tbrowse of 2 dimension array (array of arrays)

Returns:
--------
<nSelection> => selected item, 0 if none

Syntax:
-------
BROWSE2D(nTop,nLeft,nBottom,nRight,aArr,[aHead],[cColor],;
[cTitle],[bExcept])

Description:
------------
Pops up a box at <nTop,nLeft,nBottom,nRight> and
tbrowses array contained in <aArr>.

<aArr> must be a 2 dimensioned array, like the ones
returned from DIRECTORY() or DBSTRUCT().

i.e. { array(n),array(n),array(n) } where <n> is the
same length for each subarray.

[aHead] an array of column headers matching the
number of elements in a single subarray of <aArr>. Default is
none.

[cColor] popup box color. Default is sls_popcol()

[cTitle] title string for the box. Default is none.

[bExcept] is a codeblock that will be evaluated for
any exception keys - any keys other than up/ down/ right/ left/
pgup/ pgdn/ home/ end/ enter/ esc. [bExcept] will be passed the
parameters: key value, tbrowse object, element

Examples:
---------

proc test

local a := directory()
browse2d(5,5,20,40,a, ;
{"File","Size","Date","Time","Attribute"},,"Choose a File")

use customer
a := dbstruct()
browse2d(5,5,20,40,a,nil,nil,nil,;
{|k|msg(str(k)+" is not a valid key")})
// note the exception block
De esta forma utilizo:

Código: Selecionar todos

      aCodi:= {}

      nArea   := Select()
      
     DBSelectArea("Det001")
      nOrder = IndexOrd()
      DBSetOrder(3)
      DBSeek(COD)

      If Found()

         DO WHILE AT( (COD), Det001->EAN) > 0 .AND. !Eof()
            If Year(Date()) - Year(Det001->FECHA) <= 0

               AADD(aCodi, { Det001->Traspaso   ,;
                             Det001->Fecha      ,;
                             Det001->EAN        ,;
                             Det001->Lote1      ,;
                             Det001->Fecha1     ,;
                             Det001->Labo1      ,;
                             Det001->Id_Prod    })
            Endif
            DBSelectArea("DET001")
            DBSkip()
         Enddo

         If Len(aCodi) > 0
            ASort(aCodi,,,{ |X,Y| X[2] > Y[2] })
            Si_Codi = .t.
         Endif

      Endif

      DBSetOrder(nOrder)
      Select(nArea)

      If Si_Codi
         nSelection := BROWSE2D( 4, 2,15,78,aCodi,{"TRASPASO","FECHA","EAN","LOTE","FEC CAD","LABORATORIO","ID"},,"TRASPASOS" )

        // si teclea esc no hace nada 
        If nSelection > 0
            cEAN    := aCodi[nSelection,3]
            cLote1  := aCodi[nSelection,4]
            dFecha1 := aCodi[nSelection,5]
            cLabo1  := aCodi[nSelection,6]
            COD     := aCodi[nSelection,7]
         Endif

      Endif
Saludos!
Editado pela última vez por JoséQuintas em 27 Ago 2019 04:14, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Onde consigo a função SP_BROWSE2D ?

Mensagem por Vlademiro »

hazael, obrigado pelo exemplo, vou ver depois.

Paredes01, eu tenho a superlib aqui mas essa função não está inclusa, se vc puder mandar o código eu agradeço

Pessoal, eu fiz uma classe baseada em exemplos e dicas que colhi aqui no fórum e na pasta samples do velho Clipper.

Segue em anexo (não está concluida, falta as pictures, mas já da para usar)

Uma dúvida que tenho é como fazer a classe pegar as colunas automaticamente. Eu fiz mas não gostei (segue o trecho)

Código: Selecionar todos

 
// Aqui foi a solução que eu encontrei (um laço com o case para evitar mandar a variável)

   FOR nCont = 1 TO Len( ::aCaption )
                                                                                                                                                                                                            
      DO CASE
      CASE nCont == 1
      oColumn := TBColumnNew( ::aCaption[ 1 ], {||::aMatrix[ nBrowIndex ][ 1 ] } ) 
      CASE nCont == 2
      oColumn := TBColumnNew( ::aCaption[ 2 ], {||::aMatrix[ nBrowIndex ][ 2 ] } ) 
      CASE nCont == 3
      oColumn := TBColumnNew( ::aCaption[ 3 ], {||::aMatrix[ nBrowIndex ][ 3 ] } ) 
      CASE nCont == 4
      oColumn := TBColumnNew( ::aCaption[ 4 ], {||::aMatrix[ nBrowIndex ][ 4 ] } ) 
      CASE nCont == 5
      oColumn := TBColumnNew( ::aCaption[ 5 ], {||::aMatrix[ nBrowIndex ][ 5 ] } ) 
      CASE nCont == 6
      oColumn := TBColumnNew( ::aCaption[ 6 ], {||::aMatrix[ nBrowIndex ][ 6 ] } ) 
      ENDCASE
            
      //oColumn := TBColumnNew( ::aCaption[ nCont ], {||::aMatrix[ nBrowIndex ][ nCont ] } )   <<<<<<< Aqui seria a solução ideal mas não funciona

      ::oBrw:AddColumn( oColumn )
   NEXT



O ideal seria uma solução como a seguir, mas não funciona

Código: Selecionar todos


   FOR nCont = 1 TO Len( ::aCaption )
                                                                                                                                                                                                            
            
      oColumn := TBColumnNew( ::aCaption[ nCont ], {||::aMatrix[ nBrowIndex ][ nCont ] } )   <<<<<<< Aqui seria a solução ideal mas não funciona

      ::oBrw:AddColumn( oColumn )
   NEXT
Alguma dica ?

Valeu
Anexos
tbrw2.prg
(7.22 KiB) Baixado 169 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

Código: Selecionar todos

 //oColumn := TBColumnNew( ::aCaption[ nCont ], {||::aMatrix[ nBrowIndex ][ nCont ] } )   <<<<<<< Aqui seria a solução ideal mas não funciona
Não funciona porque o codeblock fica dependente do valor de nCont.

Sugestão? já foi dada, reveja o que postei.
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
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Onde consigo a função SP_BROWSE2D ?

Mensagem por Vlademiro »

Quintas, dá uma olhada na documentação do SP_Browse2D que foi postada pelo colega

Código: Selecionar todos


local a := directory()
browse2d(5,5,20,40,a, ;
{"File","Size","Date","Time","Attribute"},,"Choose a File")

Basicamente eu passo dois arrays: o primeiro com a matriz de dados e o segundo com a matriz com os titulos das colunas.

O código que você postou eu posso ter entendido errado, mas me pareceu que eu tenho que detalhar o índice de cada coluna de dados.

Daria pra vc postar como chamar a sua rotina de forma semelhante a SP_Browse2D ?
Não precisa detalhar o seu código, basta fazer de conta que ele é uma caixa preta e botar um exemplo de uso.

Por exemplo, eu tenho um array de cabeçalho (títulos)
aCaption := { "Nome" , "Salário" }
aSalary := { { "João" , 2000 } , { "Maria" , 2000 } }

Como eu passo esses parâmetros para o seu código mais ou menos como a SP_Browse2D ?

Foi esse o meu segundo questionamento, porque eu até consegui o mesmo resultado com a classe que eu criei, mas eu fiquei aqui pensando se não daria para tornar ela melhor.

Mas o problema em si já foi resolvido, muito obrigado a todos pela ajuda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

Vlademiro escreveu: Por exemplo, eu tenho um array de cabeçalho (títulos)
aCaption := { "Nome" , "Salário" }
aSalary := { { "João" , 2000 } , { "Maria" , 2000 } }

Como eu passo esses parâmetros para o seu código mais ou menos como a SP_Browse2D ?
Recapitulando o que postei:

Código: Selecionar todos

oTBrowse := { ;
      { "Nome", {|| aBrowList[nBrowIndex][F_NAME]} }, ;
      { "Tamanho", {|| aBrowList[nBrowIndex][F_SIZE] } }, ;
      { "Data", {|| aBrowList[nBrowIndex][F_DATE]} }, ;
      { "Hora ", {|| aBrowList[nBrowIndex][F_TIME] } } }
para o seu exemplo:

Código: Selecionar todos

aCaption := { "Nome" , "Salário" }
aSalary := { { "João" , 2000 } , { "Maria" , 2000 } }
oTBrowse := { ;
   { "Nome", { || aSalary[ nBrowIndex, 1 ] }, ; // ou aCaption[ 1 ] ao invés de "Nome"
   { "Salario", { || aSalary[ nBrowIndex, 2 ] } } // ou aCaption[ 2 ] ao invés de "Salario"
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

Onde consigo a função SP_BROWSE2D ?

Mensagem por JoséQuintas »

ok, por causa de aBrowList ser parâmetro, achou que era função de uso geral.
Trata-se de um módulo, e não de uma função.

Considere que FUNCTION MostDat( aBrowList) é Main(), seria o seu módulo.
e aBrowList seria o equivalente ao seu array aSalary.
As outras duas funções sim, são de uso geral.
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
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Onde consigo a função SP_BROWSE2D ?

Mensagem por Vlademiro »

Mais uma vez obrigado pela atenção.
Responder