Musisz stworzyć warunek dokładnie określający, które komórki są kolorowane, czyli np:
jeżeli to kolumna 2 to ustaw kolor na żółty, a jeżeli nie to na biały
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender,
TListItem *Item, int SubItem, TCustomDrawState State, bool &DefaultDraw)
{
if(SubItem == 2)
{
ListView1->Canvas->Brush->Color = clYellow;
}
else
{
ListView1->Canvas->Brush->Color = clWhite;
}
}
Musisz dodać warunek else. By jednak nie określać zawsze warunku, szczególnie, gdy tych kolorowanych kolumn jest wiele, lepiej posłużyć się blokiem
switch:
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item,
int SubItem, TCustomDrawState State, bool &DefaultDraw)
{
switch(SubItem)
{
case 2: ListView1->Canvas->Brush->Color = clYellow; break;
default: ListView1->Canvas->Brush->Color = clWhite; break;
}
}
Jeżeli nie chcemy kolorować całej kolumny, a jedynie wybraną komórkę, to należy jeszcze określić numer wiersza w którym ta komórka ma być kolorowana:
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item,
int SubItem, TCustomDrawState State, bool &DefaultDraw)
{
if(Item->Index == 1)
{
switch(SubItem)
{
case 2: ListView1->Canvas->Brush->Color = clYellow; break;
default: ListView1->Canvas->Brush->Color = clWhite; break;
}
}
}
Tutaj również możemy użyć
switch:
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item,
int SubItem, TCustomDrawState State, bool &DefaultDraw)
{
switch(Item->Index)
{
case 1:
{
switch(SubItem)
{
case 2: ListView1->Canvas->Brush->Color = clYellow; break;
default: ListView1->Canvas->Brush->Color = clWhite; break;
} break;
}
}
}
No i na koniec bardziej złożony przykład:
void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender, TListItem *Item,
int SubItem, TCustomDrawState State, bool &DefaultDraw)
{
switch(Item->Index)
{
case 1:
{
switch(SubItem)
{
case 1: ListView1->Canvas->Brush->Color = clGreen; break;
case 2: ListView1->Canvas->Brush->Color = clYellow; break;
default: ListView1->Canvas->Brush->Color = clWhite; break;
}
} break; /* WAŻNE!!! } break; */
case 2:
{
switch(SubItem)
{
case 1: ListView1->Canvas->Brush->Color = clRed; break;
case 2: ListView1->Canvas->Brush->Color = clMaroon; break;
default: ListView1->Canvas->Brush->Color = clWhite; break;
}
} break; /* WAŻNE!!! } break; */
}
}
Co się tyczy drugiego problemu to nie widzę na to sposobu, gdyż zdarzenie
OnCustomDrawSubItem nie zwraca żadnego uchwytu do obszaru komórki, więc nie da się tam nic narysować.
Jedyne rozsądne wyjście to zabawa z ikonkami, czyli można w ImageList umieścić ikony reprezentujące paski postępu i zmieniać indeksy ikon dla wybranego SubItem. To oczywiście pociąga za sobą kolejne problemy, gdyż w komórce z takim progressbarem nie może być tekstu, a i tekst w kolumnie głównej zostanie przesunięty względem długości ikony.
Przypuszczam, że chcesz zrobić to co można czasami spotkać w różnych programach, tyle, że tam na ogół nie jest wykorzystywany komponent TListView, lecz
SysListView32.
Takie progressbary ma już wbudowane np. komponent
TAdvListView z komercyjnej paczki
TMS Component Pack.