Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   palabras con distintos colores en listbox (https://www.clubdelphi.com/foros/showthread.php?t=19915)

Renees 31-03-2005 00:01:31

palabras con distintos colores en listbox
 
Hola buenas. Para todos.

Bueno mi consulta es para saber como puedo hacer para que en un lisbox tenga cada palabra con distintos colores Ej:


1 Rene - Contador
2 Pedro - Auxiliar credito
3 Juan - Piloto

Asi quisiera que me quede mi listbox. Bueno desde ya muchas gracias y hasta luego.

Neftali [Germán.Estévez] 31-03-2005 10:02:42

Coloca en un Form un ListBox.
Añade a la propiedad item las cdenas que comentas.
Modifica la propiedad Style a lbOwnerDrawVariable
En el evento OnDrawItem programa lo siguiente.

Código Delphi [-]
 procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
   Rect: TRect; State: TOwnerDrawState);
 var
   Str, Str1, Str2:String;
   p:Integer;
   w1, w2:Integer;
   ARect:TRect;
 begin
 
   // Cadena
   Str := ListBox1.Items[Index];
   //  Posicion del Guión
   p := Pos('-', Str);
 
   // Si el guión no está => nada...
   if (p = 0) then begin
     ListBox1.Canvas.TextRect(Rect, 0, 0, Str);
   end
   else begin
     // Calculamos las subcadenas
     Str1 := Copy(Str, 1, P - 1);
     Str2 := Copy(Str, P, Length(Str));
   end;
 
   // Calcular dimensiones de ambas
   w1 := ListBox1.Canvas.TextWidth(Str1);
   w2 := ListBox1.Canvas.TextWidth(Str2);
 
   // pintamos la primera parte
   ListBox1.Canvas.Font.Color := clRed;
   ListBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Str1);
 
   // Dibujamos el segundo
   ARect := Rect;
   ARect.Left := aRect.Left + w1;
   ListBox1.Canvas.Font.Color := clBlue;
   ListBox1.Canvas.TextRect(aRect, aRect.Left, aRect.Top, Str2);
 end;

NOTA: Se basa en que hay un guión para separar ambas partes; Si no lo hay, no pintará nada.

Renees 31-03-2005 16:16:00

Item selecionado en Listbox en Color Verde
 
Hola Buenas para todos.

Queria Agradecer a Neftali, por la repuesta tan eficiente, muchas gracias. Anda a la perfeccion la combinacion de colores.

Una Consulta mas.
Como hago para que El item del Listbox Seleccionado en ves tener el color predeterminado (azul), salga un color verde.

Desde ya muchas Gracias.

Neftali [Germán.Estévez] 31-03-2005 16:39:41

Añade éste cambio al pricipio del procedimiento:

Código Delphi [-]
 begin
   // Cambiar el color de los selccionados
   if (odSelected in State) then begin
     ListBox1.Canvas.Brush.Color := clGreen;
   end;
 
 ...

Renees 31-03-2005 18:00:38

borde de Listbox seleccionado de otro color
 
Hola Neftaldi, La ultima Consulta si seria posible, Como Hago para El color del Borde del Item seleccionado del Listo, para cambiar color, Perdon por Abuzar de tu sabiduria, Y si seria posible de donde puedo conseguir manuales para enternder el canvas. Desde Millones de gracias

Neftali [Germán.Estévez] 01-04-2005 12:20:56

Cita:

Empezado por Renees
Hola Neftaldi, La ultima Consulta si seria posible, Como Hago para El color del Borde del Item seleccionado del Listo, para cambiar color, Perdon por Abuzar de tu sabiduria, Y si seria posible de donde puedo conseguir manuales para enternder el canvas. Desde Millones de gracias

Creo que ese color, al igual que la forma de pintar el borde (discontinuo) ya no es tan sencillo ya que ese coge lo definido en el sistema, y habría que realizar el repintado cuando hay un elemento seleccionado, cosa que ya no es trivial.
En cuanto al canvas, puees echarle un vistazo a la ayuda de Delphi, o a cualquier manual en los capítulos que te hablen de gráficos.

roman 01-04-2005 19:04:26

Inmediatamente después de

Código Delphi [-]
if (odSelected in State) then begin
  ListBox1.Canvas.Brush.Color := clGreen;
end;

intenta colocar este código

Código Delphi [-]
if odFocused in State then
begin
  ListBox1.Canvas.Brush.Style := bsClear;

  ListBox1.Canvas.Pen.Style := psDot;
  ListBox1.Canvas.Pen.Color := clRed;
  ListBox1.Canvas.Rectangle(Rect);

  DrawFocusRect(ListBox1.Canvas.Handle, Rect);
end;

Las tres líneas centrales pintarán un borde punteado de color rojo y la última línea borra el borde punteado por defecto.

Si omiten las líneas centrales simplemente evitarán el borde punteado que quizá es lo que se desee.

// Saludos

Neftali [Germán.Estévez] 04-04-2005 09:22:14

Cita:

Empezado por Neftali
...ya no es tan sencillo...

Pues sí era sencillo.:D:D:D
Gracias Román.

Elfoscuro 05-04-2005 12:33:39

Una duda...

¿Por qué no pinta nada cuando no hay guión?

Yo he modificado el código original incluyendo todo dentro del else (p=0), y así me pinta una vez, pero no las demás. Es decir:

Código:

  Str := ListBox1.Items[Index];
  p := Pos('-', Str);
  if (p = 0) then
          begin
                ListBox1.Canvas.TextRect(Rect, 0, 0, Str);
          end
        else
          begin
                Str1 := Copy(Str, 1, P - 1);
                Str2 := Copy(Str, P, Length(Str));
                w1 := ListBox1.Canvas.TextWidth(Str1);
                w2 := ListBox1.Canvas.TextWidth(Str2);
                ListBox1.Canvas.Font.Color := clRed;
                ListBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Str1);
                ARect := Rect;
                ARect.Left := aRect.Left + w1;
                ListBox1.Canvas.Font.Color := clBlue;
                ListBox1.Canvas.TextRect(aRect, aRect.Left, aRect.Top, Str2);
          end;

Además en el form tengo un edit y un button, y en el evento onclick del button pongo:

Código:

  ListBox1.Items.Add(Edit1.Text);
Vale, si en el edit dejo el text que sale (Edit1) y le doy al botón, me lo pinta en negro, pero solo la primera vez. Después salen líneas en blanco... Eso no es normal, ¿no? Al fin y al cabo la primera parte del if me lo pintaría si no hubiera guiones, ¿no?

No lo entiendo...

Saludos del elfo

Neftali [Germán.Estévez] 05-04-2005 13:30:40

Cita:

Empezado por Elfoscuro
Una duda...¿Por qué no pinta nada cuando no hay guión?

Porque éste ejemplo pintaba lo de antes del guión en un color y lo de después del guión en otro color. Esa era la premisa.

Cita:

Empezado por Elfoscuro
...Yo he modificado el código original incluyendo todo dentro del else (p=0), y así me pinta una vez, pero no las demás...

Esa modificación creo que no es correcta.
¿Exactamente cómo quieres pintar letra de un color y de otro? ¿Cual es el criterio a seguir? En el ejemplo expuesto era utilizando el guión, en tu caso no me queda claro lo que necesitas.

Elfoscuro 05-04-2005 21:08:22

Cita:

Citar:
Originalmente publicado por Elfoscuro
Una duda...¿Por qué no pinta nada cuando no hay guión?

Porque éste ejemplo pintaba lo de antes del guión en un color y lo de después del guión en otro color. Esa era la premisa.
Citar:
Originalmente publicado por Elfoscuro
...Yo he modificado el código original incluyendo todo dentro del else (p=0), y así me pinta una vez, pero no las demás...
Esa modificación creo que no es correcta.
¿Exactamente cómo quieres pintar letra de un color y de otro? ¿Cual es el criterio a seguir? En el ejemplo expuesto era utilizando el guión, en tu caso no me queda claro lo que necesitas.

Simplemente estaba jugando con el código que se puso. Intenté que si no había guión se pintara la string en tinta negra en lugar de tinta de dos colores. Para hacer eso, mi código es correcto, ¿no? El tema es que falla, me dibuja bien la primera línea, pero no las demás. Sin embargo si pongo un guión, si que pinta de colores como toca. Pero del color negro nunca más se supo. En su lugar consigo muchas líneas en blanco.

No se si me explico.

Saludos del elfo

jachguate 05-04-2005 22:38:07

El error está aqui:

Código Delphi [-]
  ListBox1.Canvas.TextRect(Rect, 0, 0, Str);
  // el código correcto debiera ser:
  ListBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Str);

Hasta luego.

;)

Neftali [Germán.Estévez] 06-04-2005 09:04:27

Cita:

Empezado por jachguate
El error está aqui:
...

Ahí está, sí señor...
:D ...se me adelantaron :D

Elfoscuro 06-04-2005 20:48:55

Ups!!!!!

Vaya fallo más capullo :confused:


La franja horaria es GMT +2. Ahora son las 04:38:05.

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