CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TImage w CategoryButtons

TImage w CategoryButtons

dział ogólny

TImage w CategoryButtons

Nowy postprzez usermaw » poniedziałek, 15 listopada 2010, 23:27

Witam Was kochani po dłuższej przerwie

Natknąłem się na problem, o którym niemal nic w necie nie ma.
Mianowicie, dynamiczny TImage w CategoryButtons.

KOD cpp:     UKRYJ  
obraz = new TImage(Form1);
obraz->Parent = Form1;
obraz->Picture->LoadFromFile( "aaa.bmp" );
obraz->Top = 408;
obraz->Left = 128;
Nie problem w obrazku. Jak ów obrazek wstawić w konkretne miejsce CategoryButtons.
Np.:

KOD cpp:     UKRYJ  
BUTTONY->Categories->Items[1]->Items->Items[1];


Jeśli powyższy kod wstawię jako rodzić dla obraz TImage, niestety jest blad.
Czy w ogóle jest możliwe wstawienie czegos w CategoryButtons do konkretnego przycisku w danej grupie?

Serdecznie pozdrawiam :-)
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox

Re: TImage w CategoryButtons

Nowy postprzez Cyfrowy Baron » wtorek, 16 listopada 2010, 10:18

Narysować oczywiście można, pytanie tylko po co rysować skoro można posłużyć się obiektem TImageList. Przygotowujesz sobie obrazki do TImageList, nie muszą to być ikony, mogą być bitmapy o dowolnym rozmiarze, ale wszystkie w jednym rozmiarze. Ustalasz wymiary ImageList1 na wymiary obrazków i ładujesz do nich. Potem we właściwości Images obiektu CategoryButton1 wybierasz ImageList1, a w poszczególnych kategoriach TButtonCategories w utworzonej kolekcji TButtonCollection we właściwości ImageIndex poszczególnych Button'ów wybierasz który obrazek ma być wyświetlany.
Ta metoda jest najprostsza, gdyż nie wymaga rysowania grafiki, ani tekstu.

Jeżeli zdecydujesz się jednak robić to swoją metodą, to powinieneś wiedzieć, że TCategoryButton jest zhermetyzowany i nie masz dostępu do jego klasy TCanvas z zewnątrz. Sam obiekt udostępnia jednak zdarzenie OnDrawButton i to w tym zdarzeniu należy rysować:

KOD cpp:     UKRYJ  
void __fastcall TForm1::CategoryButtons1DrawButton(TObject *Sender,
        const TButtonItem *Button, TCanvas *Canvas, TRect &Rect, TButtonDrawState State)

{
 if(Button->ID == 2)
 {
  Graphics::TBitmap *bImg = new Graphics::TBitmap();
  bImg->LoadFromFile( ExtractFilePath( ParamStr(0) )  + "images\\progress1.bmp");

  Canvas->Draw(Rect.left, Rect.top, bImg);
  delete bImg;
 }
}


To jednak stwarza pewne problemy. Zdarzenie nie udostępnia żadnego argumentu rozróżniającego w której kategorii chcemy rysować grafikę na buttonach więc w efekcie rysowanie odbywa się na buttonach określonych przez Button->ID, ale we wszystkich kategoriach. Nie znalazłem żadnej metody pozwalającej na rozróżnianie kategorii w tym zdarzeniu, ale nawet gdyby sam CategoryButton1 udostępniał taką metodę to oczywiście nic nie da, gdyż rozróżnianie kategorii musi odbywać się poprzez argumenty funkcji OnDraw.
Kolejny problem, to po użycie zdarzenia OnDraw etykiety Buttonów nie będą wyświetlane, trzeba je wiec ponownie odrysować, robimy to w tym samym zdarzeniu:


KOD cpp:     UKRYJ  
void __fastcall TForm1::CategoryButtons1DrawButton(TObject *Sender,
        const TButtonItem *Button, TCanvas *Canvas, TRect &Rect, TButtonDrawState State)

{
 Canvas->Brush->Style = bsClear;
 if(Button->ID == 2)
 {
  Graphics::TBitmap *bImg = new Graphics::TBitmap();
  bImg->LoadFromFile( ExtractFilePath( ParamStr(0) )  + "images\\progress1.bmp");

  Caption = (String)bImg->Width;

  Canvas->Draw(Rect.left, Rect.top, bImg);
  Canvas->TextOut(Rect.left  + bImg->Width + 5, Rect.top, Button->Caption);
  delete bImg;
 }
 else
 {
   Canvas->TextOut(Rect.left, Rect.top, Button->Caption);
 }
}


Użycie TImageList rozwiązuje wszystkie te problemy i jest najprostsza metoda.



Czy w ogóle jest możliwe wstawienie czegos w CategoryButtons do konkretnego przycisku w danej grupie?


Nie można tam niczego wstawić. Przyciski nie posiadają własnej powierzchni, nie posiadają również metody Parent. Te przyciski są po prostu rysowane na CategoryButtons.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImage w CategoryButtons

Nowy postprzez usermaw » niedziela, 21 listopada 2010, 11:40

O TImageList wiem, chciałem pokombinować z kilkoma sztuczkami.
Używam Turbo, nie mam tak ladnego komponentu jak, chyba się nazywa CategoryPanel, w nowszych komercyjnych wersjach.
Ale dzieki za odpowiedz :-)

pozdro
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox

Re: TImage w CategoryButtons

Nowy postprzez Cyfrowy Baron » niedziela, 21 listopada 2010, 12:00

Różnica między TCategoryButton i TControlPanel jest raczej duża, w pierwszym przypadku masz panel z przyciskami, a w drugim panel z innymi zwijanymi panelami.

TCategoryPanel
controlpanel.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TImage w CategoryButtons

Nowy postprzez usermaw » niedziela, 21 listopada 2010, 18:10

Niestety duza, ale CategoryPanel to wspanialy komponent. Chyba warto posiedziec i samemu jakos sklecic z czesci
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości