PDA

Ver la Versión Completa : No logro cambiar el color de un Item lixbox


NEG1414
12-07-2007, 11:21:54
Buenas :
LLevo unos dias intentando cambiar el color de un item de un lixbos y no lo consigo.
He probado con la propiedad Canvas y na de na....
Si alguien lo ha logrado le agradeceria que me lo mostrara paso a paso

Gracias

Bicho
12-07-2007, 11:45:27
Hola,

¿has seguido lo que te comenté en éste (http://www.clubdelphi.com/foros/showthread.php?p=213276#post213276) hilo?
Quizá si pusieras el código que estás usando o más datos podríamos ver que está pasando.

Saludos

NEG1414
12-07-2007, 13:06:42
La verdad es que he mirado el ejemplo que me has dado y ciertamente nose como adaptarlo a mi problema:

El caso es que tengo una ListBox con una serie de nombres, esta lista la recorro para selecionar uno de los nombres.
Una vez seleccionado el nombre quiero que se me muestre en el Lixtbox pero como "DESACTIVADO" (cambiando el color del texto ..gris claro)

Creo que con ListBox.Canvas.Font.Color=clGreen podria hacerlo (no me funciona) Ademas como indico cual es el item que quiero modificar...

Espero Haberme Explicado Bien Gracias

Gabo
12-07-2007, 23:59:57
Creo que con ListBox.Canvas.Font.Color=clGreen podria hacerlo (no me funciona) Ademas como indico cual es el item que quiero modificar...


Creo que probablemente no has entendido bien el punto, a juzgar por el comentario. Esto lo tienes que programar en el evento OnCustomDrawItem. Yo lo he probado para controles ListView pero es lo mismo...


if (Item->SubItems[0][3]=="Hola"){
Sender->Canvas->Brush->Color=static_cast<TColor>(RGB(32,44,55)); }


En el ejemplo Item hace referencia al objeto de tipo TListItem que se está dibujando, si el tercer subitem es igual a "Hola", le cambia el color...

NEG1414
13-07-2007, 09:35:54
En primer lugar gracias Bicho por atender mi peticion

He seguido tus recomendaciones y me han surgido una seride de problemas

El Evento OnCustomDrawItem en Builder no Existe Pero Existe el Evento
DrawItem que supongo que es el mismo, he trabajado en este.

Mi primera duda es que los cambios deben de realizarse en tiempo de ejecucion, he comprobado que cada vez que selecciono un item del ListBox no se produce el Evento DrawItem con lo cual nuca se ejecuta el codigo que me has descrito.

Acontinuacion te explico un poco lo que quiero y como lo hago:

La idea es que al selecionar un item de un ListBox este se "Inhabilita" una de las consecuencias es que cambie de color..

Para ello he creado un vector booleano con numero de elmentos igual al de items asi cada vez que se selecciona un Item pongo la posicion que se corresponde en el vector a false. (Hata aqui todo bien)

En el Evento DrawItem he puesto la siguiente condicion:

if (VectorSeleccionados[Listbox1->ItemIndex] = false)
{
Listbox1->Canvas->Brush->Color = static_cast(....);
}

Al compilar pone error : Style of funtion definition is now obsolete

He probado con:

Listbox1->Canvas->Font->color = clGreen ;

no me da error.

Se te ocurre algo Gracias.

NEG1414
13-07-2007, 10:21:19
Yo otra vez:

He puesto la propiedad Style en OwerDrawFixed y se ha producido un cambio
Ahora si realiza el Evento DrawItem (se realiza cuando se activa el TLIstBox para cada item y tambien cada vez que realizo la seleccion de un item en particular ) pero sigo teniendo un problema
los items se muestran en el ListBox no se ven (son transparentes), estan
hay pero no se ven.


Gracias

roman
13-07-2007, 17:16:11
los items se muestran en el ListBox no se ven (son transparentes), estan
hay pero no se ven.

Cuando se usa un método de dibujo personalizado, como OwerDrawFixed, uno tiene que hacer todo, incluyendo el dibujado del texto y el fondo. En el ejemplo de Bicho, es justamente lo que se hace:


Canvas.FillRect(Rect); // <--- fondo
Canvas.TextOut(Rect.Left,Rect.Top,Items[Index]); // <--- texto


// Saludos

NEG1414
16-07-2007, 12:52:39
Por fin... Gracias Bicho

El resultado final adaptado a C++ Builder ha sido

if (VectorSeleccionados[Index]== false)

{
ListBox->Canvas->FillRect(Rect);
ListBox->Canvas->Font->Color=clGray;
ListBox->Canvas->TextOut->(Rect.Left,Rect.Top,ListBox->Items->
Strings[Index])

}

Todo Esto En el Evento DrawItem y con la propiedad Style en OwerDrawFixed

Gracias