Pascal - readkey/delay

Programovacie jazyky, rady, poradňa...
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Pascal - readkey/delay

Príspevok od používateľa pishta007 »

Zdravím, mám otázku:

Stretol sa niekto kto kedykoľvek programoval v Pascale s potrebou cyklu, ktorý by jednotlivé kroky spúšťal po uplynutí určitého času (delay), alebo po stlačení ľubovoľnej klávesy (readkey, alebo keypressed)?

Ak áno, prosím poraďte ako to docieliť? Vopred ďakujem :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Pascal - readley/delay

Príspevok od používateľa BX »

Sám si si to napísal, čo konkrétne potrebuješ?
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Re: Pascal - readley/delay

Príspevok od používateľa pishta007 »

Potrebujem postupne po prvkoch vypisovať maticu na obrazovku. Keď má matica 20 prvkov, tak pri použití delay by užívateľ dlho čakal :) Potrebujem, aby AK UŽÍVATEĽCHCE sa prvky vypisovali samé, ale ak to chce urýchliť, stlačí klávesu a tým preskočí delay.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Pascal - readley/delay

Príspevok od používateľa BX »

Tak urobíš niečo ako

Kód: Vybrať všetko

for i := 1 to vsetkyPrvky do
begin
  if keypressed then
     begin
        VypisOstavajucePrvky();
        break;
     end;
  VypisDalsiPrvok();
  delay(1000);
end;
Toto je prvé, čo ma napadlo. Iste sa to dá aj jednoduchšie, ale na to som moc unavený a lenivý teraz.

// Ešte ma napadlo riešenie so stavovou premennou, ktorá by strážila delay. Delay hodíš do podmienky, že "ak je toto true, vykonaj delay". Keď užívateľ niečo stlačí, zmeníš to na false, delay sa bude preskakovať a tým sa to vypíše hneď a zaraz.
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Re: Pascal - readley/delay

Príspevok od používateľa pishta007 »

Ďakujem za skorú odpoveď :) Dnes ak sa mi podarí, skúsim niečo nakódiť a potom ti pošlem exe-čku. Uvidíš lepšie čo je vo veci. Pretože to tvoje ponúkané riešenie, bude vypisovať pomocou delay-u a bude zároveň sledovať stlačenie klávesy, ktorá ak bude stlačená, vypíše sa všetko naraz. Ja ale potrebujem aby sa prvky vypisovali trebárs po sekunde, ako si ponúkol, ale po 5 prvkoch by sa užívateľ rozhodol výpis urýchliť. Vtedy by stlačil klávesu a prvky by sa vypisovali rýchlejšie. Keď by ale klávesu pustil prvky by zase pokračovali vo výpise po sekunde :)

// teraz tak na to kukám, tak tam stačí len doplniť podmienku IF o ELSE a do neho dať ten delay, teda:

Kód: Vybrať všetko

for i := 1 to vsetkyPrvky do
begin
  if keypressed then VypisPrvok()
  else 
  begin 
     VypisPrvok(); 
     delay(1000); 
  end;
end;
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Pascal - readley/delay

Príspevok od používateľa BX »

Tak v prvom rade sa treba naučiť opísať svoj problém poriadne, nech nemusíme hádať, čo je vo veci.

V tomto prípade by možno stačilo spraviť niečo ako

Kód: Vybrať všetko

for ...
begin
  d_time := 1000;
  if keypressed then d_time := 500;
  VypisPrvok ();
  delay ( d_time );
end;
Prípadne tak, ako si napísal, len do keypress vetvy daj aj nejaký menší delay, lebo sa ti vypíšu veľmi rýchlo všetky.
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Re: Pascal - readley/delay

Príspevok od používateľa pishta007 »

Využijem tebou ponúknuté posledné riešenie, zdá sa byť najjednoduchšie a zároveň efektívne. Ďakujem za cennú radu!
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Pascal - readley/delay

Príspevok od používateľa BX »

Rado sa stalo :)
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Re: Pascal - readley/delay

Príspevok od používateľa pishta007 »

Je tu menší problém :( Program si zapamätá, že bola stlačená klávesa a i napriek tomu že som ju stlačil iba raz, tak sa chová ako by som ju stláčal stále. To znamená, že príkaz d_time:=1000; sa vykoná iba raz a po stlačení klávesu už nie.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Pascal - readley/delay

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

if keypressed then d_time := 500;
zmeň na

Kód: Vybrať všetko

if keypressed then begin
    d_time := 500;
    keypressed := false;
end;
pishta007
Light Expert
Light Expert
Príspevky: 45
Registrovaný: 16 mar 2009, 19:57

Re: Pascal - readley/delay

Príspevok od používateľa pishta007 »

Kód: Vybrať všetko

keypressed:=false;
Som skúšal, nepomohlo. Kompiláciu zastavilo toto chybové hlásenie:

Kód: Vybrať všetko

Error 122: invalid variable reference
//autoeditácia príspevku (21 Aug 2012, 13:50)
Vyriešil som to :) Tu je celá procedúra zabezpečujúca výpis matice na obrazovku. Rýchlosť výpisu je ovládaná šípkami hore a dolu. V prípade otázok, prosím pošlite mi ss.

Kód: Vybrať všetko

procedure vypis (matX:matica; mvs:integer);        {mvs - "Matice Vedla Seba :-)"}
var i,j:byte;
    e:char;
    d_time:integer;
    X_s:string; {X_s - prvok matice na string, kvoli vypisu}
begin
d_time:=2000;
interfejs;
  for i:=1 to rozmer do
    for j:=1 to rozmer do
    begin 
      if keypressed then
      begin
      e:=readkey;
      case e of
      #0:begin 
           e:=readkey;
           case e of
           #72: d_time:=d_time+500;
           #80: d_time:=d_time-500;
           end;
         end;
      #27:break;
      end;
      end;
      str(matX[i,j],X_s);
      write_all(X_s,3*j+mvs,i+3,stred,0);
      if (d_time<=500) then d_time:=500;
      if (d_time>=2000) then d_time:=2000;  
      delay(d_time);      
    end;
end;
Napísať odpoveď