GET com temporizador
Moderador: Moderadores
GET com temporizador
Pessoal,
To migrando do Clipper52e pro XHarbour, sem LIB visual, e preciso do que se segue...
Um usuário navega num TBrowse e, sobre o registro X, tecla ENTER para editá-lo. Meu programa então bloqueia o registro e abre os respectivos campos numa outra tela. O usuário altera o que precisar, grava as alterações e, na saída, o registro é UNLOCKado. Aí aí, baba. O problema é o que o usuário "esquece" essa tela aberta e então o arquivo fica "amarrado", até que o usuário saia da edição...
O que eu imagino que preciso: alterar o GETSYS, na parte onde ele captura as teclas pressionadas, trocando o inkey(0) por um inkey() e controlando o tempo dentro do loop: se o usuário não teclar nada por X tempo, o READ é abortado, então UNLOCKo o regisrto e volto o controle pro TBrowse.
Ah, no TBrowse vai ser a mesma coisa, mas isso eu já resolvi: se o usuário deixa a tela aberta, rodando sem necessidade, depois de X tempo (sem que o usuário tecla alguma coisa) ele é encerrado...
To migrando do Clipper52e pro XHarbour, sem LIB visual, e preciso do que se segue...
Um usuário navega num TBrowse e, sobre o registro X, tecla ENTER para editá-lo. Meu programa então bloqueia o registro e abre os respectivos campos numa outra tela. O usuário altera o que precisar, grava as alterações e, na saída, o registro é UNLOCKado. Aí aí, baba. O problema é o que o usuário "esquece" essa tela aberta e então o arquivo fica "amarrado", até que o usuário saia da edição...
O que eu imagino que preciso: alterar o GETSYS, na parte onde ele captura as teclas pressionadas, trocando o inkey(0) por um inkey() e controlando o tempo dentro do loop: se o usuário não teclar nada por X tempo, o READ é abortado, então UNLOCKo o regisrto e volto o controle pro TBrowse.
Ah, no TBrowse vai ser a mesma coisa, mas isso eu já resolvi: se o usuário deixa a tela aberta, rodando sem necessidade, depois de X tempo (sem que o usuário tecla alguma coisa) ele é encerrado...
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Opa,
Eu tenho essa alteração no getsys em algum lugar por aqui. Inclusive lembro que ela é abordada no segundo livro da série do Ramalho. O read "temporizado".
Se eu achar eu aviso.
Falou!
Eu tenho essa alteração no getsys em algum lugar por aqui. Inclusive lembro que ela é abordada no segundo livro da série do Ramalho. O read "temporizado".
Se eu achar eu aviso.
Falou!
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Ele quis dizer colocar uma função de temporização pra executar em cada WHEN de cada campo. Dá um pouco de trabalho, principalmente se forem muitos campos, mas dá pra modificar o comando GET pra deixar isso embutido.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
De tanto que trabalhei, meus miolos estão meio derretidos. Esquece o que eu disse: por WHEN não dá. Nem por VALID. Teria que alterar o GETSYS, obrigatoriamente.
Se no XHarbour for parecido com o que se tem no Clipper, é só colocar um temporizador na função que chama o aplicador. No Clipper, seria:
Seria só trabalhar em cima disso aí. E, claro, alterar o comando READ para aceitar uma configuração de temporização. Mas nem dá tanto trabalho. 
Se no XHarbour for parecido com o que se tem no Clipper, é só colocar um temporizador na função que chama o aplicador. No Clipper, seria:
Código: Selecionar todos
// Apply keystrokes until exit
WHILE ( oGet:exitState == GE_NOEXIT )
GetApplyKey( oGet, inkey( 0 ) )
ENDDO[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Bom, aí eu passo.Mas e no XHarbour? Num achei o Getsys...
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Eu uso assim no XHARBOUR sem ter de mexer em nada
antes dos get
keysec(254,INT(60),- 1,.t.) && 60 segunods
SET KEY 254 TO Fechar_get
...
..
comandos
..
para desativar no fim
keysec()
FUNCTION fechar_get
IF EMPTY(READVAR())
KEYB CHR(27)
ELSE
KEYB CHR(27)+CHR(27)
ENDIF
RETURN
antes dos get
keysec(254,INT(60),- 1,.t.) && 60 segunods
SET KEY 254 TO Fechar_get
...
..
comandos
..
para desativar no fim
keysec()
FUNCTION fechar_get
IF EMPTY(READVAR())
KEYB CHR(27)
ELSE
KEYB CHR(27)+CHR(27)
ENDIF
RETURN
Luis Fernando Basso
Desenvolvedor VFP + XHARBOUR + HWGUI
lfbasso@gmail.com
http://www.engersoft.com.br
Desenvolvedor VFP + XHARBOUR + HWGUI
lfbasso@gmail.com
http://www.engersoft.com.br
Não conheço essa função, mas imaginava algo mais "enraizado", como por exemplo: READ KILL IN <n> SECS. Mas se sua dica funciona, já é uma ajuda pro colega. 
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Eolo, o colega esbasso matou a charada com o exemplo que ele postou.
Assim que der vou dar uma olhada no GETSYS.PRG do xharbour...e realmete pelo WHEN não daria...minha idéai era iniciar um contador junto com GET, mas o GET não executa o WHEN enquanto não sair dele !!! :(Neg :(Neg
Abraços
Leonardo Machado
Assim que der vou dar uma olhada no GETSYS.PRG do xharbour...e realmete pelo WHEN não daria...minha idéai era iniciar um contador junto com GET, mas o GET não executa o WHEN enquanto não sair dele !!! :(Neg :(Neg
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Na verdade o WHEN é executado assim que o objeto GET ganha foco, o VALID sim é executado ao sair do GET. De qualquer forma o temporizador não poderia ser aplicado a nenhuma das duas cláusulas, e sim diretamente no tratamento que o comando READ faz a lista de GETs pendentes, que foi o que o colega postou acima.sygecom escreveu:mas o GET não executa o WHEN enquanto não sair dele !!!
Note que no exemplo dele, a função é executada de qualquer maneira, e abandona o READ avaliando se os GETs da sua lista de pendência permanecem inalterados. Ou seja, sempre, afinal a gravação ainda não foi executada.
Falou!
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Esbasso, essa sua função sempre vai derrubar o READ depois de 60 segundos, independentemente do usuário ter teclado alguma coisa, certo?
Bão, embora seja um tempo razoável, eu gostaria de fazer o mesmo que fiz no TBRowse (ou seja, o tempo ficando ligado à inatividade): na entrada, eu marco o horário e, a cada loop, vejo se já se passaram 60 segundos. Se sim, EXIT. Só que, a cada loop, eu reinicio a "hora de entrada" quando o usuário tecla qq coisa... Por ex, se o cara teclar SETA ACIMA aos 59 segundos, o tempo é reiniciado...
Então, pergunto se isso seria possível no GET:
- se o usuário não digitou nada (em nenhum dos GETs), sai em 60 segundos sem dizer tchau;
- se ele digitou qq coisa mas está inativo há 60 segundos, bota um aviso na tela ("Processo sendo encerrado por inatividade...") e dá 5 segundos pro usuário se manifestar... Se nada for digitado, tchau (mesmo perdendo alterações não salvadas).
Bão, embora seja um tempo razoável, eu gostaria de fazer o mesmo que fiz no TBRowse (ou seja, o tempo ficando ligado à inatividade): na entrada, eu marco o horário e, a cada loop, vejo se já se passaram 60 segundos. Se sim, EXIT. Só que, a cada loop, eu reinicio a "hora de entrada" quando o usuário tecla qq coisa... Por ex, se o cara teclar SETA ACIMA aos 59 segundos, o tempo é reiniciado...
Então, pergunto se isso seria possível no GET:
- se o usuário não digitou nada (em nenhum dos GETs), sai em 60 segundos sem dizer tchau;
- se ele digitou qq coisa mas está inativo há 60 segundos, bota um aviso na tela ("Processo sendo encerrado por inatividade...") e dá 5 segundos pro usuário se manifestar... Se nada for digitado, tchau (mesmo perdendo alterações não salvadas).
Neste caso o problema passa a ser outro. Você precisa identificar se houve ou não alguma alteração. De duas uma: ou você compara seus campos um a um ou você faz como eu, que uso apenas matrizes para armazenar esses campos. Antes do GET, meu GETSYS armazena o CRC32 da matriz toda (convertida pra matriz). Ao sair, ele recalcula e compara com o valor armazenado. Se iguais, sai sem aviso, gravação, etc.Então, pergunto se isso seria possível no GET
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
