View previous topic :: View next topic |
Author |
Message |
S1 Indago dalībnieks
Joined: 31 Jul 2005 Posts: 219 Location: Jelgava
|
Posted: Sat Jul 08, 2006 2:48 pm Post subject: delphi, keyboard |
|
sveiki, man ir vien jautājums par pogu nolasīšanu. delfīnā to var vienkārši izdarīt ar formas notikumiem(events) onKeyPress utt... jautājums ir šāds, vai var to izdarīt savādākā veidā, neizmantojot šos formas eventus un windows loopu. labs piemērs ir, kā dabūt kursora X,Y koord : windows.GetCursorPos , kautko tamlīdzīgu gribētos, tikai ar pogām. (lai izvairītos no spamošanas tad saku uzreiz - programmēšana nav mans hobijs ) |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sat Jul 08, 2006 3:19 pm Post subject: |
|
Neviens jau tev neaizliedz saglabāt tās nospiestās pogas kautkādā masīvā un tad vēlāk izmantot.
Bet ja nu ļoti tā negribās, tad var lietot, piemēram, pa tiešo WinAPI: http://windowssdk.msdn.microsoft.com/en-us/library/ms646299.aspx
Code: | var keys: array[0..255] of byte;
...
GetKeyboardState(keys);
if keys[VK_LSHIFT] and $80!=0 then ShowMessage('Nospiests kreisais shift');
if keys[ord('A')] and $80!=0 then ShowMessage('Nospiests burts A'); // mazais a==lielais A
if keys[VK_SPACE] and $80!=0 then // atstarpe; |
Tās VK_xx konstantes var apskatīties te: http://windowssdk.msdn.microsoft.com/en-us/library/ms645540.aspx
Tikai vienas pogas nospiedienam var izmantot šo fju: http://windowssdk.msdn.microsoft.com/en-us/library/ms646293.aspx
(tikai tas būs lēnāk, ja vajadzēs pēc kārtas pārbaudīt 10 pogas, nekā izsaucot to GetKeyboardState fju
Code: | if GetAsyncKeyState(VK_SPACE) and $80 !=0 then // atstarpe ir nospiesta; |
|
|
Back to top |
|
|
S1 Indago dalībnieks
Joined: 31 Jul 2005 Posts: 219 Location: Jelgava
|
Posted: Sat Jul 08, 2006 11:47 pm Post subject: |
|
paldies par info . sākumā nesanāsa palaist f-ju GetKeyboardState(), jo tas lielums ko padod tai f-jai ir tKeyBoardState tips. beigās atradu šādu risinājumu:
Code: | var KeyState : TKeyboardState;
//onFormCreate, citādi spaidot pogu tā vērtība visu laiku mainās
KeyState[VK_SPACE] := 0;
SetKeyboardState(KeyState);
if(KeyState[VK_SPACE] = 1)then ...
|
vēl man baigi derētu zināt vai poga(jebkura) ir tikusi nospiesta ??? |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 09, 2006 12:09 am Post subject: |
|
em... cikls?
Code: | for i := 0 to 255 do
if KeyState[i] = 1 then // ? kāpēc 1, dokumentācijā teikts, ka $80
kautkaadaa_poga_ir_nospiesta();
|
|
|
Back to top |
|
|
S1 Indago dalībnieks
Joined: 31 Jul 2005 Posts: 219 Location: Jelgava
|
Posted: Sun Jul 09, 2006 12:20 pm Post subject: |
|
nu ja cikls laikam karstums vainīgs, ok vēlviens truls jautājums: kam tas $80 ??? itkā bez tā es iztieku... |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 09, 2006 1:05 pm Post subject: |
|
Nu dokumentācijā rakstīts, ka, ja poga nospiesta, tad ir uzstādīts augstākais (8-tais bits). Ja nav nospiesta, tad tas bits ir 0. Bet tas nenozīmē, ka, piemēram, uz kautkādiem kreisiem windows variantiem (vai klaviatūras draiveriem, nez) pirmais bits vienmēr varētu būt 1. Tādā gadījumā - nospiesta poga=$81 (kas ir true), nenospiesta poga=$01 (kas arī ir true). Jo false vērtība iegūstās tikai vienā gadījumā - kad vērtība ir=0. |
|
Back to top |
|
|
S1 Indago dalībnieks
Joined: 31 Jul 2005 Posts: 219 Location: Jelgava
|
Posted: Sun Jul 09, 2006 2:44 pm Post subject: |
|
ok skaidrs, thx |
|
Back to top |
|
|
|