Ir ao conteúdo
  • Cadastre-se
ehourneaux

Dúvidas em rotina de entrada de dados

Recommended Posts

Fala galera.

Sou novato no Pascal e estou com uma dúvida.

Eu fiz uma rotina de entrada de dados, onde a cada caracter digitado, é feita uma busca numa tabela, procurando um nome, letra por letra. Algo parecido com o campo de entrada do Google, por exemplo, que durante a digitação, as sugestões vão aparecendo.

Consegui com "readkey" e "case of", utilizando caracteres ASCII nas opções do "case of".

A minha dúvida é com relação ao backspace. Já que não dá pra usar a função do teclado (por causa do readkey e dos caracteres ASCII), preciso montar uma rotina que recua o cursor e apaga último caracter. Consegui o recuo com um decremento das variáveis de "gotoxy". Mas como apago um caracter?

É mais ou menos isso aqui:

...

var entrada, palavra: string;
gotoxy(x,y);
entrada:= readkey;
case of entrada
#08: goto(x, y-1); {backspace}
end;
palavra:= palavra + entrada;

...

Alguém tem uma ideia?

Desde já, muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá ehourneaux. Seja bem vindo ao Fórum do Clube do Hardware.

Eu fiz uma rotina de entrada de dados[...]

Seria melhor se tivesse postado toda a rotina... mas vamos lá...

var entrada, palavra: string;
gotoxy(x,y);
entrada:= readkey;
case of entrada
#08: goto(x, y-1); {backspace}
end;
palavra:= palavra + entrada;

1) A variável entrada deve ser do tipo CHAR, já que o ReadKey (da unit CRT ou WinCRT) retorna um CHAR (ou seja, "a tecla pressionada").

2) O case está com os parâmetros fora de ordem, o correto seria:

case entrada of

3) Dentro do case, o comando para posicionar é GotoXY e não Goto (por sinal, este comando existe para outro fim. Obs.: está desuso!!!).

***

DICAS

1) Use constantes para as teclas

De preferência como "globais" (declaradas no início do programa, e não dentro da rotina... dessa forma, visível para todo o programa).

Ex.:

const
ESC =#27;
ENTER =#13;
BACKSPACE =#08

2) Impressão das teclas pressionadas

Após ler, simplesmente imprima as teclas com um write().

Obs.: Será precisa tratar as exceções, falo mais abaixo.

2.1) Tratar as exceções

Como é sabido, nem sempre deve imprimir, daí trata as exceções. Ex.:

  if not (entrada in [ESC,ENTER]) then
begin
write(entrada);
...

Obs.: Lembrando que talvez seja preciso tratar outras teclas... ai vai dos requisitos...

3) Apagar caractere com BACKSPACE

Pesquise sobre os comandos, podem ser úteis.

- Para apagar na tela: WhereX, WhereY, GotoXY()

- Para apagar da palavra: Length(), Delete().

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simon, acho que consegui.

Abaixo vai o código, sem nenhum tipo de consistência, ok?

Se quiser comentar, eu agradeceria.

Valeu a ajuda.


Program backspace;
uses Crt;
var
i, x, y: integer;
p, palavra: string;
begin
clrscr;
writeln('Digite alguma coisa, depois use o <BACKSPACE>.');
writeln('Digite <ENTER> para terminar.');
i:= 1;
y:= 1;
x:= 3;
while p[i] <> #13 do
begin
gotoxy(y,x); {posiciona cursor}
p[i]:= readkey;
case p[i] of
#08: {BACKSPACE}
begin
delete(palavra,length(palavra),1); {apaga o ultimo caracter da variavel}
gotoxy(1,3); {volta para a primeira posicao da linha}
clreol; {apaga a palavra}
write(palavra); {escreve a nova palavra,sem o ultimo caracter}
dec(i,1); {volta uma posicao na variavel}
dec(y,1); {volta o cursos uma posicao para a esquerda na tela}
writeln;
clreol;
writeln('coluna: ', y); {qualquer comando executado a cada nova ocorrencia}
writeln('caracter anterior: ', p[i-1]);
end;
#13:
begin
writeln;
writeln('ENTER');
end;
else
begin
palavra:= palavra + p[i]; {adiciona caracter digitado na variavel}
gotoxy(1,3); {volta para a primeira posicao da linha}
clreol; {apaga a palavra}
write(palavra); {escreve nova palavra, com o novo caracter}
inc(i,1); {adiciona nova posicao na variavel}
inc(y,1); {move cursor uma posicao para a direita na tela}
writeln;
clreol;
writeln('coluna: ', y); {qualquer comando executado a cada nova ocorrencia}
writeln('caracter anterior: ', p[i-1]);
end;
end;
end;
end.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Simon, acho que consegui.

Abaixo vai o código, sem nenhum tipo de consistência, ok?

Se quiser comentar, eu agradeceria.

Valeu a ajuda.


uses Crt;
var
i, x, y: integer;
p, palavra: string;
begin
clrscr;
writeln('Digite alguma coisa, depois use o <BACKSPACE>.');
writeln('Digite <ENTER> para terminar.');
i:= 1;
y:= 1;
x:= 3;
while p[i] <> #13 do
begin
gotoxy(y,x); {posiciona cursor}
p[i]:= readkey;
case p[i] of
#08: {BACKSPACE}
begin
delete(palavra,length(palavra),1); {apaga o ultimo caracter da variavel}
gotoxy(1,3); {volta para a primeira posicao da linha}
clreol; {apaga a palavra}
write(palavra); {escreve a nova palavra,sem o ultimo caracter}
dec(i,1); {volta uma posicao na variavel}
dec(y,1); {volta o cursos uma posicao para a esquerda na tela}
writeln;
clreol;
writeln('coluna: ', y); {qualquer comando executado a cada nova ocorrencia}
writeln('caracter anterior: ', p[i-1]);
end;
#13:
begin
writeln;
writeln('ENTER');
end;
else
begin
palavra:= palavra + p[i]; {adiciona caracter digitado na variavel}
gotoxy(1,3); {volta para a primeira posicao da linha}
clreol; {apaga a palavra}
write(palavra); {escreve nova palavra, com o novo caracter}
inc(i,1); {adiciona nova posicao na variavel}
inc(y,1); {move cursor uma posicao para a direita na tela}
writeln;
clreol;
writeln('coluna: ', y); {qualquer comando executado a cada nova ocorrencia}
writeln('caracter anterior: ', p[i-1]);
end;
end;
end;
end.
Program backspace;

Olá, fiz uma analise e encontrei os seguintes pontos:

1) APAGANDO MAIS DO QUE DEVIA

Experimente pressionar BACKSPACE quando não tiver nenhum caractere escrito (ou todos apagados).

2) NOMENCLATURA DE VARIÁVEL

Acho que um nome melhor para variável palavra seria frase... (já que podem tem mais de uma palavra)

3) POSICIONAMENTO

Já que a linha é baseada por uma variável, logo poderia usá-la.

De:

      gotoxy(1,3);		{volta para a primeira posicao da linha}

Para:

      gotoxy(1,x);		{volta para a primeira posicao da linha}

4) TRATAMENTE DE CARACTERES ESPECIAIS

Assim como é preciso tratar a questão de "não apagar além do devido", precisa também tratar os "caracteres especiais", como F1, F2,..F12, INSERT, END... ETC. Ao pressioná-los, o programa está os processando de uma forma que creio que não está certa...

5) TRATAMENTO DO ENTER

Aqui não funcionou muito bem... (o texto simplesmente não aparece, pois o programa fecha. Testando colocando um ReadKey antes de fechar, vi que o texto fica sobreposto na linha de baixo.)

***

Caso deseje, tente ajustar essas questões, e poste aqui o código. Qualquer coisa fazemos uma nova análise.. ^_^

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×