Obsługa klawiatury

0

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 ;)

0

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

0

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.

0
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.

0

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?

0
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.

0

Rozwiązanie z GetAsyncKeyState nie pasuje, gdyż zbędnie obciąża procesor.

0
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.

0
-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 i GetAsyncKeyState 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.

0

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 ;) .

0

Odbiegając tematem od waszej kłótni. Pytanie zadał leń któremu nie chce się czytać książki/szukać w google/spytać nauczyciela. On jest na poziomie readKey i to mu w zupełności wystarczy.

0
babubabu napisał(a):

Odbiegając tematem od waszej kłótni.

O_o . Dla Ciebie każda rozmowa w której biorę udział to kłótnia?

Pytanie zadał leń któremu nie chce się czytać książki/szukać w google/spytać nauczyciela. On jest na poziomie readKey i to mu w zupełności wystarczy.

A kto powiedział że piszemy program dla niego. Aczkolwiek takiego pytania jakie on zadał nie da się rozwiązać ot po prostu z readkey, bo nie wiadomo kiedy klawisz zostanie puszczony, a tutaj zazwyczaj się nie skupiamy na poziomie pytacza, wystarczy umiejętność kopiowania gotowców.

0
-123oho napisał(a):

O_o . Dla Ciebie każda rozmowa w której biorę udział to kłótnia?

Może przez "ton" Twoich postów? Ale idzie się przyzwyczaić :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1