Clipper On Line • Ver Tópico - Ao sair de um READ como identificar a posicao do ultimo get?

Ao sair de um READ como identificar a posicao do ultimo get?

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

Moderador: Moderadores

 

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor lwinter » 26 Mai 2020 19:02

Pesquisei e nao encontrei. Ao sair de um READ (readmodal) preciso saber a posicao do ultimo GET que foi perdido o foco, ou seja o ultimo GET que foi pressionado enter ou exitkeys.
O que eu pretendo fazer é ao dar um erro de validacao fora do GET eu quero chamar a funcao readmodal passando o parametro nPos para que o usuario continue digitando da onde parou.
lwinter
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 123
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor Itamar M. Lins Jr. » 26 Mai 2020 19:39

Ola!
Na minha época usava as cláusulas WHEN e VALID.
@ x,y say "CPF:" get cCPF when fWhen() valid fValid()
Que é o equivalente "On [get]Focus", "On LostFocus"

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor lwinter » 26 Mai 2020 19:44

Obrigado Itamar!

Sim, preciso rever meus conceitos, estudar melhor when e valid e ver se me atende. É que estou tentando fazer algo dinamico como uma linguagem de marcacao para realizar cadastros CRUD de forma automatica.
De qualquer forma, se alguem souber agradeco!

Voce hoje esta usando a minigui?

rgds,
lwinter
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 123
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor Itamar M. Lins Jr. » 26 Mai 2020 20:48

Ola!
De qualquer forma, se alguem souber agradeco!

Se vai sair do read, via valid() vc vai jogar o "variável" do get em questão no disco ou salvar em uma nPosTelaX e sempre chamar uma função.
Tipo mineiro ôndicôtô!
Para cada aninhamento de read vc vai ter que salvar em uma nVarTelaTal

ReadModal( GetList, GotoGet("TelaClientes") ) ; GetList := {}

Function GotoGet(cTela)
local nRet:=1
IF cTela == "TelaClientes"
nRet := nPosTelaClientes
...
Return nRet


Ou usar keyboard() para simular o enter, muito complicado se tiver um campo com "valid .not. empty()"
Além do mais, pensei agora da necessidade de gravar todos os outros gets, que foi digitado, pq pra quê vou pular para o get tal se irei precisar digitar o nome da pessoa novamente ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor Itamar M. Lins Jr. » 26 Mai 2020 20:49

Ola!
Voce hoje esta usando a minigui?


Hwgui.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor lwinter » 27 Mai 2020 21:15

Eu estava imaginando que existisse algum metodo que retornasse a posicao do get dentro do getlist mas nao consegui encontrar. Como estou fazendo algo dinamico tenho gravado em um array do get e as posicoes row e col, entao ao sair do readmodal, estou pensando e "procurar" atraves do row() e col() que saiu do readmodal sua correspondencia no meu array get. Da um pouco de trabalho mas fica mais consistente. (assim espero....rsrsrs.....)

PS: Usei muito a solucao do keyboard como interface para troca de informacoes entre funcoes mas isso é meio que gambiarra e é dificil de dar manutencao. Quando precisa mexer é dificil de se alterar e testar.
lwinter
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 123
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor JoséQuintas » 27 Mai 2020 22:23

To tentando imaginar pra que raios quer saber a posição do GET.
Se encerrou.... acabou

Mas se quiser complicar....

#command READ => ReadModal( GetList ) ; GetList := {} ; ( GetList )


Não vai poder nem usar o READ, porque a lista é limpa assim que o READ se completa.

A alternativa é usar o READ SAVE

#command READ SAVE => ReadModal( GetList )


Mas vai ter que limpar o GetList manualmente.

Nota:
Perguntaram nestes dias desse uso ( GetList ).
Tá aí um uso, só pra não dar erro na compilação -w3 -es2, porque ao fazer GetList := {} teria que usar depois.
E pra não dar erro de falta de uso.... usa pra nada.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor Adalberto » 29 Mai 2020 23:33

lwinter, boa noite.

Es posible saber de que GET ha salido el READ, se consigue modificando el GetSys en:
PROCEDURE GetApplyKey(
....
CASE (nKey == K_ESC)
        oGet:exitState:= GE_ESCAPE
        cVariablePublica:= oGet:NAME     // esto es lo que debes aumentar
ENDIF

Luego en tu programa, debajo del  READMODAL

...
        @ 16,40 GET cDbf                PICT '!' ;
                VALID CtChekBox(@cDbf)                  COLOR cGet
        READMODAL( GetList, 0, ,,,,, 1 ); GetList:= {}
        Msg(cVariablePublica)
....

En cVariablePublica tendrás el nombre de la variable en la que estaba el foco cuando se terminó la captura de datos (GET/READ)

Espero que sea de utilidad para lo que estas buscando, si en algo puedo ayudar cuenta conmigo.

Abrazos, Adalberto
Adalberto
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 01 Set 2007 01:09
Cidade/Estado: Santa Cruz de la Sierra - Bolivia
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor lwinter » 30 Mai 2020 16:36

Oi Adalberto, sim me ajudou bastante!

Obrigado!

rgds,
lwinter
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 123
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor ANDRIL » 30 Mai 2020 16:54

Para não mexer no Getsys, tente
nome=space(30)
codigo=0
endereco=space(50)
ultGet=""
@01,01 say "Nome.....: "get nome pict"@!"       when acha("nome")=.t.
@02,01 say "Codigo...: "get codigo pict"999999" when acha("codigo")=.t.
@03,01 say "Endereco.: "get endereco pict"@!"   when acha("endereco")=.t.
read
? ultGet

function acha(cGet)
ultGet=cGet
return .t.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar de usuário

ANDRIL
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1271
Data de registro: 06 Jul 2004 00:44
Curtiu: 12 vezes
Mens.Curtidas: 46 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor Itamar M. Lins Jr. » 30 Mai 2020 17:04

Ola!
Depois eu entendi que ele quer simular o comportamento dos navegadores.
Guardar na memória as entradas emails, etc... COMBOBOX com os históricos do que foi digitado.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6951
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 508 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor JoséQuintas » 30 Mai 2020 17:21

Se for assim, talvez melhor apenas mexer no READ

READ SAVE
// Usa a GetList e/ou faz uma cópia
GetList := {} // ou CLEAR GETS


Mesmo assim, não sei se fica guardada a posição de finalização na GetList, vai ter que testar.

Uma vez que é pra aplicar seu dicionário, talvez seja interessante criar sua própria GetList, e ampliar recursos.
Por exemplo, a partir da GetList, fazer uma validação geral antes de finalizar.

Seria interessante, dividir o VALID em dois ou três: um pra validação, um pra formatação de campo, e um outro eventual que não tenha a ver com os anteriores. Meio parecido com o que existe, ou deveria existir, em GUI - OnChange(), OnGetFocus(), OnLostFocus(), Validate()

Como já comentei por aqui, no VB eu usava:
OnGetFocus() - por exemplo no CPF/CNPJ ou Date, pra retirar a formatação, e pro usuário digitar sem se preocupar com pontuação
OnLostFocus() - pra formatar, colocar pontuação do CPF/CNPJ ou data
Validate() - pra validação propriamente dita, até com preenchimento de um campo de descrição por exemplo, e principalmente pra validar todos os campos de uma vez no final.

Veja aí, conforme o que pretende fazer.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ao sair de um READ como identificar a posicao do ultimo get?

Mensagempor lwinter » 31 Mai 2020 14:18

Oi pessoal! Obrigado pelas sugestoes.
Eu acabei realizando uma pequena alteracao no GetSys para garantir que nPos seja a selecao do ultimo Get editado. Eu inclui uma nova variavel local chamada ultimoPos e coloquei ela dentro do While mas antes do settle pois caso der enter no ultimo campo ela retorna 0. E logo no final dela atribuo nPos = ultimoPos.

Ao inves de READ passo a chamar a readmodal direto, com:
ReadModal (GetList, @nPos)
GetList = {}
Agora tenho o valor da ultima posicao de onde saiu do Get.
Desta forma posso fazer as validacoes e caso houver erro ao entrar no get novamente a readmodal posiciona o foco no get onde ocorreu o erro.
if errocampo3()
nPos = 3 // retorna ao get 3
loop
end

Como estou tentando fazer uma classe generica de cadastro, apenas altero o metodo de validacao dos gets (de todos eles) na classe filha atraves de polimorfismo.
Sei la, foi uma forma que pensei e me parece ser boa (ate o momento) vamos ver na pratica que é onde os problemas aparecem!!

FUNCTION ReadModal( GetList, nPos, lIsMouse, getMouseButtons ) // by Leo

LOCAL oGet
LOCAL aSavGetSysVars
LOCAL aVarGet, oElement // altera��o JPA
local ultimoPos // by leo

nPos := iif( nPos == NIL, 0, nPos ) // by JPA, ref /z no 2000
hb_default (@getMouseButtons, {} )

IF ( VALTYPE( sbFormat ) == "B" )
EVAL( sbFormat )
ENDIF

IF ( Empty( GetList ) )

// S'87 compatibility
SETPOS( MAXROW() - 1, 0 )
RETURN (nPos) // by leo .F.) // NOTE

ENDIF

// Preserve state variables
aSavGetSysVars := ClearGetSysVars()

// Set these for use in SET KEYs
scReadProcName := PROCNAME( 1 )
snReadProcLine := PROCLINE( 1 )

// Set initial GET to be read
IF ! nPos > 0
nPos := Settle( Getlist, 0 )
ENDIF

ultimoPos = nPos

DO WHILE ! nPos == 0
aVarGet := Array( Len( GetList ) )
FOR EACH oElement IN GetList // by JPA to otimize screen update
aVarGet[ oElement:__EnumIndex ] := oElement:VarGet()
NEXT

// GET NEXT GET from list and post it as the active GET
PostActiveGet( oGet := GetList[ nPos ] )

// Read the GET
IF ( VALTYPE( oGet:reader ) == "B" )
EVAL( oGet:reader, oGet ) // Use custom reader block
ELSE
GetReader( oGet, lIsMouse, getMouseButtons ) // Use standard reader
ENDIF

FOR EACH oElement IN GetList // by JPA to otimize screen update
IF aVarGet[ oElement:__EnumIndex ] != oElement:VarGet()
oElement:Display()
ENDIF
NEXT
// Move to NEXT GET based on EXIT condition
nPos := Settle( GetList, nPos )

if nPos > 0
ultimoPos = nPos
end

ENDDO

// Restore state variables
RestoreGetSysVars( aSavGetSysVars )

// S'87 compatibility
SETPOS( MAXROW() - 1, 0 )

nPos = ultimoPos // by leo

RETURN (slUpdated )
lwinter
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 123
Data de registro: 07 Mar 2011 12:08
Cidade/Estado: Campinas - SP
Curtiu: 1 vez
Mens.Curtidas: 12 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro