[ Príspevkov: 16 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
NapísalOffline : 07.01.2010 13:50 | [Delphi] klavesy

Ako mam v Delphi urobit aplikaciu aby sa vykonal (jeden) prikaz len pri stlaceni prislusnych dvoch tlacidiel?

Napr.: Stlacim LEFT + UP a vyskoci mi sprava (showmessage). Ked stlacim LEFT tak mi ina vyskoci


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 14:19 | [Delphi] klavesy

Na to, aby sa mohla zisťovať štatistiky klávesnice, je nutné použiť buď timer, alebo háky (hooks) - to je ale trocha komplikované na tak jednoduché použitie. Takže pomocou timeru by sa to dalo napríklad takto:

Kód:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

  if ( ((GetKeyState(VK_UP) and 128) = 128) and ((GetKeyState(VK_LEFT) and 128) = 128) ) then
    ShowMessage('ok');

end;


Ten timer nech má interval okolo 20 ms.

Existuje viacero možností pre monitorovanie stlačených klávesov, ale ja používam túto funkciu. Neviem presne, čo konkrétne má obsluhovať, takže možno nebude vyhovovať. (Napríklad, ak bude kombinácia klávesov stlaćená príliš dlho, ShowMessage sa vyvolá viackrát.


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
Napísal autor témyOffline : 07.01.2010 14:33 | [Delphi] klavesy

... no ono to nema obsluhovat ShowMessage, to bol iba taky priklad, obsluhovat to bude prenos cez RS232. Ale praveze to je dobre pocas celeho stlacenia, ze to bude znovu vyvolavane. A tych 128 co znamena ?

A ten soft sa neda urobit ako pri stlaceni 1 tlacidlom, nejakym ANDom?

Kód:
procedure TForm1.FormKeyDown(Sender:TObject; var Key:Word;
          Shift:TShiftState);
begin
  case Key of
    vk_left:   
    vk_right: 
  end;
end;


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 14:55 | [Delphi] klavesy

Tvoj kód bude fungovať, iba ak formulár bude mať focus (zameranie). Ak bude mať focus nejaký ovládací prvok na forme, tak to nepôjde.

and 128 znamená ...
Citácia:
If the high-order bit is 1, the key is down

..., že z návratovej hodnoty "vyberieme" ôsmy bit (to je to "and 128" -- 128 je v binárnej sústave 10000000). Ak je ôsmy bit 1 (čize 10000000), tak kláves je stlačený (to je to "= 128" ).


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
Napísal autor témyOffline : 07.01.2010 15:09 | [Delphi] klavesy

Dobre tak diky za rady. Uz som to skusal ide to.

A keby som nieco ine potreboval urobit, tak sa chcem este opytat ako sa to da urobit cez ten AND co som hore pisal pretoze mi to vobec nevyskoci:
Kód:
case Key of
(vk_left) and (vk_up):   ShowMessage('ok');
end;


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
Napísal autor témyOffline : 07.01.2010 15:21 | [Delphi] klavesy

Este by som potreboval dalsi prikaz ktory by sa vykonal po pusteni tych dvoch tlacidiel


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 15:34 | [Delphi] klavesy

Udalosť OnKeyDown sa spustí iba pri stlačení klávesu, tzn., keď je stlačený, už táto udalosť neprebehne. Táto udalosť vo svojom parametri Key nevracia štatistiku stlačených klávesov, takže vykoná sa pri každom stlačenom klávese IBA raz. Aj keď sa možno zdá, že užívateľ stlačí naraz dve klávesy, ale vždy prebehne táto udalosť najprv s jednou virtuálnou hodnotou klávesy v parametri a potom s druhou ==> nedá sa použiť akási kompinácia pomocu AND. A okrem toho stále platí, že kláves by sa zaznamenal, iba ak na forme nie je nejaké tlačidlo, edit, memo, atď (pretože automaticky by dostali focus).

vama píše:
Este by som potreboval dalsi prikaz ktory by sa vykonal po pusteni tych dvoch tlacidiel

Namiesto ShowMessage to zobrazí do Memo, pre lepší prehľad, takže ho treba pridať na form.

Kód:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

  if (not push_down) then

    if ((GetKeyState(VK_LEFT) and 128 = 128) and (GetKeyState(VK_UP) and 128 = 128)) then
      begin
        push_down:= true;
        Memo1.Lines.Add('stlačené');
      end;

  if (push_down) then

    if ((GetKeyState(VK_LEFT) and 128 = 0) and (GetKeyState(VK_UP) and 128 = 0)) then
      begin
        push_down:= false;
        Memo1.Lines.Add('pustené');
      end;

end;


Premenná push_down je na začiatku inicializovaná ako false (napríklad v OnCreate formulára)


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 08.10.07
Prihlásený: 22.11.10
Príspevky: 70
Témy: 30 | 30
Bydlisko: Myjava
NapísalOffline : 07.01.2010 15:57 | [Delphi] klavesy

Cize to pustenie je vyriesene FLAGom (priznakom)


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 16:01 | [Delphi] klavesy

Pri pustení je ôsmy bit návratovej hodnoty GetKeyState nastavený na nulu, preto tam je "if GetKeyState(...) and 128 = 0". To signalizuje uvoľnenie klávesu.


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
Napísal autor témyOffline : 07.01.2010 16:06 | [Delphi] klavesy

a to -- push_down -- je tam na co?


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 16:10 | [Delphi] klavesy

:) No veď tá premenná signalizuje, či je kláves stlačený (push_down = true) alebo či je uvoľnený (push_down = false).


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 08.10.07
Prihlásený: 22.11.10
Príspevky: 70
Témy: 30 | 30
Bydlisko: Myjava
NapísalOffline : 07.01.2010 16:13 | [Delphi] klavesy

a tu premennu treba deklarovat push_down ?


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 07.01.2010 16:20 | [Delphi] klavesy

Fico píše:
Premenná push_down je na začiatku inicializovaná ako false (napríklad v OnCreate formulára)

Keď je false, tak je zrejme boolean, nie? Ale pre istotu to radšej rozpíšem:

Kód:
var
  push_down: boolean = false;


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 08.10.07
Prihlásený: 22.11.10
Príspevky: 70
Témy: 30 | 30
Bydlisko: Myjava
NapísalOffline : 07.01.2010 16:30 | [Delphi] klavesy

Dobre vsetko uz chapem. Robim totiz SOCu a taku premakanejsiu robot stopar, s moznostou dialkoveho ovladania a dokonca aj ovladanie cez PC joystickom. Vsetko som si sam vymyslal - schemu, programovanie mikrokontrolera,.. a nakoniec som este toto potreboval co si mi poradil ty.

Velmi ty dakujem a aj na zaver SOCky ty podakujem. Ak budes chciet vidiet toho robota ked bude dokoncety poslem ti foto + video.


Offline

Užívateľ
Užívateľ
[Delphi] klavesy

Registrovaný: 20.11.09
Prihlásený: 02.11.14
Príspevky: 241
Témy: 58 | 58
Bydlisko: Myjava
Napísal autor témyOffline : 06.02.2010 11:30 | [Delphi] klavesy

Este by som sa chcel opytat, ta detekcia tlacidiel dala by sa urobit cez podmienku CASE?

Ze by som pre kazde tlacidlo nemusel davat podmienku IF:
Kód:
   IF ((GetKeyState(VK_UP) and 128) = 128) then      // pri stlaceni UP
    zapis('vpred');    // vyvola proceduru

  IF ((GetKeyState(VK_DOWN) and 128) = 128) then    // pri stlaceni DOWN
   zapis('vzad');    // vyvola proceduru


Offline

Skúsený užívateľ
Skúsený užívateľ
[Delphi] klavesy

Registrovaný: 11.01.09
Prihlásený: 18.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 06.02.2010 13:04 | [Delphi] klavesy

Dalo by sa to vytvorením takejto funkcie:

Kód:
function KeyPressed: integer;
var i: integer;
begin

  for i:= 0 to 255 do
    if ((GetKeyState(i) and 128) = 128) then begin
      result:= i;
      exit;
    end;

end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin

  case KeyPressed of
    VK_UP: Memo1.Lines.Add('vpred');
    VK_DOWN: Memo1.Lines.Add('vzad');
  end;

end;


 [ Príspevkov: 16 ] 


[Delphi] klavesy



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

delphi zapis cisla do editu v delphi

v Delphi, Visual Basic

3

1151

11.05.2008 12:02

p360t

V tomto fóre nie sú ďalšie neprečítané témy.

nefunkcne klavesy

v Notebooky a netbooky

2

1158

15.07.2007 21:37

Triplespace

V tomto fóre nie sú ďalšie neprečítané témy.

INTERNETOVÉ KLÁVESY

v Externé zariadenia

2

729

31.08.2007 10:27

Gps

V tomto fóre nie sú ďalšie neprečítané témy.

Yamaha klávesy

v Kúpim

1

326

13.01.2018 3:01

Eddy

V tomto fóre nie sú ďalšie neprečítané témy.

Viacnasobne stlacanie klavesy

v Operačné systémy Microsoft

2

726

01.08.2023 0:53

eMp

V tomto fóre nie sú ďalšie neprečítané témy.

Ako rozobrať klávesy?

v Ostatné

13

5270

04.12.2008 16:45

tommy1104

V tomto fóre nie sú ďalšie neprečítané témy.

Klávesy na klávesnici...

v Externé zariadenia

1

883

11.12.2010 1:15

OmeGa

V tomto fóre nie sú ďalšie neprečítané témy.

Ovládač na funkčné klávesy

v Ovládače

2

755

28.03.2012 11:53

m4rty

V tomto fóre nie sú ďalšie neprečítané témy.

nefunkcne klavesy na NTB

v Notebooky a netbooky

5

1828

25.08.2010 16:34

hellriser

V tomto fóre nie sú ďalšie neprečítané témy.

G9 nefunguju multimedialne klavesy

v Externé zariadenia

0

633

10.05.2009 10:44

tairikuokami

V tomto fóre nie sú ďalšie neprečítané témy.

Klavesy na netbooku ACER

v Externé zariadenia

0

430

23.06.2010 13:59

vprint

V tomto fóre nie sú ďalšie neprečítané témy.

Lenovo 3000 N200 klavesy

v Notebooky a netbooky

0

531

08.08.2009 21:22

thominovec

V tomto fóre nie sú ďalšie neprečítané témy.

Logitech G11 - náhradné klávesy

v Externé zariadenia

0

1059

02.12.2008 12:27

eXistenZ

V tomto fóre nie sú ďalšie neprečítané témy.

pascal - emulacia stlacenia klavesy

v Assembler, C, C++, Pascal, Java

5

721

13.04.2009 18:18

Holup

V tomto fóre nie sú ďalšie neprečítané témy.

Stisknutí klávesy pomocí programu

v Delphi, Visual Basic

1

604

26.06.2011 12:39

Fico

V tomto fóre nie sú ďalšie neprečítané témy.

Samovolné reagovanie klávesy Backspace

v Externé zariadenia

1

326

11.01.2015 11:34

carl65



© 2005 - 2024 PCforum, edited by JanoF