Jump to content

ReadKey Pascalzim


mateusalves
 Share

Recommended Posts

mateusalves

Boas, tenho um programa para fazer para um trabalho, e apenas não estou a conseguir efetuar um passo, cujo objetivo é clicar na tecla ESC e através deste clique, limpar todo o ecrã escrever algo através de: "write('...');".

Se alguém me conseguisse ajudar seria brutal.

Obrigado.

Link to comment
Share on other sites

mateusalves

Boas. Fiz este programa:

Program Bandeira_Portugal;
var ATRASO1,ATRASO2, c1,c2,l1,l2:integer;
var c:char;
var sair:boolean;
Begin
  ATRASO1:= 1; // 100 milissegundos
  ATRASO2:= 200; // 200 milissegundos
  gotoxy(26,27);
  textcolor(YELLOW);
  writeln('Precione ESC para terminar o programa');
  c1:=1;
  c2:=87;
  l1:=0;
  l2:=0;
  
  while c1<31 do  //preencher simetricamente o verde e o vermelho
  begin
    
    while l1<25 do
    begin
      delay(ATRASO1);
      l1:=l1+1;
      gotoxy(c1,l1);
      textcolor(GREEN);
      textbackground(GREEN);
      write('.');
      l2:=l2+1;
      gotoxy(c2,l2);
      textcolor(RED);
      textbackground(RED);
      write('.');
    end;
    l1:=0;
    c1:=c1+1;
    l2:=0;
    c2:=c2-1;
  end;
  
  c2:=57;
  l2:=0;
  
  while c2>30 do  //preencher o vermelho em falta
  begin
    
    while l2<25 do
    begin
      delay(ATRASO1);
      l2:=l2+1;
      gotoxy(c2,l2);
      textcolor(RED);
      textbackground(RED);
      write('.');
    end;
    l2:=0;
    c2:=c2-1;
  end;
  
End.

Queria clicar no ESC e fazer com que a bandeira parasse de se mover e aparecesse o meu nome por baixo da mesma, letra a letra. Já tenho os códigos para o segundo passo, mas não estou a conseguir parar a bandeira clicando no ESC, suponho que seja usando o readkey... Se alguém me pudesse ajudar ficava muito agradecido.

Cumprimentos.

Link to comment
Share on other sites

nunopicado

Se bem percebi o que queres, o readkey é apenas parte da história.
Se a ideia é durante a execução dos ciclos verificar se a tecla é pressionada, não podes usar apenas o readykey, pois este pausa-te a sequencia até receber a tecla.

Terias de usar uma função chamada KeyPressed, mas que não faço ideia se existe na amostra de compilador que é o PZim.
O KeyPressed verifica se alguma tecla é pressionada, mas sem parar a operação. Só por si não consegue dizer qual tecla foi pressionada, e aí já entra o readkey.
Em conjunto, estas duas funções deverão fazer o que precisas.

Algo tipo (algures dentro do ciclo):

 

if KeyPressed
  then 
    case ReadKey do
      #0: ReadKey;   // Serve para limpar o buffer caso seja pressionada uma tecla especial
      #27: FazOQueQuiseresFazerAoPressionarEsc;
    end;

 

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

mateusalves

Isto é o que eu tenho:

Program Bandeira_Portugal;
var ATRASO1,ATRASO2, c1,c2,l1,l2,l3:integer;
c:char;
sair:boolean;
Begin
  
  ATRASO1:= 1; // 1 milissegundo
  ATRASO2:= 200; // 200 milissegundos
  c1:=1;
  c2:=87;
  l1:=0;
  l2:=0;
  gotoxy(26,27);
  textcolor(YELLOW);
  writeln('Precione ESC para terminar o programa');
  while c1<31 do  //preencher simetricamente o verde e o vermelho
  begin
    
    while l1<25 do
    begin
      delay(ATRASO1);
      l1:=l1+1;
      gotoxy(c1,l1);
      textcolor(GREEN);
      textbackground(GREEN);
      write('.');
      l2:=l2+1;
      gotoxy(c2,l2);
      textcolor(RED);
      textbackground(RED);
      write('.');
    end;
    
    l1:=0;
    c1:=c1+1;
    l2:=0;
    c2:=c2-1;
  end;
  
  c2:=57;
  l2:=0;
  while c2>30 do  //preencher o vermelho em falta
  begin
    
    while l2<25 do
    begin
      delay(ATRASO1);
      l2:=l2+1;
      gotoxy(c2,l2);
      textcolor(RED);
      textbackground(RED);
      write('.');
    end;
    l2:=0;
    c2:=c2-1;
  end;
  
End.

 

Isto é o que quero que aconteça quando pressionar o ESC:

//A bandeira não se mexe mais e aparece o texto seguinte:

textcolor(WHITE);
  textbackground(BLACK);
  gotoxy(1,26);write('P');delay(ATRASO2);gotoxy(1,26);write('Po');delay(ATRASO2);
  gotoxy(1,26);write('Por');delay(ATRASO2);gotoxy(1,26);write('Por ');delay(ATRASO2);
  gotoxy(1,26);write('Por M');delay(ATRASO2);gotoxy(1,26);write('Por Ma');delay(ATRASO2);
  gotoxy(1,26);write('Por Mat');delay(ATRASO2);gotoxy(1,26);write('Por Mate');delay(ATRASO2);
  gotoxy(1,26);write('Por Mateu');delay(ATRASO2);gotoxy(1,26);write('Por Mateus');delay(ATRASO2);
  gotoxy(1,26);write('Por Mateus ');delay(ATRASO2);gotoxy(1,26);write('Por Mateus A');delay(ATRASO2);
  gotoxy(1,26);write('Por Mateus Al');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alv');delay(ATRASO2);
  gotoxy(1,26);write('Por Mateus Alve');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alves');delay(ATRASO2);
  clrscr;

 

Já tentei de tudo e não consigo fazer funcionar...

Link to comment
Share on other sites

passarito

Pegando no que te disse o @nunopicado, colocas isto em todos os ciclos

if KeyPressed
  then 
    case ReadKey do
      #0: ReadKey;   // Serve para limpar o buffer caso seja pressionada uma tecla especial
      #27: 
		textcolor(WHITE);
  		textbackground(BLACK);
        gotoxy(1,26);write('P');delay(ATRASO2);gotoxy(1,26);write('Po');delay(ATRASO2);
        gotoxy(1,26);write('Por');delay(ATRASO2);gotoxy(1,26);write('Por ');delay(ATRASO2);
        gotoxy(1,26);write('Por M');delay(ATRASO2);gotoxy(1,26);write('Por Ma');delay(ATRASO2);
        gotoxy(1,26);write('Por Mat');delay(ATRASO2);gotoxy(1,26);write('Por Mate');delay(ATRASO2);
        gotoxy(1,26);write('Por Mateu');delay(ATRASO2);gotoxy(1,26);write('Por Mateus');delay(ATRASO2);
        gotoxy(1,26);write('Por Mateus ');delay(ATRASO2);gotoxy(1,26);write('Por Mateus A');delay(ATRASO2);
        gotoxy(1,26);write('Por Mateus Al');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alv');delay(ATRASO2);
		gotoxy(1,26);write('Por Mateus Alve');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alves');delay(ATRASO2);
  		clrscr; 
    end;

Mas isto é programação "spaghetti".

Usa procedimentos e funções.

  • Vote 1
Link to comment
Share on other sites

nunopicado

Junta-lhe só um begin antes do textcolor e um end depois do clrscr.

Mas como diz o @passarito, isso precisa urgentemente ser refactorado com procedimentos/funções.
Além de que multiplas instruções na mesma linha de código fica um pesadelo para quem está a olhar.

Pensa nisto: Sempre que fizeres Copy/Paste num código, há 99% de hipótese de haver uma forma melhor de fazer a mesma coisa com menos trabalho e mais eficácia.
Só nesse pedaço de código que queres executar quando tocas no ESC tens 16x gotoxy, 16x write e 16x delay. Sem a 'batota' das multiplas instruções na mesma linha, terias só nessa parte 48 linhas de código, praticamente todo repetido.
É o que chamamos uma bandeira vermelha de mau código.

Assim de cabeça, algo assim faria o mesmo efeito:
 

procedure TypeWriter(const Text: string; const X, Y: Byte; DelayValue: Word);
var
  i: Integer;
begin
  GotoXY(X, Y);
  for i := 1 to Length(Text) do
    begin
      Write(Text[i]);
      Delay(DelayValue);
    end;
end;

que depois usarias assim:

textcolor(WHITE);
textbackground(BLACK);
TypeWriter('Por Mateus Alves', 1, 26, ATRASO2);
clrscr; 

 

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

passarito
19 horas atrás, nunopicado disse:

Junta-lhe só um begin antes do textcolor e um end depois do clrscr.

Tens toda a razão.

No teu código, eu apenas optaria por colocar o textcolor e textbackground dentro do procedimento usando mais 2 argumentos para passar os valores das cores.

 

@mateusalves, pelo que vi, parece-me que estás a iniciar nisto do Pascal e a "brincar" para aprender. Se for o caso vai aproveitando as dicas que te damos aqui 😉

Assim sendo, aqui qualquer coisinha:

Esses WHILE's para mim estão mesmo a pedir um ciclo FOR. Poupa-te em código e fica mais perceptível.

Vou fazer o vermelho e depois podes aplicar o mesmo método nos outros ciclos WHILE

//  c2:=57; --> Não é preciso
//  l2:=0; ---> Não é preciso
// Com o ciclo FOR não necessitas de inicializar, re-inicializar nem incrementar as variavies

  For c2:=57 DownTo 30 do //preencher o vermelho em falta
  begin
    For l2:=0 to 25 do
	begin
      // aqui usaria um procedimento semelhante ao do @nunopicado em vez do código abaixo
      delay(ATRASO1);
      gotoxy(c2,l2);
      textcolor(RED);  
      textbackground(RED); 
      write('.');
    end;
  end;

 

  • Vote 1
Link to comment
Share on other sites

nunopicado
13 horas atrás, passarito disse:

No teu código, eu apenas optaria por colocar o textcolor e textbackground dentro do procedimento usando mais 2 argumentos para passar os valores das cores.

Sim, ainda pensei nisso, mas acabei por não pôr.
Ficaria assim:

procedure TypeWriter(const Text: string; const X, Y, Color, BGColor: Byte; DelayValue: Word);
var
  i: Integer;
begin
  TextColor(Color);
  TextBackGround(BGColor);
  GotoXY(X, Y);
  for i := 1 to Length(Text) do
    begin
      Write(Text[i]);
      Delay(DelayValue);
    end;
end;

E depois a usar:

TypeWriter('Por Mateus Alves', 1, 26, WHITE, BLACK, ATRASO2);
clrscr; 

 

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.