Free Pascal CRT és WinCRT unit probléma, mindkét unit kellene hogy a program helyesen működjön. Megoldás? (bővebben lent forráskóddal)
A WinCRT unit szükséges ahhoz, hogy a sound eljárás normális hangot adjon, ne csak pittyegjen, mint a CRT unit esetén.
Ha a programban a WinCRT unit-ot használom, akkor konzolban nem mennek a readkey és hasonló függvények, legalábbis nekem nem reagál.
Mit lehet tenni, hogy normál hangot adjon és még a billentyűk is működjenek?
A program működése:
felnyíl: 100 HZ csökkentés, lenyíl: 100 HZ növelés, bal nyíl: 10 HZ csökkentés, jobb nyíl: 10 HZ növelés, pagedown: 1000 HZ novelés, pageup: 1000 HZ csökkentés, szóközre elnémul a hang, esc: kilépés
Elismerem, hogy szebb lett volna definiálni konstansként a billetyűket, de most nekem az lenne a célom, hogy működjön a program.
Megoldás a problémára?
program Hang;
uses crt;
var
ch : char;
mennyi : longint;
begin
mennyi := 20;
repeat
ch := readkey;
if ch = #0 then
begin
ch := readkey;
case ch of
#72: begin
if mennyi-100 >20 then dec(mennyi,100) else mennyi:=20;
end;
#80: begin
if mennyi+100<8000 then inc(mennyi,100) else mennyi:=8000;
end;
#75: begin
if mennyi-10>20 then dec(mennyi,10) else mennyi:=20;
end;
#77: begin
if mennyi+10<8000 then inc(mennyi,10) else mennyi:=8000;
end;
#73: begin
if mennyi-1000<20 then mennyi:=20 else dec(mennyi,1000);
end;
#81: begin
if mennyi+1000>8000 then mennyi:=8000 else inc(mennyi,1000);
end;
' ': nosound;
end;
end;
sound(mennyi);
write(#13#10,mennyi,'HZ');
until ch=#27;
end.
Tedd ki a soundot egy külön unitba és onnan hívd meg. Pl:
Unit msound;
Uses wincrt;
Interface
Procedure mysound(aHz: word);
Implementation
Procedure mysound(aHz: word);
Begin
Sound(aHz);
End;
End.
A saját programodba pedig meghívod:
Program zene;
Uses msound;
Begin
Mysound(500);
End.
De lehet, úgy is működik, ha mind a két unitot (crt, wincrt) felveszed a programodban és pl a soundra így hivatkozol: Wincrt.sound(500);
Közben ki is próbáltam. Nem kell saját unittal trükközni. Nálam így működik:
program Hang;
uses crt, wincrt;
var
ch : char;
mennyi : longint;
begin
mennyi := 20;
writeln('Nyomj egy nyilat, vagy PgUp, PgDown. Kilepes ESC');
repeat
ch := crt.readkey;
if ch = #0 then
begin
ch := crt.readkey;
case ch of
#72: begin
if mennyi-100 >20 then dec(mennyi,100) else mennyi:=20;
end;
#80: begin
if mennyi+100<8000 then inc(mennyi,100) else mennyi:=8000;
end;
#75: begin
if mennyi-10>20 then dec(mennyi,10) else mennyi:=20;
end;
#77: begin
if mennyi+10<8000 then inc(mennyi,10) else mennyi:=8000;
end;
#73: begin
if mennyi-1000<20 then mennyi:=20 else dec(mennyi,1000);
end;
#81: begin
if mennyi+1000>8000 then mennyi:=8000 else inc(mennyi,1000);
end;
' ': wincrt.nosound;
end;
end;
wincrt.sound(mennyi);
write(#13#10,mennyi,'HZ');
until ch=#27;
end.
#72: begin
if mennyi-100 >20 then dec(mennyi,100) else mennyi:=20;
end;
helyett elég:
#72: if mennyi - 100 > 20 then Dec(mennyi, 100) else mennyi := 20;
mivel csak egy 'utasítás' van még ha az if-nek van else ága akkor is.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!