Program le_String; Uses CRT; { Produz o barulho de um BEEP } Procedure Beep; Begin sound(220); delay(100); sound(320); delay(100); nosound; End; { Le uma string ate o tamanho maximo especificado } { marca o espaco vago com pontos } Procedure leString(Var variavel: String; tamanho:integer); Var t, posAtual, x: Integer ; lendo : boolean ; tecla : char ; Begin x := wherex-1 ; { descobre a coluna inicial } posAtual := 1 ; { posicao inicial na string } lendo := true ; { indica se a rotina continua ou sai fora } repeat gotoxy(x+posAtual, wherey); { posiciona-se no final da String } for t := posAtual to tamanho do write('.'); { mostra espacos disponiveis } gotoxy(x+posAtual, wherey); { posiciona-se no final da String } tecla := readkey; { Espera usuario digitar uma tecla } case tecla of chr(0) : tecla := readkey; { Se for uma tecla especial (setas...) ignora } chr(13) : lendo := false; { Se pressionar ENTER } chr(8) : Dec(posAtual); { Se pressionar BACKSPACE } chr(27) : Begin { Se pressionar ESC } lendo := false; posAtual := 1; End; else begin { Se pressionar qualquer outra tecla } if posAtual <= tamanho then begin write(tecla); variavel[posAtual] := tecla; Inc(posAtual); end; end; end; if posAtual > tamanho then { Se tiver atingido o tamanho maximo para } begin posAtual := tamanho+1; Beep; end; if posAtual < 1 then { Se estiver no primeiro caractere para } begin posAtual := 1; Beep; end; until not lendo; variavel[0] := chr(posAtual-1); { Ajusta a posicao 0 da String, indicando o numero de caracteres lidos } End; Var nome, endereco: String; Begin clrscr; write('Digite seu nome: '); leString(nome, 20); writeln; writeln('Nome digitado: ', nome); writeln; write('Digite seu endereco: '); leString(Endereco, 40); writeln; write('Endereco digitado: ', Endereco); readln; End.