[ tokajac @ 23.11.2007. 13:09 ] @
U StringGrid hocu da upisem i prikazem podatke o osobama.

Neke od osoba su pocinile 'krivicno delo' i hocu to da obelezim na neki nacin.
Ideja mi je da redove koji predstavljaju podatke prikazem u drugoj boji.
Da li i i kako je to izvodljivo?

Da li ima drugog predloga?
Kljucno mi je da korisnik aplikacije na neki nacin jasno vidi razliku izmedju reda u kome su upisani podatci o obicnoj osobi i specificnoj (kaznjenoj) osobi.

Hvala unapred!
Pozdrav!
[ lukeguy @ 23.11.2007. 13:46 ] @
Treba da CustomDraw staviš na true i da redefinišeš taj događaj tako
što napišeš kôd koji služi za crtanje tvojih ćelija. Da ne bi ručno
crtao svaku ćeliju možeš da ubaciš i neko grananje, pa za one ćelije
gde nema prilagođavanja pozivaš DefaultDraw, a za ove gde ima
izvršavaš sopstveni kôd. Ovo je dosta dokumentovano u Helpu, a
pogledaj i source za ovu komponentu, biće ti dosta korisno. U svakom
slučaju, nije velik posao samo pažljivo pročitaj dokumentaciju.
[ X Files @ 23.11.2007. 15:46 ] @
Ovde imaš ceo primer vezan za DefaulDrawing:
http://www.bcbjournal.org/bcbcaq/CAQs/caq48.htm

Interfejs događaja ti (pored ostalog) nudi ACol i ARow na osnovu kojih možeš da odreaguješ sa farbanjem.

P.S.
U primeru je umesto ARow stavljeno Row i umesto ACol stavljeno Col (stara verzija BCB-a).
[ tokajac @ 23.11.2007. 17:58 ] @
Hvala na izuzetno preciznim odgovorima!


Dosada sam sa dogadjajima u kodu radio:


Code:

  TMenuItem *itemPod = new TMenuItem(PopupMenu2);
   itemPod->OnClick = Dogadjaj;

.
.
.
.
Code:

void __fastcall TForm1::Dogadjaj(TObject *Sender)
{
....
}


------------------------------------------------------------------------------------------
Za ovaj slucaj mi treba:

Code:

  TMenuItem *itemPod = new TMenuItem(PopupMenu2);
   itemPod->OnClick = ????????????????;                      <--------------kako ide ovaj poziv





Code:

void __fastcall TUtakmica::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{


   StringGrid1->Canvas->Brush->Color = clBlue;
   StringGrid1->Canvas->Font->Color = clRed;
   StringGrid1->Canvas->FillRect(Rect);

   StringGrid1->Canvas->TextRect(Rect, Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);

}





Vidim da se dogadjaj obradi prilikom kreiranja forme (jel moze ovo da se zabrani?), ali meni je neophodno da ga explicitno pozovem.



Kako da pozovem ovaj obradjivac dogadjaja?
Kako da prosledim odgovarajuce parametre i koje?


[ X Files @ 23.11.2007. 20:50 ] @
DefaultDrawing se postavlja na false onda kada je potrebno napraviti poseban kod za iscrtavanje celija unutar OnDrawCell. E sad, ako me pamćenje dobro služi (nisam testirao) nije moguće prosto toggle-ovanje između true/false vrednosti ove osobine, odnosno izvršavanje default i posebnog koda, nešto kao:
Code:

ButtonClick
{
   StringGrid1->DefaultDrawing = ! StringGrid1->DefaultDrawing;

   if ( StringGrid1->DefaultDrawing == false )
   {
      StringGrid1->OnDrawCell = PosebnoStringGrid1DrawCell;
   }
   else
   {
      StringGrid1->OnDrawCell = NULL;
   }
}

(Ali ipak probaj, ne znam. Mislim da to nije moglo barem kod OwnerDrawn propertija nekih drugih komponenti)

Kad smo kod ovoga (to je valjda bio deo pitanja):
StringGrid1->OnDrawCell = PosebnoStringGrid1DrawCell;
... to se postiže ovako:
Code:

--- H ---
// public:
void __fastcall PosebnoStringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State);

--- CPP ---
void __fastcall TForm1::PosebnoStringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State)
{
   // ...
}

(Razlika između standardnog prototipa OnDrawCell i ovog je u jednom const uz TRect)

Ipak, mislim da ti nije neophodno switch-ovanje izmedju default i posebnog koda. Uzmi samo posebni deo koda i modifikuj ga tako da radi za oba slucaja, nesto kao:

Code:

void __fastcall TForm1::PosebnoStringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State)
{
   // ...
   if ( PosebanKod == true )
   {
      // farbaj linije
   }
   else
   {
      // nesto drugo, ili cak nista
   }
   // ...
}