Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Listbox con ultima linea añadida con diferente color (https://www.clubdelphi.com/foros/showthread.php?t=92715)

aguml 09-01-2018 15:02:39

Listbox con ultima linea añadida con diferente color
 
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:
Código PHP:

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:
Código PHP:

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:
Código PHP:

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

Cita:

Empezado por Angel.Matilla (Mensaje 523991)
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.


La franja horaria es GMT +2. Ahora son las 11:13:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi