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. Munhoz



No 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:

Parâmetro 1:
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:

André Luiz R. Munhoz

André Luiz R. Munhoz - Bematech: DSP - Desenvolvimento de Software e Parcerias.
Visite o site: http://www.bematech.com.br.