Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Detekcija KeyPress-a za SPACE

[es] :: C/C++ programiranje :: Detekcija KeyPress-a za SPACE

[ Pregleda: 2979 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tokajac

Član broj: 93240
Poruke: 123
*.dynamic.sbb.co.yu.



+5 Profil

icon Detekcija KeyPress-a za SPACE08.02.2008. u 12:45 - pre 197 meseci
Koristim TTimer komponentu, koju kontrolishem preko bool promenjive stop.

Imam dugme za play (stop = false) i za stop(stop = true). Sve radi cool.

Hocu da prebacim kontrolu na SPACE. Za pocetak mi je dovoljno da se na SPACE dogadja samo zaustavljanje stopwatch-a.
Prakticno mi treba:

Code:

  void __fastcall TUtakmica::FormKeyPress(TObject *Sender, char &Key)
  {
    if( Key ==VK_SPACE )
      stop = true;
  }




Ovo sam i ubacio u aplikaciju, medjutim, chim fokus predje na bilo koje dugme sa forme pritiskom na SPACE okidam to dugme, a stop promenjiva se ne menja. Meni treba promena stop-a a dugme da "ostavim na miru".


Treba mi reshenje koje ce uvek raditi, jer je kontrola vremena kljucna.

Koja treba da je vrednost KeyPreview-a na formi?

Josh jedno pitanje:
Kako je izvodljivo da se otvori josh jedna forma(pritiskom na neko dugme), a da se klikom na SPACE i dalje menja stop promenjiva na Parent formi?


Pozdrav!
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Detekcija KeyPress-a za SPACE08.02.2008. u 13:28 - pre 197 meseci
Citat:

Ovo sam i ubacio u aplikaciju, medjutim, chim fokus predje na bilo koje dugme sa forme pritiskom na SPACE okidam to dugme, a stop promenjiva se ne menja. Meni treba promena stop-a a dugme da "ostavim na miru".

Uklanjanje standardne Windowsove SPACE funkcionalnosti tastera (OnClick) je moguce na par nacina:

* Recimo, jedan nacin je da napravis svoj TButton (nasledjivanjem) pri cemu ces u WndProc hvatati SPACE i ubijati ga.
* Drugi nacin je dinamickim menjanjem TButton::WindowProc

Na primer /netestirano/:

--- header ---
Code:

// ...
TWndMethod OldButtonWP;
void __fastcall NewButtonWP(TMessage &Msg);
BEGIN_MESSAGE_MAP
   MESSAGE_HANDLER(CM_DIALOGKEY, TMessage, NewButtonWP)
END_MESSAGE_MAP(TForm)
// ...

--- cpp ---
Code:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    OldButtonWP = Button1->WindowProc; 
    Button1->WindowProc = NewButtonWP;
}
void __fastcall TForm1::NewButtonWP( TMessage &Msg ) 

    switch ( Msg.Msg ) 
    { 
        case WM_KEYDOWN: 
        { 
            if ( Msg.WParam == VK_SPACE ) 
            { 
                Msg.Result = 0; 
                return; 
            } 
            break; 
        } 
        case WM_DESTROY: 
        { 
            Button1->WindowProc = OldButtonWP; 
            break; 
        } 
    } 
    OldButtonWP( Msg ); 



Citat:

Treba mi reshenje koje ce uvek raditi, jer je kontrola vremena kljucna.

Ovo gore bi trebalo da ti pomogne oko SPACE-a, mada TTimer je message bazirana, pa ako je kontrola vremena kljucna moze se desiti da ceo sistem ponekad zaglavi na trenutak ako se zbog necega message queue zatrpa.

Citat:

Koja treba da je vrednost KeyPreview-a na formi?

U tvom slucaju: true, jer TForm::OnKeyPress ne bi reagovao ako ti je kursor recimo privremeno u TEdit-u, i sl.

Citat:

Kako je izvodljivo da se otvori josh jedna forma(pritiskom na neko dugme), a da se klikom na SPACE i dalje menja stop promenjiva na Parent formi?

Nista te ne sprecava da isti kod imas i u drugim formama pri cemu 'gadjas' TTimer od prve Form1->Timer1->.... Prethodno naravno treba #include ... te glavne forme u parent formama.


 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
*.dynamic.sbb.co.yu.



+5 Profil

icon Re: Detekcija KeyPress-a za SPACE08.02.2008. u 14:44 - pre 197 meseci

Exception: EStackOverflow 'Stack Overflow'


Dakle, ne radi.
Ukoliko ima TESTIRANIH kodova na ovu temu, molim vas da postujete.


Inace, je ideja upravo ono sto trazim. Hvala X Files!

Josh je neophodno popraviti je, pa se nadam da je to to.


 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Detekcija KeyPress-a za SPACE08.02.2008. u 15:43 - pre 197 meseci
Hm, evo sad sam probao (na jednostavnom primeru) i kod mene radi!

Evo ceo kod (stavio sam i kao Attachment):
--- H ---
Code:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormKeyPress(TObject *Sender, char &Key);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);

        TWndMethod OldButtonWP;
        void __fastcall NewButtonWP(TMessage &Msg);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


--- CPP ---
Code:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   OldButtonWP = Button1->WindowProc;
   Button1->WindowProc = NewButtonWP;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage( "Zdravo!" );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewButtonWP( TMessage &Msg ) 
{
    switch ( Msg.Msg )
    {
        case WM_KEYDOWN:
        {
            if ( Msg.WParam == VK_SPACE )
            {
                Msg.Result = 0;
                return;
            }
            break;
        }
        case WM_DESTROY:
        {
            Button1->WindowProc = OldButtonWP;
            break;
        }
    }
    OldButtonWP( Msg );
}

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
   if ( Key == VK_SPACE )
   {
      if ( Caption != "Start")
         Caption = "Start";
      else
         Caption = "Stop";
   }
}
//---------------------------------------------------------------------------

P.S.
Koji BCB koristiš i da li si primenio Update-ove ?

EDIT:
Uklonio sam MESSAGE_MAP!



[Ovu poruku je menjao X Files dana 08.02.2008. u 17:07 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
*.dynamic.sbb.co.yu.



+5 Profil

icon Re: Detekcija KeyPress-a za SPACE08.02.2008. u 18:50 - pre 197 meseci
Radi!

U ovom principu vidim sledeci problem:
da bi kontrola funkcionisala u potpunosti, potrebno je da fokus bude UVEK na (kod mene) dodatno ubachenom dugmetu, Button1 ili da za svako dugme stavim ovaj Space-detect.
Kod mene je forma popunjena ComboBoxovima, RadioButtonima i Buttonima; imam oko 20 'vakih item-a.


Da li da nakon svake akcije na formi stavljam fokus na Button1 ili ima i elegantnije resenje?


Pozdrav!



 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Detekcija KeyPress-a za SPACE08.02.2008. u 19:05 - pre 197 meseci
Ta selekcija sa SPACE je Windows-ov feature i sumnjam da postoji neki elegantan način koji bi ga automatski onemogućio.

Definitivno za svaki taster (i druge kontrole) treba da postoji kod. Jedino da se napravi novo dugme (izvodjenjem), pa da se dugmad dinamicki kreiraju, ali i to je 'posao'.

Sve zavisi od tvog interfejsa.

Možda da probaš sa nekim Panelom koji će sadržati sve te kontrole osetljive na SPACE i da malo pogledaš TabStop property. Takođe, preusmeravanje fokusa može pomoći. Možda da implementiraš i neki Enabled/Disabled mod, gde će kontrole biti aktivne tek kad im se kaže.

 
Odgovor na temu

[es] :: C/C++ programiranje :: Detekcija KeyPress-a za SPACE

[ Pregleda: 2979 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.