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

Borland C++ Builder, Button, Image, OnKey… zafrkancija

[es] :: C/C++ programiranje :: Borland C++ Builder, Button, Image, OnKey… zafrkancija

[ Pregleda: 4165 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Borland C++ Builder, Button, Image, OnKey… zafrkancija11.12.2006. u 18:44 - pre 179 meseci
Ima li koja Borland C++ Builder komponenta da predstavlja dugme i da kao Event hendler moze da hendluje OnKey... dogadjaje a da se na nju moze staviti slicica (image)? Zna li ko ima li negdje na netu ili da nekako iskoristim neku Builderov-u komponentu?
Stvar je u tome sto hocu da napravim dugme (button) koji ce imati slicicu i na koji ce moci da se klikne misem ali i da se pozicionira na to dugme sa tasterom Tab i pritisne taster npr Enter i da se taj dogadjaj registruje.

- Bulder-ove komponente:
- Komponenta Button - ne moze se staviti slicica na nju
- Komponenta Speed Button - nema OnKey... event hendler (Ne mogu da vjerujem da su napravili Button komponentu koja nema OnKey... hendler.)
- Komponenta Image - nema OnKey... (Logicno mi, slika je, ali ovo iznad mi nije logicno.)
- Komponenta BitButton - Ima Glyph ali se ponasa veoma cudno kad se stavi slicica, ostavlja malo sivog prostora, kontam da je to zbog ovog Layout za Glyph, mislim da ovdje Glyph dodje kao neki dodatak dugmetu i da i nije predvidjeno da ga u potpunosti prekrije

Pozdrav.
Hvala.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

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

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija12.12.2006. u 10:51 - pre 179 meseci
Ako ti ne odgovara TBitBtn, onda treba "dosta" zaobilaznog posla.

Da se izvođenjem napravi OnKey...() za TImage, nije moguće, jer je TImage izvedena
iz TGraphicControl a ne iz TWinControl. Isto je i kod TSpeedButton. TButton je pod
kontrolom OS-a, i tu nema spasa.

Jedino što mi pada na pamet je da se napravi novi TPanel koji će imati OnKey...()
događaje. Kasnije treba pridružiti i TImage na taj Panel.

Nemam sad baš puno vremena da sve to rešavam, ali otprilike ovo je put:

Ovde uvodim OnKeyDown, OnKeyPress, i OnKeyUp.
--- H ---
Code:

class TNewPanel : public TPanel
{
private:

    void __fastcall MyKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
    void __fastcall MyKeyPress(TObject *Sender, char &Key);
    void __fastcall MyKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);

protected:

public:
    __fastcall TNewPanel(TComponent* Owner);
__published:

    __property OnKeyDown;
    __property OnKeyPress;
    __property OnKeyUp;
};


Dodat pointer na TNewPanel i konstruktor.
Code:

class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
      public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1();
        TNewPanel *pNewPanel;
};


--- CPP ---

Ovo je dovoljno da novi panel postane vidljiv.
Code:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   pNewPanel = new TNewPanel( this );
   pNewPanel->Parent = this;
   //  ovde možeš da menjaš osobine...
}

__fastcall TForm1::~TForm1()
{
   if ( pNewPanel )
      delete pNewPanel;
}


... ili u konstruktoru, da bude default.
Code:

__fastcall TNewPanel::TNewPanel(TComponent* Owner)
       : TPanel( Owner )
{
   Caption = "Proba";
   TabStop = true;
   OnKeyDown  = MyKeyDown;
   OnKeyPress = MyKeyPress;
   OnKeyUp    = MyKeyUp;
};


Ovde metode i ne moraju da budu deo TNewPanel-a. Ja sam ih stavio unutra
čisto reda radi.
Code:

void __fastcall TNewPanel::MyKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   Caption = "MyKeyDown";
}

void __fastcall TNewPanel::MyKeyPress(TObject *Sender, char &Key)
{
   Caption = "MyKeyPress";
}

void __fastcall TNewPanel::MyKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   Caption = "MyKeyUp";
}


... Dalje, treba implementirati postavljanje Bitmape na TNewPanel, ali sad sam
u velikoj gužvi.

 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
*.ns.ac.yu.



+6 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija12.12.2006. u 11:35 - pre 179 meseci
Pogledaj na netu o JEDI VCL.
Ta biblioteka sadrzi jako puno komponenti a i dosta dugmadi izmedju ostalog.
Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija14.12.2006. u 00:39 - pre 179 meseci
Citat:
X Files:

Jedino što mi pada na pamet je da se napravi novi TPanel koji će imati OnKey...()
događaje. Kasnije treba pridružiti i TImage na taj Panel.

...



Kod sam skontao ali ne kontam kako da Panel komunicira sa Image? Zar ih Borland nece tretirati kao nezavisne komponente?

Citat:
X Files:
... Dalje, treba implementirati postavljanje Bitmape na TNewPanel, ali sad sam
u velikoj gužvi.


Nije frka. Samo sam malo razmisljao o tome. Nije problem u samom radu na aplikaciji nego mi bilo i jos uvijek je nejasno zato u Borland-u nisu predvidjeli ovako nesto. BitButton ostavlja okvir koji se vidi. Vjerujem da ste probali.

I hvala obojici. Nije velika frka pa ako i ja skontam nesto (ko zna, i to je moguce :)), javicu.
Pozdrav
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

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

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija14.12.2006. u 09:11 - pre 179 meseci
Citat:

BitButton ostavlja okvir koji se vidi.

To misliš na onaj pravougaonik za fokus?

Ako je to onda se može rešiti.

--- H ---
Code:

class TMyBitBtn : public TBitBtn
{
  private:    // User declarations
  public:    // User declarations
        __fastcall TMyBitBtn(TComponent* Owner) : TBitBtn(Owner)
        {}
        void __fastcall WndProc(Messages::TMessage &Message);
};


--- CPP---
Code:

// ...
TBitBtn*   BitBtn1;
// ...
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

   BitBtn1 = new TMyBitBtn(this);
   BitBtn1->Parent  = this;
   BitBtn1->SetBounds( 0, 0, 100, 100 );
   BitBtn1->Glyph->LoadFromFile("C:\\windows\\winnt.bmp");
}
// ...
void __fastcall TMyBitBtn::WndProc( Messages::TMessage &Message )
{
   if (Message.Msg == WM_SETFOCUS)
       SendMessage(BitBtn1->Handle, WM_KILLFOCUS, Message.Msg, NULL);
   else
       TBitBtn::WndProc( Message );
}
// ...



[Ovu poruku je menjao X Files dana 14.12.2006. u 10:43 GMT+1]
 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija17.12.2006. u 14:23 - pre 179 meseci
Uspio sam da rijesim problem.
Posto je bilo male zabune u cemu je u stvari bio problem pojasnicu.
Meni je trebalo dugme na formi koje ima izgled kakav mu ja definisem tj. ima sliku na sebi, ima Tab order, dakle na njega se korisnik moze pozicionirati pritiskajuci taster Tab i reaguje na OnKey... event, dakle ako je korisnik pozicionira na njega i pritisne taster Enter (s tim trenutno imam manjih problema ali u nastavku) da se odradi neka akcija.
Suma, meni je trebao image koji iam Tab order i reaguje na OnKey... event. A komponenta TImage to ne moze.

Trebalo je malo dovijanja ali kad ne znas kako da isprogramiras svoju komponentu treba da se snalazis sa njegovim.
Iako sam probao, nije da nisam, da napravim svoju komponentu koja nasledjuje TButton i TImage i da sa TButton pokupim karakteristike Tab order i metodu OnKey..., tacnije event, ali mi nije uspijelo.
Gomila gresaka i svega...

E ovako sam to rijesio.
Napravio sam image koji reaguje na klik a zatim napravio jedno dugme (TButton) i stavio ga na taj image.
E sad posto windowed i non-windowed komponente (z-order) ne mogu jedne preko drugih onda mi je uvijek dugme bilo preko slike, dakle TButton je uvijek preko TImage.

Ali sam mu dohako!

Prvo sam probao da stavim dugme da je nevidljivo (Visibility = false) ali onda nemam reakciju na Tab taster, uopste ne reaguje.

A onda sam smanjio velicinu dugmeta na 0 x 0 piksela i onda se on ne vidi iako se nalazi preko TImage.
Pa ako je korisnik pritiskao Tab i pozicionirao se na to ,,nevidljivo'' dugme onda sam pozvao BringToFront() metodu za jednu drugu image koja je bila ispod ove prve i koja je imala iscrtan okvir, kao da je dugme selektovano.
Na sliku sam stavio da reaguju na OnClick... a na dugme kada se iscrta navodna selekcija sam stavio da reaguje na OnKey...
I tako sada postoji dugme sa slicicom koje reaguje na OnKey...

Pozdrav i hvala svima (a narocito X Files ) i srecno svima koji budu imali isti problem.

U ovom drugom postu sam vam pustio dio koda koji obradjuje ovo sve.
Ako se neko ne moze snaci neka mi posalje licnu poruku pa cu se javiti na javni i objasniti mada misli da nema sta da se shvata, sve je vrlo jednostavno.
 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija17.12.2006. u 14:26 - pre 179 meseci
imgURedu, imgOdustani... - TImage
btnSkrivenoDugmeURedu, btnSkrivenoDugmeOdustani... - TButton

Code:


void __fastcall TfrmPrijavljivanje::imgUReduMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 imgUReduPritisnuto -> BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::imgUReduMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 imgURedu -> BringToFront();
 Prijava();

 ModalResult = mrOk;
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::imgOdustaniMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 imgOdustaniPritisnuto -> BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::imgOdustaniMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
 imgOdustani -> BringToFront();
 // Zatvoriti aplikaciju
 // ModalResult = mrCancel
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeUReduKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
 if(Key == VK_SPACE)
  {
   Prijava();
   if(frmGlavnaForma -> prijavljen == false)
    edtKorisnickoIme -> SetFocus();
  }
 else
  {
   imgURedu -> BringToFront();
  }
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeUReduKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
 if(Key == VK_TAB)
  {
   imgUReduSelektovano -> BringToFront();
   imgUReduSelektovano -> BringToFront();
  }
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeUReduExit(TObject *Sender)
{
 imgURedu -> BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeOdustaniKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
 if(Key == VK_TAB)
  imgOdustani -> BringToFront();
 //if(Key == VK_SPACE)
  // Zatvoriti aplikaciju
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeOdustaniKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
 if(Key == VK_TAB)
  {
   imgOdustaniSelektovano -> BringToFront();
   imgOdustaniSelektovano -> BringToFront();
  }
}
//---------------------------------------------------------------------------
void __fastcall TfrmPrijavljivanje::btnSkrivenoDugmeOdustaniExit(TObject *Sender)
{
 imgOdustani -> BringToFront();
}
//---------------------------------------------------------------------------

 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija17.12.2006. u 14:29 - pre 179 meseci
Da, zamalo da zaboravim.

Uoste mi nece da reaguje na pritisak na taster Enter kada stavim:


Code:
 if(Key == VK_RETURN)  { //akcija } 


Iako u Help-u pise da je VK_RETURN virtual key tastera Eneter.

Kad stavim VK_SPACE radi normalno.

Jel se kome desilo ovako nesto?
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
81.18.61.*



+1 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija18.12.2006. u 14:36 - pre 179 meseci
@X-Files

Code:
__fastcall TForm1::~TForm1()
{
   if ( pNewPanel )
      delete pNewPanel;
}


Nije potrebno ako si koristio:

Code:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   pNewPanel = new TNewPanel( this );
   pNewPanel->Parent = this;
   //  ovde možeš da menjaš osobine...
}


Sa postavljanjem AOwner-a u konstruktoru VCL komponente dodajes je u stablo i prilikom destrukcije
svaki parent brise svoje child-ove ...

To je potrebno raditi samo u slucaju:

Code:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   pNewPanel = new TNewPanel( NULL ); // <- parentless kontrole ...
   pNewPanel->Parent = this;
   //  ovde možeš da menjaš osobine...
}



@vula

Neki tasteri se parsiraju u OnKey eventu a neki u OnKeyDown ...

VK_ kodovi idu u OnKeyDown/OnKeyUp a ako imas potrebu za enterom onda:

Code:

  if(Key==0x13){
    // do your thing here :)
  }


u OnKey ...
 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija18.12.2006. u 23:34 - pre 179 meseci
Hvala!
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

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

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija19.12.2006. u 15:43 - pre 179 meseci
Citat:

Sa postavljanjem AOwner-a u konstruktoru VCL komponente dodajes je u stablo i prilikom destrukcije
svaki parent brise svoje child-ove ...

Naravno. Nisam to ranije pominjao da ne bih unosio zabunu, ali evo dobro je da si napomenuo.

Doduše, ja lično uvek vodim računa da implementiram i uništavanje objekata, mada je VCL takav da se se child objekti uništavaju automatski.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

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

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija19.12.2006. u 21:30 - pre 179 meseci
Tek sad videh ovaj kod:
Citat:

To je potrebno raditi samo u slucaju:
Code:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   pNewPanel = new TNewPanel( NULL ); // <- parentless kontrole ...
   pNewPanel->Parent = this;
   //  ovde možeš da menjaš osobine...
}



Ne. Čak ni ovde nije potrebno direktno uništavati pNewPanel iako je Owner = NULL. Ovo nije jasno dokumentovano,
a bitno je zbog nekih komponenti tipa TTable i TOpenDialog i sl. (sve se moze proveriti u destruktorima osnovnih klasa TWinControl, ...)

Evo i dokaz:
Code:

class TNoviButton : public TButton
{
public:
    __fastcall TNoviButton(TComponent* owner) : TButton(owner) {}
    __fastcall ~TNoviButton()
    {
        ShowMessage( "Novi taster je unisten!" );
    }
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TForm *NovaForma = new TForm( (TComponent *)0 );
    TNoviButton *pTaster = new TNoviButton( (TComponent *)0 ); // <--- NEMA VLASNIKA
    pTaster->Parent = NovaForma; // <--- OVO JE DOVOLJNO DA BI OBJEKAT USAO U LISTU ZA ODSTREL

    delete NovaForma; <-- IAKO NEMA VLASNIKA, DESTRUKTOR ~TNoviButton() CE BITI POZVAN
}


Doduse, ja i dalje ostajem pri svome - sam voditi racuna o svojim kreiranim objektima.



[Ovu poruku je menjao X Files dana 19.12.2006. u 22:51 GMT+1]
 
Odgovor na temu

Duke Nukem
Miroslav Mitic
dipl.mas.ing - tehnolog za hidrauliku/
REL, MAG panciranje i zavarivanje bla
bla...
Lazarevac

Član broj: 38933
Poruke: 143
*.absolutok.net.



+1 Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija20.12.2006. u 13:02 - pre 179 meseci
Citat:
vula:

Trebalo je malo dovijanja ali kad ne znas kako da isprogramiras svoju komponentu treba da se snalazis sa njegovim.
Iako sam probao, nije da nisam, da napravim svoju komponentu koja nasledjuje TButton i TImage i da sa TButton pokupim karakteristike Tab order i metodu OnKey..., tacnije event, ali mi nije uspijelo.
Gomila gresaka i svega...


Ne bi da pametujem samo da se nadovezem VCL ne dozvoljava višestruko nasleđivanje.
Imapersivne akrobacije, Vulo jel to još onaj projekat baze podtaka za prodavnicu automobila nije gotov ?

Tape loading error
 
Odgovor na temu

vula

Član broj: 119166
Poruke: 119
*.teol.net.



Profil

icon Re: Borland C++ Builder, Button, Image, OnKey… zafrkancija21.12.2006. u 00:06 - pre 179 meseci
Citat:
Duke Nukem: Ne bi da pametujem samo da se nadovezem VCL ne dozvoljava višestruko nasleđivanje.
Imapersivne akrobacije, Vulo jel to još onaj projekat baze podtaka za prodavnicu automobila nije gotov ?


A pitao sam se da li se mogu izvesti visestruka nasljedjivanja.
Hvala.

Ma jok druze nasao sam novu zanimaciju. Mnogo konkretnijeg i normalnijeg klijenta. Mada je manja aplikacija ali za pocetak je odlicno. Onako, raduckam, strebam trenutno PRS pa polako.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Borland C++ Builder, Button, Image, OnKey… zafrkancija

[ Pregleda: 4165 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

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