| | |
| Stránka: 1 z 1
| [ Príspevkov: 16 ] | |
Autor | Správa |
---|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal vama: 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
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal autor témy vama: 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;
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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" ).
|
|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal autor témy vama: 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;
|
|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal autor témy vama: 07.01.2010 15:21 | |
|
Este by som potreboval dalsi prikaz ktory by sa vykonal po pusteni tych dvoch tlacidiel
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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)
|
|
Registrovaný: 08.10.07 Prihlásený: 22.11.10 Príspevky: 70 Témy: 30 Bydlisko: Myjava |
Cize to pustenie je vyriesene FLAGom (priznakom)
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal autor témy vama: 07.01.2010 16:06 | |
|
a to -- push_down -- je tam na co?
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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).
|
|
Registrovaný: 08.10.07 Prihlásený: 22.11.10 Príspevky: 70 Témy: 30 Bydlisko: Myjava |
a tu premennu treba deklarovat push_down ?
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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;
|
|
Registrovaný: 08.10.07 Prihlásený: 22.11.10 Príspevky: 70 Témy: 30 Bydlisko: Myjava |
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.
|
|
Registrovaný: 20.11.09 Prihlásený: 02.11.14 Príspevky: 241 Témy: 58 Bydlisko: Myjava | Napísal autor témy vama: 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
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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;
|
|
| Stránka: 1 z 1
| [ Príspevkov: 16 ] | |
| 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
|
|