PDA

Ver la Versión Completa : Listbox con ultima linea añadida con diferente color


aguml
09-01-2018, 15:02:39
Hola amigos, estoy con una aplicacion la cual tiene un ListBox para mostrar una especie de log el cual si hay un error lo mostraria en rojo, si hay alguna alerta en naranja y si fue bien en verde. La idea es que vayan apareciendo lineas y cada una de su color pertinente y hasta ahora tengo esto:
Donde controlo el dibujado del listbox:
void __fastcall TForm1::ListBoxLogDrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
// eliminate artifacts
ListBoxLog->Canvas->FillRect(Rect);

// Compruebo si es la ultima linea
if (Index == ListBoxLog->Items->Count - 1) {
// Color del texto que deseo para la ultima linea
ListBoxLog->Canvas->Font->Color = colorListBoxLog;
}else{
}
// dibujo el texto
ListBoxLog->Canvas->TextOut(Rect.Left + 1, Rect.Top,ListBoxLog->Items->Strings[Index]);
}

Uno de los que insertan una linea en el ListBox:
void __fastcall TForm1::ButtonUpdateFirstLayerClick(TObject *Sender)
{
//Aqui ya habria que desencriptarlo
if(Actualizar()==-1){
colorListBoxLog = clRed;
ListBoxLog->Items->Add("Hubo un error al actualizar.");
}else{
colorListBoxLog = clRed;
ListBoxLog->Items->Add("Se ha actualizado correctamente.");
ListBoxLog->TopIndex = ListBoxLog->Items->Count - 1;
}
}
El problema que tengo es que me colorea bien el primero pero si inserto otra linea esa me la colorea bien pero el resto de lineas no me respeta el color que tenia y todas me las pone de negro. ¿como seria para que me respete el color de las que ya estaban?

_Leo
09-01-2018, 22:30:16
Hola, aprovechando que se puede asociar un puntero TObject* a cada elemento, podrías hacer una chapucilla así para que cada elemento mantenga asociado su color:
void __fastcall TForm1::ListBoxLogDrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
ListBoxLog->Canvas->FillRect(Rect);
ListBoxLog->Canvas->Font->Color = (TColor)ListBoxLog->Items->Objects[Index];
ListBoxLog->Canvas->TextOut(Rect.Left + 1, Rect.Top, ListBoxLog->Items->Strings[Index]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonUpdateFirstLayerClick(TObject *Sender)
{
// Al añadir un elemento especificamos el color:
ListBoxLog->Items->AddObject("Rojo", (TObject*) clRed);
ListBoxLog->Items->AddObject("Naranja", (TObject*) RGB(255,165,0));
ListBoxLog->Items->AddObject("Verde", (TObject*) clGreen);
}

aguml
10-01-2018, 10:12:42
Muy interesante :eek: Actualmente me quedé sin pc pero en cuanto lo tenga funcionando lo probaré y te diré que tal va. Muchas gracias.

Angel.Matilla
10-01-2018, 11:15:49
Una buena alternativa al uso de un TListBox es un TListView, aunque SEGURO que el código de Leo funciona a la perfección.

aguml
10-01-2018, 13:07:27
Una buena alternativa al uso de un TListBox es un TListView, aunque SEGURO que el código de Leo funciona a la perfección.
¿Que ventajas hay al usar un TListView? O sea me refiero a que qué me aporta el TListView que el TListBox no haga.

aguml
16-01-2018, 12:35:00
Gracias _Leo, fue perfecto.