Página 1 de 1

Mais espaco edicao Tbrowse

Enviado: 11 Ago 2010 23:39
por Alexandre Silva
Oi,
Tenho uma tbrowse editando uma Matriz com umas 25 colunas, ocorre que o campo descricao presisaria de umas 4 linhas de 50 caracteres para ficar bom visualmente.
Em vez de digitar uma coluna atraz da outra fazendo 4 colunas para descricao ou fazer um campo como 200 caracteres e usar a pict '@S50' para fazer rolagem, pergunto:

Nao tem a possibilidade da tbrowse quando chegasse ao final da coluna abrisse uma noma linha na coluna EM BAIXO da mesma coluna em edicao..e assim por diante como ocorre numa celula no Excell.

Esses outra linhas para digitacao poderiam aparecer apenas na edicao, quando desse enter

Alguma solucao..
Obrigado a todos

Re: Mais espaco edicao Tbrowse

Enviado: 12 Ago 2010 11:16
por ANDRIL
Amigo, fiz esta função usando array e achoice, embora tenha testado em um DbEdit, creio que possa ser utilizada no TBrowse normalmente.

Código: Selecionar todos

cls
use teste2
dbedit(00,00,22,79,,"myudf")
quit
Use a parte do lastkey()=13 adaptando para sua chamada a tecla ENTER no seu TBrowse.

Código: Selecionar todos

function myudf
parameters modo, campo
l1=row()
c1=col()
t=field(campo)
t1=&t
if lastkey()=27
   return 0
elseif lastkey()=13
   *--preencha este array com os campos e conteudos necessarios
   arCampos :={{CAMPO1_,"CAMPO1_"},;
              {CAMPO2_,"CAMPO2_"},;
              {CAMPO3_,"CAMPO3_"},;
              {CAMPO4_,"CAMPO4_"};
              }

   *--array para retornar os dados editados
   arBuffer:={}

   if edicao(l1,c1,arCampos,50)=-9
      for i=1 to len(arCampos)
          if i<=len(arBuffer)
          cmp=arCampos[i,2]
          repla &cmp with arBuffer[i]
          else
          cmp=arCampos[i,2]
          vlr=&cmp
          repla &cmp with space(len(vlr))
          endif
      next 
   endif

   keyb chr(255)
   return 2
else
   return 1
endif
Aqui a funcao que faz o controle da edição

Código: Selecionar todos

function edicao()
parameters l1,c1,arCampos,largura
local tela
//priv arBuffer:={}
priv arLinhas[len(arBuffer)], sub:=0

*--obtem o primeiro elemento passado pelo
*--array a funcao para uso no achoice

for i = 1 to len(arCampos)
   if !empty(arCampos[i,1])
   aadd(arBuffer,arCampos[i,1])
   endif
next

do while .t.
lfin=l1+len(arBuffer)

l4=lfin
tela:=savescreen(l1-1,c1-1,l4+2,c1+1+largura)

set colo to b/w,w/b
@l1-1,c1-1 to lfin,c1+largura+1
@lfin+1,c1-1 say padr("[F10]=Aceitar  [Esc]=Nao Alterar",largura+3)

sub=achoice(l1,c1,lfin,c1+largura,arBuffer,arLinhas,"contro",sub)
restscreen(l1-1,c1-1,l4+2,c1+1+largura,tela)

if lastkey()=-9.or.lastkey()=27
exit
endif
enddo
return lastkey()  //{{lastkey(),arBuffer}}


function contro
parameters modo, num_sel, posicao
do case
    case lastkey()>=48.and.lastkey()<=57.or.lastkey()>=65.and.lastkey()<=90.or.lastkey()>=97.and.lastkey()<=122.or.lastkey()=13
    setcursor(3)
    if lastkey()#13
    keyb chr(lastkey())
    else
    keyb chr(6)
    endif
    @row(),col() get arBuffer[num_sel] colo "w/n,w+/b"
    read
    setcursor(0)

    *--se a linha for toda preenchida, add uma
    *--nova linha e posiciona o cursor

    if len(alltrim(arBuffer[num_sel]))=largura
       if num_sel=len(arBuffer)
          aadd(arBuffer,space(largura))
          lfin++
          sub=num_sel+1
          keyb chr(30)
          return 1
       endif
    elseif len(alltrim(arBuffer[num_sel]))=0
       *--se a linha for editada e seu conteudo final
       *--for vazio, elimina a linha do achoice

       adel(arBuffer,num_sel)
       asize(arBuffer,len(arBuffer)-1)
       keyb chr(30)
       sub=num_sel-1
       return 1
    endif
    return 2


    case lastkey()=-9
    return 0

    case lastkey()=13
    return 1

    case lastkey()=27
    return 0

    otherwise
    return 2

endcase
Espero ter ajudado.
Ate+

Re: Mais espaco edicao Tbrowse

Enviado: 12 Ago 2010 11:53
por Pablo César
Isso aí Andril, acho que essa idéia vai servir para editar esse campo que parece ter um tamanho muito grande. Agora isso servirá para editar, mas pode também fazer uma função que apenas mostre o campo em forma completa quando o cursor estiver posicionado em dita coluna. Você poderá fazer apenas um SAY do campo concatenando em frações ao mesmo estilo que o Excel faz. É impresionante as opções que podemos obter no Tbrowse, a variável "colpos" possui a localização do cursor com respeito ao numero de colunas durante a navegação. Então antes do INKEY() que verifica se está estabilizado o TBROWSE possui faça um if b:colPos=3 -> chama a função para exibir o campo por completo em forma de janela.

Re: Mais espaco edicao Tbrowse

Enviado: 13 Ago 2010 01:53
por Alexandre Silva
Obrigado a todos..
vou adaptar e testar...