Estou montando uma tabela com o Tbrowse, e cada coluna dá um get em um elemento da matriz. Tipo:
Código Valor RTG data ...
O Tbrowse está Ok. Não consigo no entanto posicionar a coluna corretamente para dar get no valor, rtg, etc, continha sempre na primeira coluna. Já pesquisei no fórum e no google, tentei um monte coisas, mas não deu certo.
Antes de dar get em cada coluna tento o seguinte:
browse := FTBROWSE() // cria objeto de rolagem
// pu_matget1 e demais tem que estar criadas com 1 posi‡Æo senÆo d erro em ind
// quando faz a primeira estabiliza‡Æo
l_flag := .f.
DO WHILE LASTKEY() <> K_ESC
l_flag := FgetLIN(browse)
l_tecla := FKEYS_TBROWSE(browse)
IF l_tecla = K_END
EXIT
ENDIF
ENDDO
return
******************************************************************************
// 1 -------------------- define objeto TBROWSE
******************************************************************************
**********************
FUNCTION FTBROWSE()
**********************
PUBLIC ind := 1
browse := TBROWSENEW(7,00,20,79)
***************************************************
// skipblock
**************************************************
browse:skipblock := { |aSaltar| l_Saltados:= IF ( ABS(aSaltar) >= ;
IF (aSaltar >= 0, LEN(pu_matget1)-ind,ind-1), ;
IF (aSaltar >= 0, LEN(pu_matget1)-ind,1-ind), aSaltar), ind+=l_Saltados, l_Saltados }
browse:gobottomblock := { || ind := LEN(pu_matget1) }
browse:gotopblock := { || ind := 1 }
browse:headsep := chr(176)
browse:colsep := " "+chr(176)
browse:nbottom := 19
browse:ntop := 7
browse:nleft := 1
browse:nright := 75
// define as colunas
coluna:= TBCOLUMNNEW(" ", { || TRANS(pu_matget1[ind],"XXXXXXXXXX") } )
coluna:heading := "No C¢digo "
coluna:colpos:= 2
browse:addcolumn(coluna)
coluna:= TBCOLUMNNEW("Valor ", { || pu_matget4[ind] } )
coluna:width := 10
coluna:cargo := { || "@z 9999999.99" }
coluna:colpos:= 60
browse:addcolumn(coluna)
coluna:= TBCOLUMNNEW("RTG", { || pu_matget5[ind] } )
coluna:width := 3
coluna:colpos := 70
browse:addcolumn(coluna)
DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO
RETURN(browse)
**************************************
FUNCTION FgetLIN(browse)
**************************************
Local l_get := .f.
DO WHILE LASTKEY() <> K_ESC
FgetCOD(browse,ind)
// get no valor
FgetVL(browse,ind)
FgetRTG(browse,ind)
exit
ENDDO
RETURN(.T.)
******************************
FUNCTION FgetCOD(browse,ind)
******************************
LOCAL coluna_get
PRIVATE pr_getlist2 := {} ,;
lin ,;
col
************************************************
* GET na tabela de CODIGO do servico - matget1
************************************************
IF ind > LEN(pu_matget1)
// precisa incluir ¡tem na tabela senÆo d erro - Insere nova posi‡Æo
AADD(pu_matget1,SPACE(10) )
ENDIF
DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO
coluna_get := browse:getcolumn(1)
newOBJGET(pr_getlist2,"pu_matget1[" + STRZERO(ind,2) + "]" , "XXXXXXXXXX")
Newread(pr_getlist2)
browse:configure()
browse:stable := .f.
browse:refreshcurrent()
RETURN(pu_matget1[ind])
******************************
FUNCTION FgetVl(browse,ind)
******************************
LOCAL oBget
PRIVATE pr_getlist2 := {} ,;
lin ,;
col
DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO
column := browse:getcolumn(2)
lin := row()
newOBJGET(pr_getlist2, 'pu_matget4[' + STRZERO(ind,2) + ']' , "99999999999.99")
newread(pr_getlist2)
RETURN(pu_matget4[ind])
*************************************************************
FUNCTION newOBJGET(pa_list_get,pa_var_get, pa_pict_get, pa_val_when,pa_val_get)
*************************************************************
pa_val_when := IF (pa_val_when = NIL , '{ || .t. }', '{ || '+pa_val_when+' }')
pa_val_get := IF (pa_val_get = NIL , '{ || .t. }', '{ || '+pa_val_get +' }')
oBget := _get_(&pa_var_get,pa_var_get,pa_pict_get,&pa_val_get,&pa_val_when)
lin := oBget:row()
//col: = Obget:col()
SetPos(lin,col)
*** adiciona o campo/variavel em getlist para dar get
AADD(pa_list_get, oBget )
RETURN(pa_var_get)
FUNCTION NEWREAD(pr_getlist2,oBget)
READMODAL(PR_GETLIST2)
RETURN(pr_getlist2)
[/code]
Urgente: Tbrowse e _GET_
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Bom dia Eliane,
confesso que dei uma olhada bem por cima do seu código, mas eu preferiria trabalhar encima do fonte que estou te mandando. Desculpa, mas achei um pouco confusso e ora também tem algumas declarações que por causa disso não conseguí compilar. Também seria bom que quando você postasse seu código-fonte, você utilizasse os recursos de edição "Code" do FORUM. Assim a exibição do seu código irá respeitar os espeaços e tabulações necessárias para melhor compreensão.
Estou mandando um programinha simples, mas que te dará outra visão. Mandei para nanesecco@hotmail.com
Um clip-abraço :)Pos
confesso que dei uma olhada bem por cima do seu código, mas eu preferiria trabalhar encima do fonte que estou te mandando. Desculpa, mas achei um pouco confusso e ora também tem algumas declarações que por causa disso não conseguí compilar. Também seria bom que quando você postasse seu código-fonte, você utilizasse os recursos de edição "Code" do FORUM. Assim a exibição do seu código irá respeitar os espeaços e tabulações necessárias para melhor compreensão.
Estou mandando um programinha simples, mas que te dará outra visão. Mandei para nanesecco@hotmail.com
Um clip-abraço :)Pos
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Eliane,
Deixa eu dar um palpite, dizer do jeito mais "simples" que eu faço isso.
Eu montei um TBrowse() "caseiro", usando do original (que acho mesmo complicado de usar) só o mínimo necessário pra abrir o DBF, estabilizar, mostrar os campos na tela, permitir a navegação e ficar esperando o usuário teclar alguma coisa, com um refresh a cada X tempo.
Aliás, eu mostro os campos todos concatenados, com só um AddColumn(). Crio colunas adicionais só se os campos concatenados não couberem na largura (80) da tela. Com isso, o Hilite pega a linha inteira (e não campo a campo) e, se for mais de uma tela, o usuário pode navegar entre elas com as setas direita/esquerda de direção. E, se precisar congelar colunas, eu simplesmente repito os campos desejados em todos os itens do array... Com isso, consigo "congelar" colunas até no meio da tela, se desejar.
Aí, dentro da função de usuário do TBrowse(), depois do INKEY() que fica monitorando o teclado, eu montei um DO CASE que chama funções aplicáveis a cada caso:
Na função Nome_edita(), por exemplo, eu bloqueio o registro, jogo o conteúdo dos campos para variáveis, limpo a tela e faço os GETs (das variáveis) distribuidos onde eu quiser em uma NOVA tela ("Edição"). O usuário altera o que for necessário e, se teclar F10 (no meu caso), a rotina faz o REPLACE do que foi alterado, UNLOCKa e termina (se o usuário teclar ESC, pula o REPLACE). E aí o comando volta pro TBrowse(), reixibindo a tela com a lista de registros...
Com isso,
- eu não deixo o usuário alterar o DBF diretamente. Ele mexe nas variáveis e, se alterar algum campo chave e mandar salvar, eu peço pra ele confirmar a alteração (usuário dá ENTER sem pensar e depois reclama que o registro se alterou sozinho...).
- eu posso usar o espaço inteiro da tela (24x80) para os GETs, ou mesmo usar mais de uma tela se necessário. No TBrowse, vc fica limitado à linha e às 80 colunas, não permitindo a visualisação de todos os campos em conjunto.
- no caso de serem poucos campos (por exemplo QUANT, CODIGO, DESCRICAO, UNITARIO), que cabem nas 80 colunas, eu faço o GET sem apagar a tela do TBrowse(): é só fazer @row(),10 get CODIGO, @row,20 get DESCRICAO etc.
- fico livre das "complicações" do TBrowse()... Na hora de fazer alguma manutenção, fica mais fácil.
Eolo
Deixa eu dar um palpite, dizer do jeito mais "simples" que eu faço isso.
Eu montei um TBrowse() "caseiro", usando do original (que acho mesmo complicado de usar) só o mínimo necessário pra abrir o DBF, estabilizar, mostrar os campos na tela, permitir a navegação e ficar esperando o usuário teclar alguma coisa, com um refresh a cada X tempo.
Aliás, eu mostro os campos todos concatenados, com só um AddColumn(). Crio colunas adicionais só se os campos concatenados não couberem na largura (80) da tela. Com isso, o Hilite pega a linha inteira (e não campo a campo) e, se for mais de uma tela, o usuário pode navegar entre elas com as setas direita/esquerda de direção. E, se precisar congelar colunas, eu simplesmente repito os campos desejados em todos os itens do array... Com isso, consigo "congelar" colunas até no meio da tela, se desejar.
Aí, dentro da função de usuário do TBrowse(), depois do INKEY() que fica monitorando o teclado, eu montei um DO CASE que chama funções aplicáveis a cada caso:
Código: Selecionar todos
inkey(5)
do case
case lastkey()=13 // ENTER? Edição do registro
if rotina=="NOMES"
nome_edita()
elseif rotina=="PRODUTOS"
produto_edita()
endi
case lastkey()=-4 // F5? Deleção de registro
if rotina=="NOMES"
nome_deleta()
elseif rotina=="PRODUTOS"
produto_deleta()
*...
* essa variável ROTINA é global e seu valor é sempre alterado
* no início de cada rotina, aí eu sei, dentro da função do TBrowse,
* de onde veio a chamada.
endcCom isso,
- eu não deixo o usuário alterar o DBF diretamente. Ele mexe nas variáveis e, se alterar algum campo chave e mandar salvar, eu peço pra ele confirmar a alteração (usuário dá ENTER sem pensar e depois reclama que o registro se alterou sozinho...).
- eu posso usar o espaço inteiro da tela (24x80) para os GETs, ou mesmo usar mais de uma tela se necessário. No TBrowse, vc fica limitado à linha e às 80 colunas, não permitindo a visualisação de todos os campos em conjunto.
- no caso de serem poucos campos (por exemplo QUANT, CODIGO, DESCRICAO, UNITARIO), que cabem nas 80 colunas, eu faço o GET sem apagar a tela do TBrowse(): é só fazer @row(),10 get CODIGO, @row,20 get DESCRICAO etc.
- fico livre das "complicações" do TBrowse()... Na hora de fazer alguma manutenção, fica mais fácil.
Eolo
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Oi Eliane,
Fico feliz que tenha sido muito útil os exemplos que te mandei. Agora achei este outro exemplo que vale a pena ver também:
https://pctoledo.org/forum/viewto ... hada#24138
Espero que você consiga dominar o TBROWSE, pois para todos nós é muito poderoso.
Um clip-abraço. :)Pos
Obs.: Pelo teu silêncio... acho que você está mandando a ver (muito ocupada desenvolvendo, digo)
Fico feliz que tenha sido muito útil os exemplos que te mandei. Agora achei este outro exemplo que vale a pena ver também:
https://pctoledo.org/forum/viewto ... hada#24138
Espero que você consiga dominar o TBROWSE, pois para todos nós é muito poderoso.
Um clip-abraço. :)Pos
Obs.: Pelo teu silêncio... acho que você está mandando a ver (muito ocupada desenvolvendo, digo)


