Konsole: Pobieranie znaku

0

Pochwalony! Piszę język skryptowy i zauważyłem, iż potrzebne mi będzie polecenie do pobierania jednego znaku (odpowiednik BAT'owego CHOICE, Pascal'owego: GetKEy (Chyba) itp...). Jak to zrobić?? :) Z góry dzięki za wszystkie podpowiedzi. Pozdrawiam KiteK.

PS. Wie ktoś, jak wyłączyć konsole, ale tak, by okno pozostało, że by się nie chowało?? :) Pozdrowienia Patryk.

0

Może zdarzenia OnKeyDown, OnKeyPress, a w nich sprawdzanie, co było naciśnięte?

0

Niestety nie.... chodzi mi o konsolę... :(

0

Gdzieś na 4p był taki komponent pod tytułem KeySpy, może tam coś znajdziesz...

0

Dzięki za podpowiedzi :), ale to jest konsola, trzeba najpierw jakoś uruchomić machinę wpisywania, żeby był chociaż kursorek :)

0

Niestety nie.... chodzi mi o konsolę... :(

function ReadKey:Char;
var
  Rec: TInputRecord;
  x: Cardinal;
begin
  repeat
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), Rec, 1, x);
  until (Rec.EventType = KEY_EVENT) and (Rec.Event.KeyEvent.bKeyDown);
  Result := Rec.Event.KeyEvent.AsciiChar;
end;

[<font color="blue">dopisane</span>]

Detox, niestety nie działa :-/
(BTW: po co bym wklejał kod tego ReadKey powyżej :-D )

0

A nie działa stary, pascalowy Readkey?

var
k: char;

begin
...
k := ReadKey;  // tutaj następuje zatrzymanie
...
end;

PS: tak przynajmniej było w Pascalu... może i tu działa :P

0

Niestety nie.... chodzi mi o konsolę... :(

function ReadKey:Char;
var
  Rec: TInputRecord;
  x: Cardinal;
begin
  repeat
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), Rec, 1, x);
  until (Rec.EventType = KEY_EVENT) and (Rec.Event.KeyEvent.bKeyDown);
  Result := Rec.Event.KeyEvent.AsciiChar;
end;

[<font color="blue">dopisane</span>]

Detox, niestety nie działa :-/
(BTW: po co bym wklejał kod tego ReadKey powyżej :-D )

Pochwalony! Coś z tym jest nie tak, jakoś dziwnie działa, pisząc:


var
  C: Char;
begin
C := ReadKey;
Writeln('Napisales: ', C);
Readln;
end;

To w poleceniu Readln; pojawia się na początku ten znak napisany w readkey :). Pobawię się tym, może dojdę do czegoś, to zamieszczę tutaj.

A nie działa stary, pascalowy Readkey?

var
k: char;

begin
...
k := ReadKey; // tutaj następuje zatrzymanie
...
end;

PS: tak przynajmniej było w Pascalu... może i tu działa

A fajnie by było, gdyby było... :):)P

0

A nie czasem:

[code]var
I: char;
begin
Readln(I); //ewentualnie Read
Writeln('Nacisnales '+ I);
Readln;
[/code]

Nie wiem, zy o to chodzi :)

0

A nie czasem:
[..]

Nie, bo to pobiera całą linię.

0

Powinien być char (tak jak jest) i Read(i) - powinno działać, bo u mnie działało ;)

0

Pochwalony! Niestety, korzystanie z Read i Readln z parametrem, którego typ to Char nie zadziała... . Spróbuję się dalej pobawic tym kodem Piechnat'a :)
PS. na razie doszedłem tylko do tego, jak zrobić myszkę w konsoli :P

0

to spróbuj z byte ;p

0

Też nic... :(

0
var
  twice : char = #0;
  shift  : boolean;
  alt    : boolean;
  ctrl    : boolean;
  handle : THandle;

function KeyPressed : boolean;
var
  num    : DWORD;

begin
  GetNumberOfConsoleInputEvents(handle,num);
  Keypressed := boolean(num);
end;


function ReadKey : char;
var
  buf    : INPUT_RECORD;
  num    : dword;

begin
  if boolean(twice) then
  begin
    result := twice;
    twice := #0;
    exit;
  end;

  repeat
    ReadConsoleInput(handle,buf,1,num);
    sleep(10);
  until buf.Event.KeyEvent.bKeyDown and (buf.EventType = KEY_EVENT);

  if not boolean(buf.Event.KeyEvent.AsciiChar) then
    twice := char(buf.Event.KeyEvent.wVirtualKeyCode);

  shift := boolean(GetKeyState(VK_SHIFT));
  alt   := boolean(GetKeyState(VK_CONTROL));
  ctrl  := boolean(GetKeyState(VK_MENU));
  
  result := buf.Event.KeyEvent.AsciiChar;
end;

begin
  AllocConsole;
  handle := GetStdHandle(STD_INPUT_HANDLE);
{tu Twój kod korzystający z funkcji ReadKey:
jeśli ASCII - zwraca ok; jeśli inny kod - zwraca zero, a drugie wywołanie zwraca kod  - tak jak w ReadKey z Turbo Pascala}
end;
0

nie chcę Cię zniechęcać, ale jeśli nie umiesz zrobić czegoś takiego, to sądzisz, że wystarczy Ci umiejętności do stworzenia interpretera? bo wydaje mi się, że jest to problem dużo trudniejszy od grzebania przez godzinę w helpie.
:|

0

Cześć! Dzięki bardzo za odpowiedzi (i za przypomnnienie sobie o tym poście :P). Gdy tylko wrócę ze szkoły, od razu siadam do kompa i testuję :).
Co do ostatniej odpowiedzi, nie, nie takie trudne jest zrobienie tego interpretora (on jest tylko do mojego własnego języka skryptowego). Co prawda, troszkę głupio rozwiązałem problem parametrów, ale oprócz tego, to zapowiada się całkiem, całkiem. Programik posiada z 400 poleceń, teraz brakuje tylko ReadKey. Doszedłem do początków pisania tego polecenia, nawet pobierało tylko jedną literkę, ale ona później była jeszcze dopisywana do Readln, poza tym nie działały literki z ogonkami. Dziękuję za podpowiedzi, KiteK

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