Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cambiar el color del hint de un listview no de la aplicación

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cambiar el color del hint de un listview no de la aplicación Responder citando

Pues eso, me gustaría saber si alguien conoce el código para cambiar el color del Hint de un TListView, en la aplicación hay otros hints que deben quedar igual, únicamente debe cambiar el color de fondo de los hints del TlistView. Si el ItemIndex es par un color y si es impar otro color. El código para combrobar si el index es par o impar ya lo controlo, únicamente necesito el código para cambiar el color de fondo.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Puedes usar el evento OnShowHint del componente TApplicationEvents:
Código:
void __fastcall TForm1::ApplicationEvents1ShowHint(AnsiString &HintStr,
      bool &CanShow, THintInfo &HintInfo)
{
    if (HintInfo.HintControl->ClassNameIs("TListView"))
        HintInfo.HintColor = clRed;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias _Leo por tu interés, me funciona correctamente pero sólo cuando quiere, este es el código que utilizo:
Código:

void __fastcall TForm1::ApplicationEvents1ShowHint(AnsiString &HintStr,
      bool &CanShow, THintInfo &HintInfo)
{
    if (ListView1->Items->Count>0){
      if (HintInfo.HintControl->ClassNameIs("TListView")){
        if (ListView1->ItemIndex & 1){  //comprobar si el index es par
          HintInfo.HintColor = clRed;
        }
        else {
          HintInfo.HintColor = clSilver;
        }
      }
    }
}

Tal vez el fallo esté en la línea en la que compruebo si el index es par o impar. No lo se, en fin si no te importa en volver a hecharme una mano te estaré muy agradecido.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Yo lo veo correcto, aunque supongo que quizás no es el comportamiento que buscas. Si lo que quieres es que al pasar el cursor por encima de las líneas sin tener que seleccionarlas cambie el contenido y el color del hint puedes usar lo siguiente en el evento OnMouseMove del TListView:
Código:
void __fastcall TForm1::ListView1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
    TListView* lv = static_cast<TListView*>(Sender);
    static int oldX, oldY;

    if (oldX != X || oldY != Y)
    {
        LVHITTESTINFO hti;
        hti.pt = Point(X, Y);
        ListView_SubItemHitTest(lv->Handle, &hti);

        // En hti.iItem tenemos el número de item/línea sobre el que estamos
        // Como ejemplo mostramos en el hint su contenido:
        if (hti.iItem > -1)
            lv->Hint = lv->Items->Item[hti.iItem]->Caption;
        else
            lv->Hint = "";

        // Ponemos en la propiedad Tag el item sobre el que esta
        // el ratón para usarlo luego en el evento OnShowHint
        lv->Tag = hti.iItem;

        // Mostramos el Hint con retardo
        TMessage msg = {0};
        Application->HintMouseMessage(this, msg);
        msg.LParamLo = X;
        msg.LParamHi = Y;
        Application->HintMouseMessage(lv, msg);
        // y si lo queremos sin retardo:
        // Application->ActivateHint(Mouse->CursorPos);

        oldX = X;
        oldY = Y;
    }
}

Y lo siguiente en el evento OnShowHint del TApplicationEvents:
Código:
void __fastcall TForm1::ApplicationEvents1ShowHint(AnsiString &HintStr,
      bool &CanShow, THintInfo &HintInfo)
{
    if (HintInfo.HintControl->ClassNameIs("TListView"))
    {
        // Podemos usar la siguiente línea para
        // que el hint tarde más en ocultarse
        //HintInfo.HideTimeout = 50000;

        // Comprobar si el index es par o impar
        if (ListView1->Tag & 1)
            HintInfo.HintColor = clRed;
        else
            HintInfo.HintColor = clSilver;
    }
}


Si no es esto dime realmente como quieres que se comporte y al hacer que, y modifico el ejemplo..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ahora si, eres el mejor. Sólo que en el evento OnInfoTip de mi ListView ya establezco el caption de mi hint en dos líneas (una encima de otra), ¿Se podría simplificar el código que me mandas quitando los caption de los hint? lo pregunto porque en tu ejemplo pones "Como ejemplo mostramos en el hint su contenido ". Si no lo dejo así que me funciona ok. Gracias otra vez.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En las versiones viejas no existe el OnInfoTip.. pero si estas usando una versión que si lo tiene también podrías hacer lo siguiente:

- No uses el evento OnMouseMove que puse anteriormente. En su lugar en el evento OnInfoTip podríamos poner algo así:
Código:
void __fastcall TForm1::ListView1InfoTip(TObject *Sender, TListItem *Item,
      AnsiString &InfoTip)
{
        // Ponemos en la propiedad Tag el item sobre el que esta
        // el ratón para usarlo luego en el evento OnShowHint
    Item->ListView->Tag = Item->Index;

    InfoTip = Item->Caption;
}


El OnMouseMove te da la ventaja de que tienes mas control, por ejemplo si necesitaras detectar cuando el cursor esta sobre una columna en contreto, etc...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias _Leo. Doy por cerrado el tema.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.