Hola, la solución es bastante sencilla, debes realizar un "refresh" después de cambiar el color (por ejemplo).
Te pego el código "mejorado" (te he quitado trozos de código que no realizaban ninguna función o realizaban funciones repetidas):
Código Delphi
[-]procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);
var
IconRect, RectDireccion, RectTelefono, RectEmail, RectTitulo : TRect;
begin
with Sender as TListView do
begin
case ViewStyle of
vsIcon:
begin
IconRect := Item.DisplayRect(drIcon);
if(cdsSelected in State) then
begin
Canvas.Font.Style := Canvas.Font.Style + [fsBold];
Canvas.Font.Color := clBlack;
Canvas.Font.Name := 'Arial';
RectTitulo := IconRect;
RectTitulo.Left := IconRect.Left + 42;
Canvas.Brush.Color := clSkyBlue;
Canvas.Pen.Style := psDash;
Canvas.FrameRect(RectTitulo);
RectTitulo.Bottom := IconRect.Top + Canvas.TextHeight('Hola mundo');
Canvas.TextRect(RectTitulo, RectTitulo.Left+2,RectTitulo.Top+5, 'Hola mundo');
Canvas.Brush.Color := $FFFFEE;
Canvas.FillRect(IconRect);
end;
if((Item.Index mod 2) = 0)then
begin
Canvas.Font.Style := Canvas.Font.Style + [fsBold];
Canvas.Font.Color := clBlack;
Canvas.Font.Name := 'Arial';
RectTitulo := IconRect;
RectTitulo.Left := IconRect.Left + 41;
Canvas.Brush.Color := clSkyBlue;
Canvas.FrameRect(RectTitulo);
RectTitulo.Bottom := IconRect.Top + Canvas.TextHeight('Titulo 1:')+5;
Canvas.TextRect(RectTitulo, RectTitulo.Left+2,RectTitulo.Top+5, 'Titulo 1:');
Canvas.Brush.Color := clWhite;
Canvas.Refresh;
RectDireccion := IconRect;
RectDireccion.Left := IconRect.Left + 42;
RectDireccion.Top := IconRect.Top + Canvas.TextHeight('Valor de la dirección:')+20;
RectDireccion.Bottom := RectDireccion.Top + Canvas.TextHeight('Direccion : ');
Canvas.TextRect(RectDireccion, RectDireccion.Left+2,RectDireccion.Top, 'Dirección : ');
RectTelefono := IconRect;
RectTelefono.Left := IconRect.Left + 42;
RectTelefono.Top := RectDireccion.Top + Canvas.TextHeight('Direccion : ')+10;
RectTelefono.Bottom := RectTelefono.Top + Canvas.TextHeight('Teléfono : ');
Canvas.TextRect(RectTelefono, RectTelefono.Left+2, RectTelefono.Top, 'Teléfono : ');
RectEmail := IconRect;
RectEmail.Left := IconRect.Left + 42;
RectEmail.Top := RectTelefono.Top + Canvas.TextHeight('Email : ')+10;
RectEmail.Bottom := RectEmail.Top + Canvas.TextHeight('Email : ');
Canvas.TextRect(RectEmail, RectEmail.Left+2, RectEmail.Top, 'Email : ');
end;
Canvas.Brush.Color := clGrayText;
Canvas.FrameRect(IconRect);
ilOthersImages.Draw(Canvas, IconRect.Left, IconRect.Top,0);
Item.Caption := '';
end;
vsSmallIcon:;
vsList:;
vsReport:;
end;
end;
end;
La mejora está en que después de pintar el titulo (el único que tu quieres de color azul) le cambiamos el color de la brocha a blanco y "refrescamos", y ya podemos ir pintando los textos.
Ahora te queda controlar cuando el item está seleccionado, para que no pinte el fondo del texto como blanco, sino del color de fondo de cuando está seleccionado.
Saludos, espero que te sirva
Editado:
Después de poner el mensaje, caí en que en lugar de asignarle el color "blanco" como fondo, se puede mejorar asignando la propiedad
Canvas.Brush.Style:=bsClear; así queda transparente, y no debes preocuparte de cambiar el color para cuando el item este seleccionado.
Este seria el cambio que debería de realizarse en el código:
Código Delphi
[-]Canvas.Brush.Style:=bsClear; Canvas.Refresh;