Ir ao conteúdo
  • Cadastre-se

Ler teclado sem mostrar no display...


jorginhozinho

Posts recomendados

  • Membro VIP
Olá..

Estou fazendo um software em pascal, e gostaria de saber qual o comando para ler o teclado (algo como o read ou readln), porém sem mostrar na tela o que estou digitando, ou mostrando apenas ***. OBRIGADO.

Olá,

Você pode usar o Readkey (da biblioteca CRT ou WinCRT - carregada pelo uses).

ex.:


uses CRT;
var
tecla :char;

begin
.
.
tecla:=readkey;
if tecla = #13 then
writeln('voce precionou ENTER');
.
end.

A base é está... para ler uma palavra (ou frase) e botar para aparecer "*" eu deixo por sua conta!!! ^_^

Abraços

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
obrigado galera..

mas e pra string..

na verdade eu preciso pra string mesmo..

mas isso ja ajuda

^^

valeu.

Olá,

Justamente, o password pode ser implementado como string, mas a leitura de "cada letra" tem que ser feita separadamente (e não de vez, como seria no ReadLn).

Em outras palavras:

Para cada letra que você ler, você imprime um "*" e concatena a letra no password até que se digite ENTER.

OBS.: O ReadKey tem a função de ler a tecla digitada (quase todas, menos Ctrl e Shift por exemplo), mas ela não imprime nada na tela. Se fosse por exemplo usado para ler uma frase, teria que também imprimir a letra digitada.

Abraços

Link para o comentário
Compartilhar em outros sites

Em vez de você criar uma variável do tipo String, poderia criar uma variável do tipo Array....

Exemplo:

Program ExLerSenha ;

Uses
Crt;

Const
max=8;

Type
T_Senha=Array [1..max] of Char;

Var
V_Senha:T_Senha;
contador: Integer;
Senha: String;


Begin
Senha:='';
For contador:= 1 to max do
Begin
V_Senha[contador]:=readkey;
Write('*');
Senha:=Senha + V_Senha[contador];
End;


End.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Em vez de você criar uma variável do tipo String, poderia criar uma variável do tipo Array....

Exemplo:



Uses
Crt;

Const
max=8;

Type
T_Senha=Array [1..max] of Char;

Var
V_Senha:T_Senha;
contador: Integer;
Senha: String;


Begin
Senha:='';
For contador:= 1 to max do
Begin
V_Senha[contador]:=readkey;
Write('*');
Senha:=Senha + V_Senha[contador];
End;


End.
Program ExLerSenha ;

Só comentando esse código...

Neste caso você está utilizando duas variáveis para armazenar a mesma coisa!!!

Só precisa de uma string... ou no máximo outro char (e não um array).

Exemplos:


var
letra :char;
.
For contador:= 1 to max do
Begin
letra:=readkey;
Write('*');
Senha:=Senha + letra;
End;
.

ou diretamente

.
For contador:= 1 to max do
Begin
senha[contatodor]:=readkey;
Write('*');
End;
.

Mas perceba que neste caso você é obrigado a usar a quantidade máxima de caracteres (nem a mais nem a menos)...

Eu não queria fornecer, mas a essa altura do campeonato!!!

Exemplo:

PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
{BACKSPACE = #??;}
VAR
tecla :char;
senha :string;
BEGIN
clrscr;
senha:='';
repeat
tecla:=readkey;
write('*');
if tecla<>ENTER then
{if tecla=BACKSPACE then
//se ele digitou backspace
else}
senha:=senha+tecla;
until tecla=ENTER;
writeln;
writeln('Sua senha foi ',senha);
readkey;
END.

Só fazer uns pequenos ajustes.. e já foi!!!

Qualquer coisa é só postar!

Abraços

Link para o comentário
Compartilhar em outros sites

EstilingueAtomico,

muito bom!

:)

Antes eu havia mandado o código apenas com o Array de Char, depois resolvi alterar um pouco...

Colocar dentro de uma string...

Nem pensei nisso (que "Neste caso você está utilizando duas variáveis para armazenar a mesma coisa!!!")...

Legal este código pensando no caso de o usuário ter uma senha com o número de caracteres menor que o máximo...

Vivendo e aprendendo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

EstilingueAtomico,

muito bom!

:)

Antes eu havia mandado o código apenas com o Array de Char, depois resolvi alterar um pouco...

Colocar dentro de uma string...

Nem pensei nisso (que "Neste caso você está utilizando duas variáveis para armazenar a mesma coisa!!!")...

Legal este código pensando no caso de o usuário ter uma senha com o número de caracteres menor que o máximo...

Vivendo e aprendendo

Só falta um detalhe...

Do jeito que tá, vai ficar algo muito parecido com a senha do Linux de um tempo atrás (pelo menos era assim), onde não é tratado o backspace!!! ou seja, não é possível "apagar" um caractere!!! O usuário tem q digitar a senha corretamente de uma vez!!!

Para tratar é só "terminar" o código!!

    if tecla<>ENTER then
[B] {if tecla=BACKSPACE then
//se ele digitou backspace[/B]
else}
senha:=senha+tecla;

Daí você tem q descobrir qual é o código do BACKSPACE, e no if "fazer o que tem q fazer!!"...

C entendeu? Tente fazer isso... :)

Abraços

Link para o comentário
Compartilhar em outros sites

Só falta um detalhe...

Do jeito que tá, vai ficar algo muito parecido com a senha do Linux de um tempo atrás (pelo menos era assim), onde não é tratado o backspace!!! ou seja, não é possível "apagar" um caractere!!! O usuário tem q digitar a senha corretamente de uma vez!!!

Para tratar é só "terminar" o código!!

    if tecla<>ENTER then
[B] {if tecla=BACKSPACE then
//se ele digitou backspace[/B]
else}
senha:=senha+tecla;

Daí você tem q descobrir qual é o código do BACKSPACE, e no if "fazer o que tem q fazer!!"...

C entendeu? Tente fazer isso... :)

Abraços

Então, eu peguei o seu código para editar... No entanto, me parece que, nesse caso será preciso utilizar um Array, poi, com o código abaixo, o programa só apagará o caracter escrito na primeira vez que o BACKSPACE for acionado depois de digitado algum caracter. Na segunda vez seguida, não funcionará corretamente.


PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
x_i = 1;
y = 1;
VAR
tecla :char;
senha, senhaanterior :string;
x: Integer;//Posição do cursor
BEGIN
clrscr;
senha:='';
x:=x_i;
repeat
repeat
tecla:=' ';
tecla:=readkey;
if tecla<>ENTER then
if tecla=BACKSPACE then
Begin
x:=x-1;
gotoxy(x,y);
write(' ');
gotoxy(x,y);
senha:= senhaanterior;
End;
Until(tecla<>BACKSPACE);
write('*');
senhaanterior:= senha;
senha:=senha+tecla;
x:=x+1;
until tecla=ENTER;
writeln;
writeln('Sua senha foi ',senha);
readkey;
END.

Vou tentar fazer com Array, depois eu posto...

:cool:

Ah!

Aqui vai um código de um programinha que retorna a tecla pressionada e o seu número da tabela ASC II:


Program Codigo_AscII ;
Uses
Crt;

Var
a: Char;

Begin
repeat
a:=readkey;
clrscr;
writeln(a);
writeln(Ord(a));
until(a='q');
End.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Então, eu peguei o seu código para editar... No entanto, me parece que, nesse caso será preciso utilizar um Array, poi, com o código abaixo, o programa só apagará o caracter escrito na primeira vez que o BACKSPACE for acionado depois de digitado algum caracter. Na segunda vez seguida, não funcionará corretamente.


PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
x_i = 1;
y = 1;
VAR
tecla :char;
senha, senhaanterior :string;
x: Integer;//Posição do cursor
BEGIN
clrscr;
senha:='';
x:=x_i;
repeat
repeat
tecla:=' ';
tecla:=readkey;
if tecla<>ENTER then
if tecla=BACKSPACE then
Begin
x:=x-1;
gotoxy(x,y);
write(' ');
gotoxy(x,y);
senha:= senhaanterior;
End;
Until(tecla<>BACKSPACE);
write('*');
senhaanterior:= senha;
senha:=senha+tecla;
x:=x+1;
until tecla=ENTER;
writeln;
writeln('Sua senha foi ',senha);
readkey;
END.

Vou tentar fazer com Array, depois eu posto...

:cool:

Ah!

Aqui vai um código de um programinha que retorna a tecla pressionada e o seu número da tabela ASC II:


Program Codigo_AscII ;
Uses
Crt;

Var
a: Char;

Begin
repeat
a:=readkey;
clrscr;
writeln(a);
writeln(Ord(a));
until(a='q');
End.

Olá

Muito bom o seu código...

Eu peguei ele e fiz algumas adaptações, utilizando uns novos comandos, como:

WhereX e WhereY = Posições atual X e Y do cursor.

Delete = Deleta caracteres de uma string;

Mudei também a parte onde exibir o "*" e "concatena" a senha de lugar, já que o programa estava exibindo um "*" mesmo quando digitava ENTER (n é para aparecer).

PROGRAM ex_Senha;
USES CRT; [COLOR="Red"]{biblioteca com comandos extras como readkey, clrscr, whereX. etc}[/COLOR]
CONST
[COLOR="Red"]{codigos AscII}[/COLOR]
ENTER = #13;
BACKSPACE = #08;

VAR
tecla :char; [COLOR="Red"]{tecla digitada pelo usuario}[/COLOR]
senha :string; [COLOR="Red"]{composicao da senha}[/COLOR]

BEGIN
clrscr; [COLOR="Red"]{limpa a tela}[/COLOR]
senha:=''; [COLOR="Red"]{no programa principal as strings sao zeradas automaticamente.
mas num procedimento precisaria, já que neste ultimo caso
n sao zeradas!!!}[/COLOR]
repeat
repeat
[COLOR="Red"] (*
tecla:=' ';
//n precisa, já q vai ser lido logo abaixo
*)[/COLOR]
tecla:=readkey; [COLOR="Red"]{ler a tecla digitada pelo usuario}[/COLOR]
[COLOR="Red"]{se nao digitou ENTER (finalizou)}[/COLOR]
if tecla<>ENTER then
[COLOR="Red"]{se digitou BACKSPACE e existe mais de uma letra digitada}[/COLOR]
if (tecla=BACKSPACE) and ( Length(senha) > 0 ) then
Begin
[COLOR="Red"]{posiciona uma coluna atras}[/COLOR]
gotoxy(WhereX-1,WhereY); [COLOR="Red"]{Where = `posicao atual`}[/COLOR]
[COLOR="Red"]{apaga essa coluna (caractere)}[/COLOR]
write(' ');
[COLOR="Red"]{reposiciona o cursor}[/COLOR]
gotoxy(WhereX-1,WhereY); [COLOR="Red"]{Where = `posicao atual`}[/COLOR]
[COLOR="Red"]{apaga a ultima letra digitada}[/COLOR]
delete(senha,length(senha),1);
End
else [COLOR="Red"]{só escreve um asterisco e completa a senha se n digitou ENTER}[/COLOR]
begin
write('*'); [COLOR="Red"]{imprime um asterisco para mostra q algo foi digitado}[/COLOR]
senha:=senha+tecla; [COLOR="Red"]{concatena o caractere novo na senha}[/COLOR]
end;
until (tecla<>BACKSPACE); [COLOR="Red"]{cont. quando digitar algo diferente de BACKSPACE}[/COLOR]
until tecla=ENTER; [COLOR="Red"]{sai quando digitar enter}[/COLOR]
writeln;
writeln('Sua senha foi ',senha); [COLOR="Red"]{imprime a senha digitada}[/COLOR]
readkey; [COLOR="Red"]{da um pause antes de fechar!}[/COLOR]
END.

Com esses ajustes já melhora algumas coisas...

Acredito que falta agora, também, a filtrar os caracteres aceitos... já que o programa, por exemplo, aceita "ESC" como tecla para senha. Daí temos que analisar se essas teclas, como F1 a F12 devem ser aceitos!!! :lol:

CONCLUINDO

1) Fico no aguardo da tua versão com array.

2) Em relação a questão de quais teclas são validas, tente fazer um programa que só aceite "Números" e "Letras" (só alfanuméricos, sem caracteres especial) [a..z, A..Z, 0..9]

PS: Muito criativo também esse código para descobrir o código da tecla!!! Show!

Abraços

Link para o comentário
Compartilhar em outros sites

Olá

Muito bom o seu código...

Eu peguei ele e fiz algumas adaptações, utilizando uns novos comandos, como:

WhereX e WhereY = Posições atual X e Y do cursor.

Delete = Deleta caracteres de uma string;

Mudei também a parte onde exibir o "*" e "concatena" a senha de lugar, já que o programa estava exibindo um "*" mesmo quando digitava ENTER (n é para aparecer).

PROGRAM ex_Senha;
USES CRT; [COLOR="Red"]{biblioteca com comandos extras como readkey, clrscr, whereX. etc}[/COLOR]
CONST
[COLOR="Red"]{codigos AscII}[/COLOR]
ENTER = #13;
BACKSPACE = #08;

VAR
tecla :char; [COLOR="Red"]{tecla digitada pelo usuario}[/COLOR]
senha :string; [COLOR="Red"]{composicao da senha}[/COLOR]

BEGIN
clrscr; [COLOR="Red"]{limpa a tela}[/COLOR]
senha:=''; [COLOR="Red"]{no programa principal as strings sao zeradas automaticamente.
mas num procedimento precisaria, já que neste ultimo caso
n sao zeradas!!!}[/COLOR]
repeat
repeat
[COLOR="Red"] (*
tecla:=' ';
//n precisa, já q vai ser lido logo abaixo
*)[/COLOR]
tecla:=readkey; [COLOR="Red"]{ler a tecla digitada pelo usuario}[/COLOR]
[COLOR="Red"]{se nao digitou ENTER (finalizou)}[/COLOR]
if tecla<>ENTER then
[COLOR="Red"]{se digitou BACKSPACE e existe mais de uma letra digitada}[/COLOR]
if (tecla=BACKSPACE) and ( Length(senha) > 0 ) then
Begin
[COLOR="Red"]{posiciona uma coluna atras}[/COLOR]
gotoxy(WhereX-1,WhereY); [COLOR="Red"]{Where = `posicao atual`}[/COLOR]
[COLOR="Red"]{apaga essa coluna (caractere)}[/COLOR]
write(' ');
[COLOR="Red"]{reposiciona o cursor}[/COLOR]
gotoxy(WhereX-1,WhereY); [COLOR="Red"]{Where = `posicao atual`}[/COLOR]
[COLOR="Red"]{apaga a ultima letra digitada}[/COLOR]
delete(senha,length(senha),1);
End
else [COLOR="Red"]{só escreve um asterisco e completa a senha se n digitou ENTER}[/COLOR]
begin
write('*'); [COLOR="Red"]{imprime um asterisco para mostra q algo foi digitado}[/COLOR]
senha:=senha+tecla; [COLOR="Red"]{concatena o caractere novo na senha}[/COLOR]
end;
until (tecla<>BACKSPACE); [COLOR="Red"]{cont. quando digitar algo diferente de BACKSPACE}[/COLOR]
until tecla=ENTER; [COLOR="Red"]{sai quando digitar enter}[/COLOR]
writeln;
writeln('Sua senha foi ',senha); [COLOR="Red"]{imprime a senha digitada}[/COLOR]
readkey; [COLOR="Red"]{da um pause antes de fechar!}[/COLOR]
END.

Com esses ajustes já melhora algumas coisas...

Acredito que falta agora, também, a filtrar os caracteres aceitos... já que o programa, por exemplo, aceita "ESC" como tecla para senha. Daí temos que analisar se essas teclas, como F1 a F12 devem ser aceitos!!! :lol:

CONCLUINDO

1) Fico no aguardo da tua versão com array.

2) Em relação a questão de quais teclas são validas, tente fazer um programa que só aceite "Números" e "Letras" (só alfanuméricos, sem caracteres especial) [a..z, A..Z, 0..9]

PS: Muito criativo também esse código para descobrir o código da tecla!!! Show!

Abraços

Pronto

Aí vai:


PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
max = 8;//Número máximo de caracteres na senha
TYPE
T_Senha = Array [1..max] of Char;
VAR
senha: String;
v_senha: T_Senha;
aux, aux2: Char;
i: Integer;
cont: Integer;

//============================================================================
[COLOR="red"]//Verifica se a tecla digitada é válida[/COLOR]
FUNCTION CaracterValido(caracter: T_Senha; cont: Integer): Boolean;
Const
ini_numero = #48; [COLOR="red"]//Algarismo "Zero"[/COLOR]
fim_numero = #57; [COLOR="red"]//Algarismo "9"[/COLOR]
ini_minuscula = #97; [COLOR="red"]//Letra "a"[/COLOR]
fim_minuscula = #122; [COLOR="red"]//Letra "z"[/COLOR]
ini_maiuscula = #65; [COLOR="red"]//Letra "A"[/COLOR]
fim_maiuscula = #90; [COLOR="red"]//Letra "Z"[/COLOR]
Begin
CaracterValido:= false;
If(caracter[cont]>=ini_numero) and (caracter[cont]<=fim_numero) then
CaracterValido:= true
else
If(caracter[cont]>=ini_minuscula) and (caracter[cont]<=fim_minuscula) then
CaracterValido:= true
else
If (caracter[cont]>=ini_maiuscula) and (caracter[cont]<=fim_maiuscula) then
CaracterValido:= true;
End;

//============================================================================
//===============================[COLOR="red"]PRINCPAL[/COLOR]=====================================
//============================================================================
BEGIN
senha:= '';
i:= 1;

Repeat
Repeat
aux:=readkey;
If(aux = #0)then
aux2:= readkey
else
v_senha[i]:= aux;
Until(aux<>#0);

while(v_senha[i] = BACKSPACE) do
if(i>=1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:= i -1;
v_senha[i]:= readkey;
End;
If(CaracterValido(v_senha, i)) then
Begin
write('*');
i:=i +1;
End;

Until(v_senha[i] = ENTER) or (i>max);

if(i>max) then i:=max; [COLOR="red"]//No caso de o usuário alcançar o número máximo de caracteres
//Se não utilizar isso, i pode valer 9.[/COLOR]
For cont:= 1 to i do
senha:=senha +v_senha[cont];
writeln;
Write('Senha: ', senha);
readkey;
END.

Obrigado pelo WhereX, WhereY. Não conhecia essas funções.

Uma pergunta: Qual a sintaxe do Delete e poderia me explicar acerca da função Length?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Pronto

Aí vai:


PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
max = 8;//Número máximo de caracteres na senha
TYPE
T_Senha = Array [1..max] of Char;
VAR
senha: String;
v_senha: T_Senha;
aux, aux2: Char;
i: Integer;
cont: Integer;

//============================================================================
[COLOR="red"]//Verifica se a tecla digitada é válida[/COLOR]
FUNCTION CaracterValido(caracter: T_Senha; cont: Integer): Boolean;
Const
ini_numero = #48; [COLOR="red"]//Algarismo "Zero"[/COLOR]
fim_numero = #57; [COLOR="red"]//Algarismo "9"[/COLOR]
ini_minuscula = #97; [COLOR="red"]//Letra "a"[/COLOR]
fim_minuscula = #122; [COLOR="red"]//Letra "z"[/COLOR]
ini_maiuscula = #65; [COLOR="red"]//Letra "A"[/COLOR]
fim_maiuscula = #90; [COLOR="red"]//Letra "Z"[/COLOR]
Begin
CaracterValido:= false;
If(caracter[cont]>=ini_numero) and (caracter[cont]<=fim_numero) then
CaracterValido:= true
else
If(caracter[cont]>=ini_minuscula) and (caracter[cont]<=fim_minuscula) then
CaracterValido:= true
else
If (caracter[cont]>=ini_maiuscula) and (caracter[cont]<=fim_maiuscula) then
CaracterValido:= true;
End;

//============================================================================
//===============================[COLOR="red"]PRINCPAL[/COLOR]=====================================
//============================================================================
BEGIN
senha:= '';
i:= 1;

Repeat
Repeat
aux:=readkey;
If(aux = #0)then
aux2:= readkey
else
v_senha[i]:= aux;
Until(aux<>#0);

while(v_senha[i] = BACKSPACE) do
if(i>=1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:= i -1;
v_senha[i]:= readkey;
End;
If(CaracterValido(v_senha, i)) then
Begin
write('*');
i:=i +1;
End;

Until(v_senha[i] = ENTER) or (i>max);

if(i>max) then i:=max; [COLOR="red"]//No caso de o usuário alcançar o número máximo de caracteres
//Se não utilizar isso, i pode valer 9.[/COLOR]
For cont:= 1 to i do
senha:=senha +v_senha[cont];
writeln;
Write('Senha: ', senha);
readkey;
END.

Obrigado pelo WhereX, WhereY. Não conhecia essas funções.

Uma pergunta: Qual a sintaxe do Delete e poderia me explicar acerca da função Length?

Olá,

Fiz algumas alterações no seu código... (os comentários estão inclusos).

PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
max = 8; [COLOR="Red"]{Numero maximo de caracteres na senha}[/COLOR]
TYPE
T_Senha = Array [1..max] of Char;
VAR
senha : String;
v_senha : T_Senha;
[COLOR="Red"] (*
aux,
aux2 : Char;
[B]//nao vai precisar![/B]
*)[/COLOR]
i : [COLOR="Red"]{Integer}[/COLOR] byte;
cont : [COLOR="Red"]{Integer}[/COLOR] byte;

{//============================================================================
//Verifica se a tecla digitada é válida}
[COLOR="Red"](*
FUNCTION CaracterValido(caracter: T_Senha; cont: Integer): Boolean;
[B]//para que passar a senha toda!!!???[/B]
*)[/COLOR]
FUNCTION CaracterValido(caracter :char): Boolean;
Const
ini_numero = #48; [COLOR="Red"]{//Algarismo "Zero"}[/COLOR]
fim_numero = #57; [COLOR="Red"]{//Algarismo "9"}[/COLOR]
ini_minuscula = #97; [COLOR="Red"]{//Letra "a"}[/COLOR]
fim_minuscula = #122; [COLOR="Red"]{//Letra "z"}[/COLOR]
ini_maiuscula = #65; [COLOR="Red"]{//Letra "A"}[/COLOR]
fim_maiuscula = #90; [COLOR="Red"]{//Letra "Z"}[/COLOR]
Begin
CaracterValido:= false;
If (caracter>=ini_numero) and (caracter<=fim_numero) then
CaracterValido:= true
else If (caracter>=ini_minuscula) and (caracter<=fim_minuscula) then
CaracterValido:= true
else If (caracter=ini_maiuscula) and (caracter<=fim_maiuscula) then
CaracterValido:= true;
End;

{//============================================================================
//===============================PRINCPAL=====================================
//============================================================================}
BEGIN
clrscr; [COLOR="Red"]{limpa tela}[/COLOR]
senha:=''; [COLOR="Red"]{nao precisa zerar, mas é sempre bom!}[/COLOR]
[COLOR="Red"] (*
i := 1;
[B] //o contador deve comecar em '0'...
(isso tb sera necessario já que sugeri atualizar o contador perto da leitura e
nao na hora de exibir o '*'[/B]
*)[/COLOR]
i:=0; [COLOR="Red"]{nao precisa zerar, mas é sempre bom! (é automatico)}[/COLOR]
Repeat
[COLOR="Red"] (*
Repeat
aux:=readkey;
If (aux = #0)then
aux2:= readkey
else
v_senha[i]:= aux;
Until (aux<>#0);
[B]//para que serve essa logica?[/B]
*)[/COLOR]

[COLOR="Red"] (*
Repeat
v_senha[i]:=readkey;
Until (v_senha[i]<>#0);
//que tal usar assim?
*)[/COLOR]

i := i+1; {atualiza a contidade já lida}
v_senha[i]:=readkey; {ler proxima tecla}
[COLOR="Red"] (*
while(v_senha[i] = BACKSPACE) do {caso queira apagar caracteres}
if(i>=1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:=i-1;
v_senha[i]:=readkey;
End
[B] //OPS.. aqui se tentar apagar quando tiver limpo entrara num loop infinito!!
Veja a diferenca abaixo!!! (mudou algumas coisas, como o 'if'[/B]
*)[/COLOR]
while(v_senha[i] = BACKSPACE) do [COLOR="Red"]{caso queira apagar caracteres}[/COLOR]
begin
if(i>1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:=i-1;
End;
v_senha[i]:=readkey; [COLOR="Red"]{reler a tecla}[/COLOR]
end;

If(CaracterValido(v_senha[i])) then
Begin
write('*');
[COLOR="Red"] (*
i := i+1;
[B]//melhor atualizar o contador perto da leitura!!! (lá em cima)[/B]
*)[/COLOR]
End;
[COLOR="Red"] (*
Until(v_senha[i] = ENTER) or (i>max);
[B]//o 'i' tem que ser >= max!!![/B]
*)[/COLOR]
Until(v_senha[i] = ENTER) or (i>=max);

[COLOR="Red"] (*
if(i>max) then
i:=max; {//No caso de o usuário alcançar o número máximo de caracteres}
{//Se não utilizar isso, i pode valer 9.}
[COLOR="Red"]//nao vai precisar mais corrigir, já q o repeat foi corrigido!!!!!![/COLOR]
*)[/COLOR]
[COLOR="Red"]{EXIBE A SENHA}[/COLOR]
For cont:= 1 to i do
senha:=senha +v_senha[cont];
writeln;
Write('Senha: ', senha);
readkey;
END.

Com essa alterações fica quase tudo certinho...

Obrigado pelo WhereX, WhereY. Não conhecia essas funções.

Boa parte das funções que conheço, eu vi, como nesse contexto, em outros códigos e fui analisando e assimilando... mas boa parte também foi feita através de pesquisas mesmo. Eu aqui em casa (tô vianjando, mas vale! rs) eu uso o Turbo Pascal 7.1 (download aqui), e nele utilizo bastante o help interno. (algumas versões do Turbo Pascal não vem com esse help, mas essa versão que disponibilizei já está inclusa!!! - TURBO.tph. Para acessar vá no menu help!).

Basicamente funciona assim... basta você colocar o curso na palavra desejada e apertar "Ctrl+F1", daí o TP vai tentar localizar essa palavra no help!!!

Por ex.: Eu quero saber mais sobre o interger, daí eu digito (ou acho) "integer" e aperto "Ctrl+F1"... experimente!!!!

Para você conhecer uns comando legais, vá lá no help (não sei achar com "ctrl+f1) e procuro por "CRT-Unit", e futuque um pouquinho.. você não vai se arrepender!!!

PS: Nessa versão que disponibilizei também tem uma versão do Help em português (Help Pascal BR), mas eu recomendo o do TP mesmo, já que é mais completa!!!

Uma pergunta: Qual a sintaxe do Delete e poderia me explicar acerca da função Length?

Vide comentários acima!!! ^_^

PS: Qual é o seu editor de código? (Só por curiosidade. Eu uso o Turbo Pascal 7.1)

PS²: Acredito que esse código (do "ler senha") pode ser ainda melhorado. Se você quiser todos nós podemos analisar alguns detalhes e inclusive criar uma UNIT para facilitar a reutilização, assim, por exemplo, toda vez que precisar ler uma senha bastará carregar a unit e utilizar!!!

E vamo que vamo!!! :lol:

Fico no aguardo.

Abraços

Link para o comentário
Compartilhar em outros sites

E ai, beleza

Uma ideia legal, seria usar o comando case...


PROGRAM ex_Senha;

USES CRT;

CONST ENTER = #13;

BACKSPACE = #8;

ESC = #27;

max = 50; {Numero maximo de caracteres na senha}

TYPE T_Senha = Array [1..max] of Char;

VAR v_senha : T_Senha;

caractere : char;

i, cont : integer;

BEGIN

clrscr; {limpa tela}

writeln('Digite uma senha:');

i:= 0;

Repeat

caractere:= readkey;

case UpCase(caractere) of {UpCase retorna o caractere em maiusculo}

'A' .. 'Z','0' .. '9' : begin

i:= i + 1;

v_senha[i]:= caractere;

write('*');

end;

BACKSPACE : begin

gotoxy(wherex -1, wherey);

write(' ');

gotoxy(wherex -1, wherey);

if i - 1 >= 0 then

begin

i:= i - 1;

end;

end;

end;{fim case}

Until(caractere = ENTER) or (i > max);

{EXIBE A SENHA}

writeln;

write('Senha: ');

if i = 0 then

begin

textcolor(2);{cor verde}

write('Nenhuma senha digitada');

textcolor(7);{cor branca}

end

else

begin

For cont:= 1 to i do

begin

write(v_senha[cont]);

end;

end;

writeln;

Write('Aperte uma tecla para terminar...');

readkey;

END.

t++

Link para o comentário
Compartilhar em outros sites

Olá,

Fiz algumas alterações no seu código... (os comentários estão inclusos).

Então, eu estava usando o Pascal ZIM, no entanto ele é limitado. (Ex: Não dá para usar bibliotecas{Não existe o comando "Uses"). Nesse último código que postei, useui o Dev-Pascal, que é um software livre. Vou Baixar o Turbo Pascal... Vamos ver.

Ainda não tenho experiência para criar UNIT, mas vamo lá...

Link para o comentário
Compartilhar em outros sites

aí galera eu tenho acompanhado esse topico, e agora vou postar meu código.

Esse código eu desenvolvi com a necessidade de utilizar num controle de jogadores utilizando arquivos para salvar o login e senha num jogo que eu fiz. O jogo eu não terminei mas se quiserem eu posto o jogo até a parte em que eu parei.

O código é bem simples e completo sem erros, permite até apagar digito por digito, delimita a quantidade de caracteres que podem ser digitados e ainda mostra uma mesagem se a quantidade maxima de caractees não for satisfeita.

Se tiverem duvidas é só perguntar.


Program p_senha;
uses
crt;

var
tc, : char;
senha : string[7];
p,i : integer;

Begin
ClrScr;
gotoxy(34,8); writeln('NOVO JOGADOR');
gotoxy(18,10); writeln('Login: Fulano');
gotoxy(18,12); writeln('Senha: ');
i:=1;
p:=25;
textcolor(white);
repeat
gotoxy(p,12);
senha[i]:=readkey;
if senha[i] = #13 then
begin
if i = 7 then
exit
else
begin
textcolor(red);
gotoxy(25,12); write('minimo 6 caracteres!');
textcolor(black);
delay(1000);
gotoxy(25,12); write(' ');
p:=24; i:=1;
end;
end;
if senha[i] = #8 then
begin
if p-1 >= 25 then
begin
gotoxy(p-1,12); writeln(' ');
dec(i);
dec(p);
end;
end
else
begin
if senha[i] <> #13 then
begin
if (p < 31) and (p <> 24) then
begin
gotoxy(p,12); writeln('*');
inc(i);
inc(p);
end
else
begin
if p < 31 then
inc(p);
end;
end;
end;
until false;
End.

Link para o comentário
Compartilhar em outros sites

Olá,

(*

Repeat

aux:=readkey;

If (aux = #0)then

aux2:= readkey

else

v_senha:= aux;

Until (aux<>#0);

//para que serve essa logica?

*)

Quando se digita caracteres especiais, na verdade acontecem duas leiuras: A primeira é do valor #0, a segunda o código do caracter especial.

Se não colocarmos esse trecho de código teclas como F9, F10, Insert, <seta para direita> etc funcionaram na senha, pois o programa pegará o valor da segunda leitura!

Assim sendo, com esse trecho de código, o Array só receberá o valor da tecla digitada se esta não for especial.

Por exemplo: Se você digitar seguidamente Insert, Delete, Home e End, o programa imprimirá a seguinte senha: " R S G O" (Com os espaços mesmo).

Como o máximo é de oito caracteres, ao apertar End, ele já imprimiu a senha. Então, o que se percebe é que foram feitas oito leituras, embora tenham sido apertadas apenas quatro teclas.

[:)]

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

aí galera eu tenho acompanhado esse topico, e agora vou postar meu código.

Esse código eu desenvolvi com a necessidade de utilizar num controle de jogadores utilizando arquivos para salvar o login e senha num jogo que eu fiz. O jogo eu não terminei mas se quiserem eu posto o jogo até a parte em que eu parei.

O código é bem simples e completo sem erros, permite até apagar digito por digito, delimita a quantidade de caracteres que podem ser digitados e ainda mostra uma mesagem se a quantidade maxima de caractees não for satisfeita.

Se tiverem duvidas é só perguntar.


Program p_senha;
uses
crt;

var
tc, : char;
senha : string[7];
p,i : integer;

Begin
ClrScr;
gotoxy(34,8); writeln('NOVO JOGADOR');
gotoxy(18,10); writeln('Login: Fulano');
gotoxy(18,12); writeln('Senha: ');
i:=1;
p:=25;
textcolor(white);
repeat
gotoxy(p,12);
senha[i]:=readkey;
if senha[i] = #13 then
begin
if i = 7 then
exit
else
begin
textcolor(red);
gotoxy(25,12); write('minimo 6 caracteres!');
textcolor(black);
delay(1000);
gotoxy(25,12); write(' ');
p:=24; i:=1;
end;
end;
if senha[i] = #8 then
begin
if p-1 >= 25 then
begin
gotoxy(p-1,12); writeln(' ');
dec(i);
dec(p);
end;
end
else
begin
if senha[i] <> #13 then
begin
if (p < 31) and (p <> 24) then
begin
gotoxy(p,12); writeln('*');
inc(i);
inc(p);
end
else
begin
if p < 31 then
inc(p);
end;
end;
end;
until false;
End.

Dicas

1) Use constantes para identificar os caracteres especial... ou pelo menos coloque comentário...

if senha[i] = #8

O que é #8??? Para descobrir que é BACKSPACE pode dá um certo trabalho.

É melhor algo assim:

if senha[i] = #8 {se igual BACKSPACE}

2) Use uma constate para atribuir o mínimo e o máximo de caracteres na senha...

const
mim = 6 {qnt minima de caracteres na senha}
max = 8 {qnt maxima de caracteres na senha}

Imagine que você queira mudar para esse valores??? Assim bastará mudar o valor da constante (claro que o código deve usar essas constantes!!! ^_^)

(obs.: você só está usando o máximo... e na verdade um valor fixo, ou seja, a senha terá que ter obrigatoriamente X caracteres!!!)

3) Observa-se que você usa o conceito de gotoXY para imprimir os "*". De certo modo é eficiente, mas não tão eficaz!!! Imagine que você queira mudar a posição de onde deve aparecer???

Eu acredito que seja mais adequado deixar o próprio Pascal gerenciar isto!!!

...

Abaixo seu código com algumas alterações

program p_senha;
uses
crt;

const
[COLOR="Red"] (*
min = 4; {qnt minima de caracteres na senha}
//se quiser usar!!
*)[/COLOR]
max = 8; {qnt maxima de caracteres na senha}
var
[COLOR="Red"] (*
tc : char;
//para que serve???
*)[/COLOR]
senha : string[MAX]; {senha do usuario}
p, {posicionamento}
i : integer; {contador de caracteres}

Begin
ClrScr; {limpa a tela}
gotoxy(34,8); write('NOVO JOGADOR');
gotoxy(18,10); write('Login: Fulano');
gotoxy(18,12); write('Senha: ');
i:=1;
p:=25; {posicao inicial}
textcolor(white);
repeat
gotoxy(p,12);

[COLOR="Blue"] (*
//ESTRUTURA PARA EVITAR LER CARACTERES ESPECIAIS
*)[/COLOR]
Repeat
senha[i]:=readkey;
if senha[i]=#0 then {se teclou Insert, Del ou outras teclas especias
readkey; {nao precisa armazenar esse valor}
Until (senha[i]<>#0);


if senha[i] = #13 then {se apertou ENTER}
begin
if i = MAX+1 then {+1 porque comeca com 1!!!}
exit
else
begin
textcolor(red);
gotoxy(25,12); write('a senha deve ter ',MAX,' caracteres!');
[COLOR="Red"] (*
textcolor(black);
//OPS! nao deveria voltar para o blanco???
*)[/COLOR]
textcolor(white);
[COLOR="Red"] (*
delay(1000);
//o dalay varia de maquina pra maquina!!! n sei se é só com o TP
mas, aq por ex mau da pra v a mensagem! prefira 'readkey'
*)[/COLOR]
readkey;
gotoxy(25,12); write(' ');
i:=1;
p:=25;
end;
end;
if senha[i] = #8 then {se apertou BACKSPACE}
begin
if p-1 >= 25 then
begin
gotoxy(p-1,12); writeln(' ');
dec(i);
dec(p);
end;
end
else
begin
if senha[i] <> #13 then {se nao apertou ENTER}
begin
[COLOR="Red"] (*
if (p < 31) and (p <> 24) then {///algo relacionado a posicao}
//OPS! Quem controla a quantidade de caracteres é a posicao???
é mais fácil deixar o proprio 'i'
*)[/COLOR]
if i<=MAX then {se ainda pode digitar mais}
begin
gotoxy(p,12); writeln('*');
inc(i);
inc(p);
end
[COLOR="Red"] (*
else
begin
if p < 31 then
inc(p);
end;
//para que serve essa parte ??
*)[/COLOR]
end;
end;
until false;
writeln('SENHA : ',senha);
readkey;
End.

Abraços

Link para o comentário
Compartilhar em outros sites

1) Use constantes para identificar os caracteres especial... ou pelo menos coloque comentário...

Citação:

Código:

if senha = #8

O que é #8??? Para descobrir que é BACKSPACE pode dá um certo trabalho.

EstilingueAtomico, realmente valeu pelas modificações no meu código, geralmente eu coloco comentários em todos os meus códigos que eu posto aqui, esse eu peguei as pressas e fiquei meio com preguiça de comentar. Quanto as constantes é porque esse código eu tinha feito a muito tempo quando eu estava começando pascal e dai como eu estava com preguiça eu nem olhei direito e coloquei uma parte do código sem olhar, você viu que tinha alguns erros como o textcolor né rsrsr, mas era só pra galera ter uma ideia. :D

abraço vei.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

E ai, beleza

Uma ideia legal, seria usar o comando case...


PROGRAM ex_Senha;

USES CRT;

CONST ENTER = #13;

BACKSPACE = #8;

ESC = #27;

max = 50; {Numero maximo de caracteres na senha}

TYPE T_Senha = Array [1..max] of Char;

VAR v_senha : T_Senha;

caractere : char;

i, cont : integer;

BEGIN

clrscr; {limpa tela}

writeln('Digite uma senha:');

i:= 0;

Repeat

caractere:= readkey;

case UpCase(caractere) of {UpCase retorna o caractere em maiusculo}

'A' .. 'Z','0' .. '9' : begin

i:= i + 1;

v_senha[i]:= caractere;

write('*');

end;

BACKSPACE : begin

gotoxy(wherex -1, wherey);

write(' ');

gotoxy(wherex -1, wherey);

if i - 1 >= 0 then

begin

i:= i - 1;

end;

end;

end;{fim case}

Until(caractere = ENTER) or (i > max);

{EXIBE A SENHA}

writeln;

write('Senha: ');

if i = 0 then

begin

textcolor(2);{cor verde}

write('Nenhuma senha digitada');

textcolor(7);{cor branca}

end

else

begin

For cont:= 1 to i do

begin

write(v_senha[cont]);

end;

end;

writeln;

Write('Aperte uma tecla para terminar...');

readkey;

END.

t++

Olá,

Escrifonife19, concordo com o case a estrutura fica muita mais estruturada, e por conseqüência mais clara... :lol:

Tomei a liberdade de dá uma futucada e fiz alguns comentários no seu código!!!

Nada de mais, basicamente a questão do uso do "i" (como padrão para laços de repetição) e alguns detalhes na cor!!!

PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #08;
ESC = #27;
MAX = 50; {Numero maximo de caracteres na senha}

TYPE
T_Senha = Array [1..max] of Char;

VAR
v_senha : T_Senha; {a senha em si}
caractere : char; {caractere lido}
i, {usado no 'for' (antes contando a senha)}
cont : integer; {usado para contar a senha (antes no 'for')}
[COLOR="Red"] (*
Eu particulamente condidero o 'i' ('j','k') como auxiliares universais para
o 'for', ou seja, é recomendado que use ele para essa funcao.
Em outras palavras.. o 'i' nao deve ter outra utilidade, ou seja, o valor de-
le pode ser perdido. Ele só deve servir mesmo para que o for funcione!
*)[/COLOR]

BEGIN
clrscr; {limpa tela}
[COLOR="Red"]textcolor(15); {branco claro}[/COLOR]
writeln('Digite uma senha:');
cont:= 0; {zera o contador de caracteres já usados}
Repeat
caractere:=readkey;
case UpCase(caractere) of {UpCase retorna o caractere em maiusculo}
[COLOR="Red"] 'A' .. 'Z', {aqui só dei uma quebrada na 'linha'}
'0' .. '9' [/COLOR] : begin
[COLOR="Red"]inc(cont); {o mesmo que cont:= cont + 1;}[/COLOR]
v_senha[cont]:= caractere;
write('*');
end;
BACKSPACE : begin
gotoxy(wherex -1, wherey);
write(' ');
gotoxy(wherex -1, wherey);
{if i-1>=0 then}
if cont>=1 then
[COLOR="Red"]dec(cont); {o mesmo que cont:=cont-1;}[/COLOR]
end;
end;{fim case}
Until(caractere = ENTER) or (cont > max);

{EXIBE A SENHA}
writeln;
write('Senha: ');
if cont = 0 then
begin
[COLOR="Red"]textcolor(2+[COLOR="Blue"]blink[/COLOR]); {cor verde [COLOR="Blue"]piscando[/COLOR]}[/COLOR]
write('Nenhuma senha digitada');
textcolor(7);{cor branca}
end
else
begin
[COLOR="Red"]textcolor(14); {amarelo}[/COLOR]
For i:= 1 to cont do
write(v_senha[i]);
end;
textcolor(15); {branco}
writeln;
Write('Aperte uma tecla para terminar...');
readkey;
END.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Quando se digita caracteres especiais, na verdade acontecem duas leiuras: A primeira é do valor #0, a segunda o código do caracter especial.

Se não colocarmos esse trecho de código teclas como F9, F10, Insert, <seta para direita> etc funcionaram na senha, pois o programa pegará o valor da segunda leitura!

Assim sendo, com esse trecho de código, o Array só receberá o valor da tecla digitada se esta não for especial.

Por exemplo: Se você digitar seguidamente Insert, Delete, Home e End, o programa imprimirá a seguinte senha: " R S G O" (Com os espaços mesmo).

Como o máximo é de oito caracteres, ao apertar End, ele já imprimiu a senha. Então, o que se percebe é que foram feitas oito leituras, embora tenham sido apertadas apenas quatro teclas.

[:)]

Olá,

gu_ludo, eu entendi sua explicação... fiz os testes e você está CERTÍSSIMO !!!:rolleyes:

Abaixo um código teste (adaptado do seu, que mostra o que você comentou)

Obs: O único detalhe é que aqui em casa não imprimiu assim

" R S G O" (Com os espaços mesmo)
, mas sim RSGO. Em fim, sem os espços!

PROGRAM ex_Senha;
USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
max = 8;
TYPE
T_Senha = Array [1..max] of Char;
VAR
senha: String;
v_senha: T_Senha;
aux, aux2: Char;
i: Integer;
cont: Integer;

FUNCTION CaracterValido(caracter: T_Senha; cont: Integer): Boolean;
Const
ini_numero = #48;
fim_numero = #57;
ini_minuscula = #97;
fim_minuscula = #122;
ini_maiuscula = #65;
fim_maiuscula = #90;
Begin
CaracterValido:= false;
If(caracter[cont]>=ini_numero) and (caracter[cont]<=fim_numero) then
CaracterValido:= true
else
If(caracter[cont]>=ini_minuscula) and (caracter[cont]<=fim_minuscula) then
CaracterValido:= true
else
If (caracter[cont]>=ini_maiuscula) and (caracter[cont]<=fim_maiuscula) then
CaracterValido:= true;
End;

BEGIN
clrscr;
textcolor(15);

senha:= '';
i:= 1;

Repeat
[COLOR="Red"] (*
Repeat
aux:=readkey;
If(aux = #0)then
aux2:= readkey
else
v_senha[i]:= aux;
Until(aux<>#0);
//REMOVIDO PARA TESTES!!!
*)[/COLOR]
aux:=readkey;
v_senha[i]:= aux;


while(v_senha[i] = BACKSPACE) do
if(i>=1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:= i -1;
v_senha[i]:= readkey;
End;
If(CaracterValido(v_senha, i)) then
Begin
[COLOR="Red"] (*
write('*');
//EDITADO PARA TESTES
*)[/COLOR]
write(v_senha[i]);
i:=i +1;
End;

Until(v_senha[i] = ENTER) or (i>max);

if(i>max) then i:=max;

For cont:= 1 to i do
senha:=senha +v_senha[cont];
writeln;
Write('Senha: ', senha);
readkey;
END.

Valeu pela dica...

PS: COMO VOCÊ CHEGOU A ESSA SOLUÇÃO, ou seja, qual foi a lógica/método usado para chegar a essa solução.

PS²: Fica mais uma dica

       Repeat
v_senha[i]:=readkey;
if v_senha[i]=#0 then {se teclou Insert, Del ou outras teclas especias
readkey; [COLOR="Red"]{nao precisa armazenar esse valor}[/COLOR]
Until (v_senha[i]<>#0);

PS³: Vou editar as minhas outras postagem para adequar essa característica!!!

Ah!!! só mais um detalhe... esse código (antigo, no qual foi baseado essa discussão) só precisava tratar o "ENTER" final, já que ele também está sendo armazenado na senha...

UPDATE

Em relação a criar uma unit eu estou a disposição para ajudar !!!

Fico no aguardo!

Valeu

Abraços

Link para o comentário
Compartilhar em outros sites

Olá,

gu_ludo, eu entendi sua explicação... fiz os testes e você está CERTÍSSIMO !!!:rolleyes:

Abaixo um código teste (adaptado do seu, que mostra o que você comentou)

Obs: O único detalhe é que aqui em casa não imprimiu assim , mas sim RSGO. Em fim, sem os espços!


USES CRT;
CONST
ENTER = #13;
BACKSPACE = #8;
max = 8;
TYPE
T_Senha = Array [1..max] of Char;[SPOILER][/SPOILER]


VAR
senha: String;
v_senha: T_Senha;
aux, aux2: Char;
i: Integer;
cont: Integer;

FUNCTION CaracterValido(caracter: T_Senha; cont: Integer): Boolean;
Const
ini_numero = #48;
fim_numero = #57;
ini_minuscula = #97;
fim_minuscula = #122;
ini_maiuscula = #65;
fim_maiuscula = #90;
Begin
CaracterValido:= false;
If(caracter[cont]>=ini_numero) and (caracter[cont]<=fim_numero) then
CaracterValido:= true
else
If(caracter[cont]>=ini_minuscula) and (caracter[cont]<=fim_minuscula) then
CaracterValido:= true
else
If (caracter[cont]>=ini_maiuscula) and (caracter[cont]<=fim_maiuscula) then
CaracterValido:= true;
End;

BEGIN
clrscr;
textcolor(15);

senha:= '';
i:= 1;

Repeat
[COLOR="Red"] (*
Repeat
aux:=readkey;
If(aux = #0)then
aux2:= readkey
else
v_senha[i]:= aux;
Until(aux<>#0);
//REMOVIDO PARA TESTES!!!
*)[/COLOR]
aux:=readkey;
v_senha[i]:= aux;


while(v_senha[i] = BACKSPACE) do
if(i>=1) then
Begin
gotoxy(WhereX-1,WhereY);
write(' ');
gotoxy(WhereX-1,WhereY);
i:= i -1;
v_senha[i]:= readkey;
End;
If(CaracterValido(v_senha, i)) then
Begin
[COLOR="Red"] (*
write('*');
//EDITADO PARA TESTES
*)[/COLOR]
write(v_senha[i]);
i:=i +1;
End;

Until(v_senha[i] = ENTER) or (i>max);

if(i>max) then i:=max;

For cont:= 1 to i do
senha:=senha +v_senha[cont];
writeln;
Write('Senha: ', senha);
readkey;
END.

PROGRAM ex_Senha;

Valeu pela dica...

PS: COMO VOCÊ CHEGOU A ESSA SOLUÇÃO, ou seja, qual foi a lógica/método usado para chegar a essa solução.

PS²: Fica mais uma dica

PS³: Vou editar as minhas outras postagem para adequar essa característica!!!

Ah!!! só mais um detalhe... esse código (antigo, no qual foi baseado essa discussão) só precisava tratar o "ENTER" final, já que ele também está sendo armazenado na senha...

UPDATE

Em relação a criar uma unit eu estou a disposição para ajudar !!!

Fico no aguardo!

Valeu

Abraços

PS: COMO VOCÊ CHEGOU A ESSA SOLUÇÃO, ou seja, qual foi a lógica/método usado para chegar a essa solução.

Bem... Eu aprendi isso na faculdade com o meu professor de IC (Introdução à Computação);

PS²: Fica mais uma dica

Legal!:)

Acerca de criar a UNIT....

Qual versão dos códigos postados escolher?

E... Se você quiser começar... Sinta-se a vontade!:D

Flow!

Abraços

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bem... Eu aprendi isso na faculdade com o meu professor de IC (Introdução à Computação);

Legal!:)

Acerca de criar a UNIT....

Qual versão dos códigos postados escolher?

E... Se você quiser começar... Sinta-se a vontade!:D

Flow!

Abraços

Olá,

Vamos lá...

Ainda não tenho experiência para criar UNIT, mas vamo lá...

Dê uma olhadinha neste post (clique aqui). Lá dá uma boa noção sobre Units!!!

De antemão vá tentando criar umas Units e crie programas para testá-lo.

Estou criando uns materiais aqui... já estou terminando, em breve eu posto aqui...

Qual versão dos códigos postados escolher?

Por enquanto isso "não vai fazer diferença", ou seja, qualquer método por ser suficiente, basta somente que ela faça a sua função... essa é mais ou menos a ideia de "transparência¹".

A função (function) deve fazer o seguinte:

Ler um password, ocultando os caracteres com "*", e retorne a senha em forma de string.

ex.:


Program Teste_Unit_Password;
Uses
CRT,
Password; {utilitario para ler um password ocultando com "*"}
BEGIN
.
.
Write('Usuario :'); ReadLn(usuario);
Write('Senha :'); senha:=ReadPWD;
.
.
END.

Ou seja, a forma de como vai ser lido é "transparente" ao programa. Os programas que irão usar os procedimentos não precisão saber como funciona.

Quem aqui precisa saber como funciona o ReadLn, WriteLn, ClrScr funcionam???

Abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!