Página 1 de 1

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

Enviado: 26 Mai 2020 19:02
por lwinter
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.

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

Enviado: 26 Mai 2020 19:39
por Itamar M. Lins Jr.
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.

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

Enviado: 26 Mai 2020 19:44
por lwinter
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,

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

Enviado: 26 Mai 2020 20:48
por Itamar M. Lins Jr.
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

Código: Selecionar todos

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.

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

Enviado: 26 Mai 2020 20:49
por Itamar M. Lins Jr.
Ola!
Voce hoje esta usando a minigui?
Hwgui.

Saudações,
Itamar M. Lins Jr.

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

Enviado: 27 Mai 2020 21:15
por lwinter
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.

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

Enviado: 27 Mai 2020 22:23
por JoséQuintas
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.

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

Enviado: 29 Mai 2020 23:33
por Adalberto
lwinter, boa noite.

Es posible saber de que GET ha salido el READ, se consigue modificando el GetSys en:

Código: Selecionar todos

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

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

Enviado: 30 Mai 2020 16:36
por lwinter
Oi Adalberto, sim me ajudou bastante!

Obrigado!

rgds,

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

Enviado: 30 Mai 2020 16:54
por ANDRIL
Para não mexer no Getsys, tente

Código: Selecionar todos

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.

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

Enviado: 30 Mai 2020 17:04
por Itamar M. Lins Jr.
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.

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

Enviado: 30 Mai 2020 17:21
por JoséQuintas
Se for assim, talvez melhor apenas mexer no READ

Código: Selecionar todos

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.

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

Enviado: 31 Mai 2020 14:18
por lwinter
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 )