Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ 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
Bydlisko: Myjava
Príspevok NapísalOffline : 07.01.2010 13:50

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ý: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 14:19

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
Bydlisko: Myjava
Príspevok Napísal autor témyOffline : 07.01.2010 14:33

... 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ý: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 14:55

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
Bydlisko: Myjava
Príspevok Napísal autor témyOffline : 07.01.2010 15:09

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
Bydlisko: Myjava
Príspevok Napísal autor témyOffline : 07.01.2010 15:21

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ý: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 15:34

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
Bydlisko: Myjava
Príspevok NapísalOffline : 07.01.2010 15:57

Cize to pustenie je vyriesene FLAGom (priznakom)


Offline

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

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 16:01

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
Bydlisko: Myjava
Príspevok Napísal autor témyOffline : 07.01.2010 16:06

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ý: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 16:10

:) 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
Bydlisko: Myjava
Príspevok NapísalOffline : 07.01.2010 16:13

a tu premennu treba deklarovat push_down ?


Offline

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

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 07.01.2010 16:20

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
Bydlisko: Myjava
Príspevok NapísalOffline : 07.01.2010 16:30

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
Bydlisko: Myjava
Príspevok Napísal autor témyOffline : 06.02.2010 11:30

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ý: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 06.02.2010 13:04

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;


Odpovedať na tému [ Príspevkov: 16 ] 


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

1100

11.05.2008 12:02

p360t Zobrazenie posledných príspevkov

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

v Externé zariadenia

2

685

31.08.2007 10:27

Gps Zobrazenie posledných príspevkov

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

v Kúpim

1

289

13.01.2018 3:01

Eddy Zobrazenie posledných príspevkov

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

v Notebooky a netbooky

2

1108

15.07.2007 21:37

Triplespace Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Klávesy na klávesnici...

v Externé zariadenia

1

838

11.12.2010 1:15

OmeGa Zobrazenie posledných príspevkov

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

v Operačné systémy Microsoft

2

348

01.08.2023 0:53

eMp Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako rozobrať klávesy?

v Ostatné

13

5180

04.12.2008 16:45

tommy1104 Zobrazenie posledných príspevkov

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

v Notebooky a netbooky

8

806

27.11.2013 9:17

Dzeky Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. dev C++ paralelné klávesy

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

0

501

02.08.2009 0:16

Loko11 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Reakcia na stlacenie klávesy

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

4

579

28.04.2012 16:29

Gresthorn Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Bindovanie viet na klávesy

v Bezpečnosť a firewally

1

378

07.12.2014 16:35

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ovládač na funkčné klávesy

v Ovládače

2

726

28.03.2012 11:53

m4rty Zobrazenie posledných príspevkov

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

v Notebooky a netbooky

5

1753

25.08.2010 16:34

hellriser Zobrazenie posledných príspevkov

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

v Externé zariadenia

0

595

10.05.2009 10:44

tairikuokami Zobrazenie posledných príspevkov

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

v Externé zariadenia

0

390

23.06.2010 13:59

vprint Zobrazenie posledných príspevkov

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

v Notebooky a netbooky

0

491

08.08.2009 21:22

thominovec Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra