Witam.
Chce zrobić Pascalu coś takiego, że: gdy nacisnę jakiś klawisz np: h to pojawi się mi jakiś napis, natomiast jak puszcze ten klawisz to napis zniknie.
Z góry dzięki za pomoc ;)
Witam.
Chce zrobić Pascalu coś takiego, że: gdy nacisnę jakiś klawisz np: h to pojawi się mi jakiś napis, natomiast jak puszcze ten klawisz to napis zniknie.
Z góry dzięki za pomoc ;)
Paskal w standardzie nie przywiduje takiego poziomu obsługi klawiatury.
Możesz użyć do tego celu WinAPI (jeżeli piszesz pod windowsy) funkcja GetKeyState
Lub np biblioteki allegro szukaj allegro.pas
Coś w stylu:
While (true) Do
Begin
ClrScr;
if (KeyPressed) Then
if (ReadKey = 'a') Then
Write('lol');
Delay(100);
End;
Z tym, że takie babranie się z tym w konsoli nie ma większego sensu; po to jest np.moduł Graph.
repeat until keypressed
z:=readkey;
if z='h' then write('napis');
else
Może niech pytacz zacznie od kursów podstaw bo ten kod nie ma sensu. Wygląda na zlepek paru gotowców.
Lub np biblioteki allegro szukaj allegro.pas
Po co używać allegro skoro chodzi tylko o pobranie statusu klawiszy? No chyba że allegro jest wielkoformatowe ale to i tak przy Delphi dużo nie zmienia...
A zrobić to można np. tak (o boshe rozdają gotowce!).
program Project1;
{$mode objfpc}{$H+}
uses Windows,CRT;
begin
clrscr;
repeat
gotoxy(1,1);
if (GetAsyncKeyState($87) and ($8000))<>0 then write('LOL') else write(' ');
until (GetAsyncKeyState($18)and ($8000))<>0;
end.
Wyświetli LOL jak naciśniesz klawisz F24.
GetAsyncKeyState nie pasuje do tego zadania. Użyj ReadConsoleInput.
Kod z palca, niesprawdzony:
uses
SysUtils, Windows;
var
InputRec: TInputRecord;
NumRead: DWORD;
begin
while True do
ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), InputRec, 1, NumRead);
if InputRec.EventType = KEY_EVENT then begin
case InputRec.Event.KeyEvent.wVirtualKeyCode of
'H': begin
if InputRec.Event.KeyEvent.bKeyDown then begin
WriteLn('Wcisnieto klawisz');
end else begin
WriteLn('Zwolniono klawisz');
end;
end;
VK_ESCAPE: break;
end;
end;
end;
end.
Więcej o ReadConsoleInput
i TInputRecord
na MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961%28v=vs.85%29.aspx
-123oho napisał(a):
$87 ... $8000 ... $18
Stałe i literały ukradli?
adf88 napisał(a):
-123oho napisał(a):
$87 ... $8000 ... $18
Stałe i literały ukradli?
Magic values FTW! W przeciwieństwie do ciebie nie chciałem wyręczać lenia w pracy.
GetAsyncKeyState nie pasuje do tego zadania.
Spełnia swoje zadanie więc IMO pasuje.
Rozwiązanie z GetAsyncKeyState nie pasuje, gdyż zbędnie obciąża procesor.
adf88 napisał(a):
Rozwiązanie z GetAsyncKeyState nie pasuje, gdyż zbędnie obciąża procesor.
Ahhh crap! Masz 8086?
Ale swoją drogą, to niby czemu obciąża? I czym niby się różni od np. GetKeyState.
-123oho napisał(a):
Ahhh crap! Masz 8086?
Jakby jakiś konsolowy program nic w tle nie robiąc poprosił cię o wciśnięcie klawisza to na pewno rzuciłbyś WTF'em gdyby znacznie obciążał Ci procesor w tym momencie.
-123oho napisał(a):
Ale swoją drogą, to niby czemu obciąża? I czym niby się różni od np. GetKeyState.
Nie wiesz tego? Wszystko jest w dokumentacji.
GetKeyState
jak iGetAsyncKeyState
są funkcjami nieblokującymi. Ich zadaniem jest odczytanie stanu wciśnięcia klawisza w momencie wywołania funkcji.GetAsyncKeyState
dodatkowo zwraca stan wciśnięcia z poprzedniego wywołania tej funkcji. Natomiast celem jest poczekanie na klawisz. Jakoś to czekanie trzeba zaimplementować. Wpuszczanie programu w szaleńczą pętlę jest z pewnością niedobrym pomysłem.ReadConsoleInput
pasuje tu o wiele lepiej bo służy właśnie do tego, do czego dążymy. Poczeka na klawisz.
Jakby jakiś konsolowy program nic w tle nie robiąc poprosił cię o wciśnięcie klawisza to na pewno rzuciłbyś WTF'em gdyby znacznie obciążał Ci procesor w tym momencie.
Od tego jest readkey, zresztą każdy loop bez sleepa zrobi masakrę na procku. Sleep to już zbyt duży ficzur uznałem.
Nie wiesz tego? Wszystko jest w dokumentacji.
Nigdy mnie to nie interesowało. Zazwyczaj korzystam z obudówek na to, a jeden raz gdy w asmie potrzebowałem pobierać status klawisza użyłem właśnie GetKeyAsyncState.
ReadConsoleInput pasuje tu o wiele lepiej bo służy właśnie do tego, do czego dążymy. Poczeka na klawisz.
Ale kto powiedział że on nie chce zrobić czegoś innego w czasie gdy czekamy?
Nie mniej thx, wystarczyło powiedzenie że ReadConsoleInput jest blokujące a reszta nie :P .
Natomiast celem jest poczekanie na klawisz. Jakoś to czekanie trzeba zaimplementować. Wpuszczanie programu w szaleńczą pętlę jest z pewnością niedobrym pomysłem.
No właśnie nie jestem pewien czy celem jest poczekanie. 'Szaleńcza pętla' to częste rozwiązanie wewnątrz WinApi przy funkcjach blokujących ;) .