Como usar IF...ENDIF nos comandos GET e SAY?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Maligno escreveu:Pra mim, lógica adequada é aquela que resolve o problema conforme o contexto que se apresenta, resguardadas as limitações de viabilidade, sejam elas relacionadas ao tempo disponível ou mesmo à perícia técnica.
Até concordo maligno, eu só quis mostrar que criar e depois excluir o campo era menos lógico do que somente adicionar se fosse necessário.

No caso, a mudança de cor eu não concordei, até por que o objeto continua existindo e se for pressionada alguma tecla de movimentação, o campo, mesmo invisível, pode ganhar foco.

Mas se resolver pra ele, tá bão...
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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Stanis Luksys escreveu:Até concordo maligno, eu só quis mostrar que criar e depois excluir o campo era menos lógico do que somente adicionar se fosse necessário.
Adicionar somente se necessário? Mas se o usuário ficar brincando de apertar botão? Vai ter que incluir, excluir, incluir, excluir. Se você tem a inclusão, precisa estar preparado pra contrapartida.
No caso, a mudança de cor eu não concordei, até por que o objeto continua existindo e se for pressionada alguma tecla de movimentação, o campo, mesmo invisível, pode ganhar foco.
Você diz isso por quê não testou o código que postei. O campo some e não ganha foco mais.
[]'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!
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Bom, eu particularemente, como já disse, adicionaria o objeto de acordo com a condição. Neste caso, muitas vezes nem sequer seria necessário. Evidente que deve ter a contraparida de ser excluído. Eu não disse que não, eu apenas disse que é mais lógico criar se precisar, e não excluir se precisar...

Agora se o fulano quer ficar brincando de apertar botão, compra um video-game né :))
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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Agora se o fulano quer ficar brincando de apertar botão, compra um video-game né :))
Ah, mas parece que você não conhece usuário. Além do que, ele PODE ficar brincando de passear pelos campos o quanto quiser. É a NOSSA obrigação prever que ele poderá fazer isso.
Inclusive, na minha fase de testes, uma das coisas que mais faço é tentar ferrar o sistema de alguma maneira. Se eu conseguir, é porque não trabalhei direito. Corrijo. Se eu não conseguir, o usuário também não conseguirá. Só aí eu fico tranqüilo.
[]'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!
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Maligno escreveu:Ah, mas parece que você não conhece usuário. Além do que, ele PODE ficar brincando de passear pelos campos o quanto quiser. É a NOSSA obrigação prever que ele poderá fazer isso.
Vale lembrar que mesmo que ele fizesse isso, na solução que eu sugeri, nada haveria de errado. Nenhum problema ocorreria no sistema, apenas uma inclusão e exclusão de um item em uma matriz, o que em nada é grave.
Maligno escreveu:Inclusive, na minha fase de testes, uma das coisas que mais faço é tentar ferrar o sistema de alguma maneira.
Eu deixo outros testarem, porque geralmente quem programou já está viciado na solução ideal e passa por cima de problemas de lógica.
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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Vale lembrar que mesmo que ele fizesse isso, na solução que eu sugeri, nada haveria de errado. Nenhum problema ocorreria no sistema, apenas uma inclusão e exclusão de um item em uma matriz, o que em nada é grave.
Claro que não. É só uma questão de facilidade de implementação.
Eu deixo outros testarem, porque geralmente quem programou já está viciado na solução ideal e passa por cima de problemas de lógica.
Isso nunca me aconteceu.
[]'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!
rangelssilva
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 27 Jul 2007 15:24
Localização: São Paulo - SP

Re: Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por rangelssilva »

Bom Dia, Amigos clipeiros.....
Preciso de algo similar ao mostrado abaixo.....

Ex:

@ 10,10 say"codigo" get codigo
@ 11, 10 say"pais" get pais
read

@ 10,10 say"codigo" get codigo
@ 11, 10 say"serie" get serie
read


Na verdade após o codigo ser analisado o sistema deve escolher o segundo get sendo país ou série..... Se o codigo digitado anteriormente começar com "P" ele faz a primeira opção. Caso comece com "c" ele faz a segunda.....Se o usuário digitar P e depois perceber que deveria ser C ao redigitar os dados o sistema coloca a opção correta.. Não sei se ficou claro, mas o Get/Read deve ser dinâmico... È possível fazer isto....???

Tentei fazer de diversas formas....
Agradeço a ajuda....

clodoaldomonteiro escreveu:Olá amigos!

Estou tentando mostrar um comando SAY e GET na tela, dependendo da informação de um campo anteriormente preenchido. Sei que o comando WHEN que usamos com o GET pode pular um campo se uma informação anterior foi preenchida incorretamente, mas eu queria excluir da tela as informações do SAY e do GET.

Ex:
mcampo1:='1' //Este campo deve conter 1-Legislativo ou 2-Executivo
mcampo2:=0
DO WHILE .t.
@ 01,00 SAY 'Tipo de poder:'
@ 01,16 GET mcampo1 VALI mcampo1 $ '12'
IF mcampo1='1'
@ 02,00 SAY 'Valor da RCL:'
@ 02,16 GET mcampo2 PICT '@E 999,999.99 'VALI mcampo2 > 0
ENDIF
READ
...
...
...
EXIT
ENDDO
... se eu mudar o valor de mcampo1 para '2', ainda assim é mostrado o SAY e o GET
Enquanto o comando WHEN serve somente para pular o campo GET e ainda assim mostra o comando SAY e o GET.

Desde já, agradeço a ajuda.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Note que o que você precisa só é possível de ser feito alterando a matriz da lista GET diretamente. Isso, claro, demanda algum conhecimento de como as coisas funcionam. Então, vou mostrar o código primeiro, para comentar depois.

Código: Selecionar todos

function Main()
priva cCodigo := "P"
priva cPais   := Space(20)
priva cSerie  := Space(10)

set confirm on
clear
@ 10,10 say "Codigo:" get cCodigo picture "!"  valid Ajuste()
@ 11,10 say "Pais..:" get cPais   picture "@!"
READ


//-----------------------------------------------------------
function Ajuste()
local oGet := GetList[2]
local nLen := 1+20
*
if !cCodigo $ "PS"
   cCodigo := if(oGet:Name="cPais","P","S")
   Tone(100,1)
   return .f.
end
*
if cCodigo = "P"
   @ 11,10 say "Pais..:" + Space(nLen)
   oGet:Name := "cPais"
   oGet:Block := {|x|if(x=nil, cPais, cPais := x)}
else
   @ 11,10 say "Serie.:" + Space(nLen)
   oGet:Name := "cSerie"
   oGet:Block := {|x|if(x=nil, cSerie, cSerie := x)}
end
oGet:Display()
return .t.
Existem apenas duas linhas de GET para manipular três variáveis. A primeira é o código, que vai definir qual a segunda variável será utilizada. O segundo campo é o mesmo para duas variáveis distintas: país ou série. Então, o jeito é dinamicamente alterar a matriz GET para que o segundo campo tenha sua geometria modificada para comportar a variável definida pelo valor da variável cCodigo.

O primeiro passo, como você pode ver em Ajuste(), é atualizar o SAY. Ele faz parte do comando que define a linha do campo. Mas não faz parte do GET propriamente. Se você ver o PPO, perceberá que um @...SAY...GET resulta numa coletânea de comandos. O SAY é um deles. Mas é separado e por isso, precisa ser tratado separadamente. Aí é fácil. Mas note que eu tomei o cuidado de também ajustar a extensão da variável GET. cPais e cSerie têm tamanhos diferentes. Como as variáveis em si serão reapresentadas por uma função do GET não faz mal algum limpar momentâneamente os espaços do vídeo onde elas residirão. Sem esse cuidado, ao mudar para cSerie, que é menor em extensão, ficará um "lixo" residual da variável cPais, que é maior. Por isso acrescentei Space(nLen) na reapresentação do SAY, sendo nLen o valor do espaço da maior variável (cPais) acrescido do espaço intermediário, que existe entre o SAY e o campo GET propriamente.

No passo seguinte, ajustei o campo GET. Isso eu fiz de forma bem básica. São vários ítens de controle que podem ser reajustados, conforme sua necessidade. Para o caso que se apresenta, só precisei modificar dois parâmetros para cumprir a tarefa. O primeiro é o nome da variável. O sub-sistema GET dispõe da função ReadVar(), que fornece a você, para um propósito específico qualquer, o nome da variável (não é o conteúdo). O segundo parâmetro é o bloco de código que permite acessar o conteúdo da variável. O sub-sistema GET utiliza esse bloco internamente para respaldar a execução das funções VarGet() e VarSet(), que são as funções que normalmente utilizamos para ler ou alterar o conteúdo de um campo GET.

O passo final é a re-apresentação do campo GET, devidamente modificado, através da função Display().

Faça algumas experiências, modificando alguns parâmetros para ver que bixo dá. Assim você consegue se familiarizar mais facilmente com o sub-sistema GET e começa a entender melhor como tudo funciona. A arquitetura desse sub-sistema é das mais pobres possíveis. Mas até que dá espaço para criar coisas bem interessantes. Se quiser se aprofundar nisso, é aconselhável uma boa leitura do seu fonte, que está no arquivo GETSYS.PRG, no diretório SOURCES da sua instalação do Clipper.
[]'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!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por JoséQuintas »

Voltando ao primeiro caso do say/get:
Ao meu ver, mostrar não é problema, e sim permitir digitação.
Então poderia simplificar assim:

Código: Selecionar todos

@ 5, 5 SAY "Primeiro ou Segundo:" GET nCodigo PICTURE "9" RANGE 1,2
@ 6, 5 SAY "Primeiro..............:"  GET cPrimeiro WHEN nCodigo == 1
@ 7, 5 SAY "Segundo..............:" GET cSegundo WHEN nCodigo == 2
READ
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por clodoaldomonteiro »

Quintas,

A minha intenção na época era poder navegar entre os GETs que são finalizados por um READ, é claro, e que o usuário pudesse getar um campo1 com uma informação X e este campo1 influenciasse no GET de um campo10 mas a frente, mas se o usuário retornasse a este campo1 o informasse Y pudesse mudar a disposição dos GETs e não precisasse mais getar esse campo10, por exemplo.

É um dos limites da programação do Clipper que se processa os GETs depois do READ, mas aí, não se pode voltar com a seta para cima, teria-se que fazer uma programação mais elaborada. Coisa que no Delphi e outras linguagens mais novas isto é mais intuitivo.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por JoséQuintas »

Duas variações no GET:

Código: Selecionar todos

   LOCAL GetList := {}
   @ 1, 0 GET a VALID OutroGet()
   @ 2, 0 GET B
DO WHILE .T.
   READ SAVE
   IF Confirma()
       EXIT
   ENDIF
ENDDO
CLEAR GETS


FUNCTION OutroGet()
   LOCAL GetList := {}
   SAVE SCREEN
   @ 3, 0 GET C
   READ
    RESTORE SCREEN
   RETURN .T.
Apenas exemplos usando o sistema de GETS padrão.
Fora isso, pode criar o seu próprio.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por JoséQuintas »

Um teste que fiz nos tempos do Clipper pra usar TABs.
Não cheguei a deixar pronto pra uso.
Talvez seja por aí, apenas pra exemplo.

Toda tela é um único GET, onde os GETS estão distribuídos pelas TABs, e pode ser usado o mouse pra "passear" pelas TABs durante o GET.
**O GET não se limita ao primeiro campo, tem um pouco em cada tab.
tabget.png
tabget.png (7.9 KiB) Exibido 2265 vezes
INKEY.zip
(322.56 KiB) Baixado 95 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por JoséQuintas »

O fonte do programa principal:

Código: Selecionar todos

#include "inkey.ch"
#include "tabget.ch"

procedure Main

readexit(.t.)
AltD(.t.)
Set( _SET_EVENTMASK, 159 ) // INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
set color to w/b, n/w,,,w/b
set scoreboard off
set status off
clear
lCancel := .f.
label0 = "MINHOCA"
text0  = "TATU"

TabBegin(5,5,20,70)
@ 0, 0 TABSAY Label0 "Teste"
@ 0, 10 TABGET Text0 "000002"

NewTab("Dados")
     @ 0, 0  TABSAY Label1 "Codigo"
     @ 0, 10 TABGET Text1  "000001" ;
        picture "@K 999999" valid Val(Text1)>0
     @ 1, 0  TABSAY Label2 "Nome"
     @ 1, 10 TABGET Text2 "NOMENOMENOME" ;
        picture "@!"
NewTab("Financeiro")
     @ 5, 10 TABSAY Label3 "Endereco"
     @ 5, 20 TABGET Text3 "ENDERECOENDERECO" picture "@!"
     @ 6, 10 TABSAY Label4 "Cidade"
     @ 6, 20 TABGET Text4 "CIDADECIDADE" picture "@!"
NewTab("Cobranca")
// @ 6, 20 TABCMD lCancel ;
//         CAPTION "&Cancel" ;
//        STATE { || OlaMundo() }
     @ 7, 10 TABSAY Label5 "UF"
     @ 7, 20 TABGET Text5 "SP" picture "@!A"
     @ 8, 10 TABSAY Label6 "CEP"
     @ 8, 20 TABGET Text6 "03676080" picture "@R 99999-999"
NewTab("Entrega")
   @ 5, 10 TABSAY Label7 "Codigo"
   @ 5, 20 TABGET Text7 "000005"
NewTab("Obs")
   @ 6, 10 TABSAY Label8 "minhoca"
   @ 6, 20 TABGET Text8 "tatu"
// NewTab()
//     @ 3, 10 TABMEMO Memo1 "teste"
TabEdit(.t.)
ReadTabs()

clear
? text0
? label0
? label6

function OlaMundo()
   @ 23, 0 say "Ola Mundo"
   inkey(0)
   Scroll(23,0,23,79,0)
return NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar IF...ENDIF nos comandos GET e SAY?

Mensagem por JoséQuintas »

Revi o texto.
Uma coisa mais simples para o seu caso: coloque o texto do SAY em uma varável e faça GET WHEN .F.

Código: Selecionar todos

// cTexto = 'pais"
cTexto := "Pais"
@ 1, 0 SAY "Codigo" GET nCodigo VALID ReturnValue( .T., cTexto := iif( nCodigo == 1, "Pais ", "Serie" ) )
// @ 2, 0 SAY cTexto WHEN .F.
@ 2, 0 GET cTexto WHEN .F.
//@ 2, Col() + 2 GET cTexto
@ 2, Col() + 2 GET cValue
READ

FUNCTION ReturnValue( xValue, a, b, c, d, e, f )
   RETURN xValue
Nota: postado 02/05, corrigido 16/07. Mantive a parte original errada com //
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder