Business - Automação Comercial
Bematech: Criando menus e trabalhando com funções de teclado e entrada de dados
Neste novo artigo, iremos criar menus de interação com o usuário/operador (menus fixos e de rolagem) e trabalhar com funções de teclado e de entrada de dados.
por André Luiz R. MunhozNo artigo passado, preparamos todo o ambiente de desenvolvimento e
configuramos a interface do VisualSDK Builder, deixando-a mais "amigável" para
facilitar nossas implementações. Também iniciamos nosso primeiro projeto e
exploramos algumas dicas de desenvolvimento rápido.
Neste novo artigo,
iremos criar menus de interação com o usuário/operador (menus fixos e de
rolagem) e trabalhar com funções de teclado e de entrada de
dados.
Lembrete: Caso você ainda não baixou o VisualSDK Builder,
acesse:
http://www.bematech.com.br/suporte/downloads/cpus_win/SDKbuilder.zip
(+/- 20MB)
- Criando menus
Uma das primeiras
implementações que realizamos, é a criação de menus de opções para interação do
usuário com nosso software, independente da plataforma, ou seja, é através de
menus que definimos o caminho para realização das operações dentro software. No
micro-terminal SB-2030E isso não é diferente!
O display do SB-2030E é
composto por 2 (duas) linhas de 40 (quarenta) colunas. É nele que "printamos" as
mensagens para o usuário/operador e também disponibilizamos opções de
interação.
Iremos conhecer duas formas de criar menus para esta
interação.
- Menu fixo
Iremos chamar de "menu fixo" o menu
onde o operador escolhe a opção pressionando uma tecla, por exemplo: "F1" para
"Venda", "F2" para "Manutenção", "F3" para "Operador" e etc.
O código
para este tipo de menu fica assim:
void far main()
{
int iOpcao;
clrscrU();
printfU( "<F1>Vendas <F2>Manutencao
<F3>Operador\n" );
printfU( "Escolha a opcao:" );
setcursorU( ON|PISCANTE );
gotoxyU( 18, 2 );
iOpcao = getch();
switch( iOpcao )
{
case F1:
// ... rotina da opção Venda
// ...
break;
case
F2:
// ... rotina da opção Manutencao
// ...
break;
case F3:
// ... rotina da opção Operador
// ...
break;
}
}
Esta é
a representação no display, após a telecarda:
- Menu de rolagem
Outro tipo de menu que podemos criar é o
"menu de rolagem", onde o usuário escolhe a opção usando as setas do teclado
(<- ou ->) e pressione <ENTER> sobre a selecionada.
O código
para este tipo de menu fica assim:
void far main()
{
int iOpcao;
clrscrU();
printfU( "Use as setas para escolher a opcao:\n" );
getopcao( &iOpcao, 0, "<- Vendas
->,<- Manutencao ->,<- Operador ->" );
switch( iOpcao )
{
case 0:
// ... rotina da opção Venda
// ...
break;
case 1:
// ... rotina da opção
Manutencao
// ...
break;
case 2:
// ... rotina da opção Operador
// ...
break;
}
}
Esta é a
representação no display, após a telecarda:
Repare que neste código estamos usando uma função nova - a função
getopcao.
Esta função cria um menu de rolagem que retorna um valor
inteiro quando pressionado <ENTER> sobre a opção selecionada. No exemplo
acima, se for escolhida a opção "Vendas", ao pressionar o <ENTER> o
retorno para a variável iOpcao será 0 (zero); se for escolhida a opção
"Manutencao", o retorno será 1 (um); se for escolhida a opção
"Operador", o retorno será 2 (dois) e, assim, sucessivamente.
As
opções deste tipo de menu são numeradas, iniciando sempre em 0 (zero). A função
getopcao possui 3 parâmetros, onde o primeiro corresponde à variável que
receberá o valor da opção escolhida, o segundo corresponde ao índice inicial das
opções (qual opção você deseja iniciar no display) e o terceiro é a string com
as opções separadas por "," (vírgula).
Assim, disponibilizamos duas
formas diferentes de menus para que o operador possa interagir com o aplicativo
no SB-2030E.
- Funções de teclado e entrada de
dados
Vamos conhecer agora, algumas funções importantes de acesso ao
teclado e de entrada de dados - funções que são usadas na maioria das aplicações
para o SB-2030E.
- getch()
Podemos usar a função
getch para retornar o código da tecla pressionada ou efetuar uma pausa na
aplicação.
Da mesma forma que usamos para criar menus fixos, podemos
legendar as teclas de venda rápida (localizadas a esquerda do teclado do
SB-2030E) e programá-las para agilizar determinadas operações, como por exemplo,
vendas de combo de produtos ou escolher a forma de pagamento que se
deseja pagar o cupom.
A tecla <Shift> é usada para inserir
caracteres em formato maiúsculo ou acionar o segundo caracter disponível na
tecla e <Alt> é usada para acionar o terceiro caractere disponível na
tecla. Vamos tomar como exemplo a tecla "9", onde temos o símbolo "%"
(porcentagem) e "&" (E comercial). Para acionarmos o símbolo de "%"
pressionamos a tecla "9" juntamente com <Shift> (<Shift>+<9>)
e para acionarmos o símbolo "&" pressionamos a tecla "9" juntamente com
<Alt> (<Alt>+<9>).
O código abaixo pode ser usado para
testarmos esta funcionalidade:
void far main()
{
int
iTecla;
clrscrU();
printfU( "Pressione alguma
tecla..." );
iTecla = getch();
printfU( "\nCodigo da tecla pressionada: %c", iTecla );
getch();
}
Esta é a representação no
display, após a telecarda e teste do exemplo:
Obs: Para que possamos receber o código da tecla <Shift> ou
<Alt>, precisamos usar a função getkeys() ao invés de
getch(). Esta função retornará um valor inteiro, correspondente à estas
teclas, caso seja necessário usá-las para controlar alguma rotina na
aplicação.
- gets()
A função gets permite entradas
de texto via teclado. Entretanto, esta função não protege a variável que estará
recebendo o texto (string), fazendo com que seu tamanho seja extrapolado. Veja o
exemplo:
void far
main()
{
char
cCodigo[ 13 ];
clrscrU();
printfU( "Codigo do Produto: " );
setcursorU( ON|PISCANTE );
gets(
cCodigo );
setcursorU( OFF );
}
Esta é a representação no
display, após a telecarda e teste do exemplo:
Criamos a variável cCodigo que é do tipo char com 13 posições.
Esta variável receberá o código de nosso produto, informado através da função
gets. Se digitarmos um código com mais de 13 posições, a função
gets aceitará sem problemas, mas quando pressionarmos o <ENTER>,
para darmos continuidade ao programa, a área de memória reservada para esta
variável não conseguirá armazenar a informação completa, gerando um erro. Neste
caso, o ideal é usarmos a função getstring(), onde conseguimos proteger o
tamanho da variável, além de formatar a string. Veja o novo
exemplo:
void far
main()
{
char
cCodigo[ 13 ];
clrscrU();
printfU( "Codigo do Produto: " );
setcursorU( ON|PISCANTE );
getstring( cCodigo, 13,
NUMERICO, NULL, NULL );
setcursorU( OFF );
}
-
getstring()
A função gerstring permite a entrada de dados
limitando o seu tamanho (protegendo a variável) e formatando a informação. Esta
função possui 5 parâmetro a saber:
Variável que receberá a entrada dos dados pelo teclado. | ||
Parâmetro 2: | Valor inteiro com o tamanho da variável. | |
Parâmetro 3: | Constante com o tipo da entrada de dados, exemplos: | |
CLIENTE: | Modo normal numérico. | |
SOBRESCREVER: | Sobrescreve a STRING. | |
SENHA: | Aparece no visor apenas asterisco "*". | |
FORMAT_DEL: | Igual a opção "FORMAT", porém se for pressionado a tecla <DEL> apaga os caracteres do display enquanto que a opção "FORMAT" posiciona o cursor sobre os caracteres sem apagá-los do display. | |
FORMAT: | STRING formatada. | |
ALFA: | Formato alfanumérico. | |
NUMERICO: | Idem ao tipo CLIENTE. | |
REVERSO: | O cursor corre da direita para esquerda. | |
APENDE: | Se houver algo na STRING, o cursor vai para a última posição. | |
SEMVIRGULA: | Não considera as vírgulas. | |
MAIUSCULA: | Recebe os dados em maiúsculo. | |
TECPRODUTO: | Alfanumérico. | |
REESCREVER: | Reescreve a STRING. | |
Obs: No parâmetro 3, poderá ser usado mais de um tipo de constante, basta separá-los com o "|" (pipe), por exemplo: FORMAT|REVERSO. | ||
Parâmetro 4: | Formatação da string. Ex: " / / " (para entrada de Datas). | |
Parâmetro 5: | Caracter de preenchimento da variável, caso ela não tenha sido preenchida pelo operador. |
No exemplo acima, utilizamos a variável cCodigo (parâmetro 1),
limitamos o seu tamanho em 13 caracteres (parâmetro 2), restringimos somente
entradas numéricas (parâmetro 3), não usamos formatação (parâmetro 4) e, caso o
operador pressione <ENTER>, a variável vai para a memória preenchida com
nulos (parâmetro 5).
Esta é a representação no display, após a telecarda
e teste do exemplo:
- getstringvirgula
É possível fazermos entrada de dados com
vírgula, principalmente quando tratamos de entrada de valores com 2 ou 3 casas
decimais - a função que usamos para isso é a
getstringvirgula.
Esta função possui os mesmos parâmetros da
função getstring que vimos anteriormente, incluindo apenas um parâmetro
que defini o número de casas decimais que será usado, onde 0 (zero) é usado para
2 casas decimais e 1 (um) para 3 casas decimais. Veja o exemplo:
void far main()
{
char cValor[ 9 ];
memset( cValor, NULL,
sizeof( cValor ) );
clrscrU();
setcursorU(
ON|PISCANTE );
printfU( "Entre com o Valor Unitario: " );
gotoxyU( 40, 1 );
getstringvirgula( cValor, 8,
NUMERICO|REVERSO, NULL, NULL, 0 );
setcursorU( OFF );
}
Esta é a
representação no display, após a telecarda e teste do exemplo:
- DarumaFramework.SO no LinuxAutomação Comercial
- Palavra de status da impressora na DarumaFrameworkAutomação Comercial
- TEF – Comprovante de Crédito ou DébitoAutomação Comercial
- Comunicar com equipamentos Daruma em linguagens 16bits e DOSAutomação Comercial
- Verificando Redução Z nas Impressoras DarumaAutomação Comercial