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 

¿Como pues mostrar todo el contenido de un ListBox?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿Como pues mostrar todo el contenido de un ListBox? Responder citando

Hola, mi intención es poder mostrar todo el contenido de los campos de una BD en un ListBox. Como sabeis, si la frase es demasiado larga, el resto de la frase que no quepa, no se muestra, y quisiera que se mostrara todo el contenido, usando varias líneas o algo parecido. ¿Cómo lo podría hacer? o usando otro componente, la cosa es mostrarlo completo.
Ya hice un hint que se muestra sobre cada item, pero no es lo que quiero, prefiero algo que muestre la frase completa.
Gracias
Volver arriba
Mensaje    Asunto: Responder citando

Tendrías que dibujar tu mismo cada elemento. Para ello tienes que usar la propiedad 'Style' y los eventos 'OnMeasureItem' y 'OnDrawItem'. Aquí va un pequeño ejemplo:

- Lo primero es poner la propiedad Style del TListBox en tiempo de diseño a lbOwnerDrawVariable que permite dibujar cada elemento con diferentes alturas de línea.

- Metemos el siguiente código en el evento OnMeasureItem, el cual se disparara antes de dibujar cada elemento para indicarle su altura en píxeles:
Código:
void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control,
      int Index, int &Height)
{
    //--- TListBox::OnMeasureItem ---//

    // Puntero al ListBox enlazado con este evento
    TListBox* lb = static_cast<TListBox*>(Control);

    // Averiguamos la altura del texto de un elemento
    TRect rect = lb->ClientRect;
    Height = 4 + DrawText(lb->Canvas->Handle,
                          lb->Items->Strings[Index].c_str(),
                          -1, &rect, DT_CALCRECT | DT_WORDBREAK);
}


- Y por ultimo el siguiente código en el evento OnDrawItem:
Código:
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
      TRect &Rect, TOwnerDrawState State)
{
    //--- TListBox::OnDrawItem ---//

    // Puntero al ListBox enlazado con este evento
    TListBox* lb = static_cast<TListBox*>(Control);

    // Limpiamos el fondo del elemento
    lb->Canvas->FillRect(Rect);

    // Dibujamos el texto
    DrawText(lb->Canvas->Handle,
             lb->Items->Strings[Index].c_str(), -1, &Rect, DT_WORDBREAK);

    // Dibujamos una linea de separacion
    lb->Canvas->Pen->Style = psDot;
    lb->Canvas->Pen->Color = clGray;
    lb->Canvas->MoveTo(Rect.Left, Rect.Bottom-1);
    lb->Canvas->LineTo(Rect.Right, Rect.Bottom-1);

    // Quitamos el cuadro de foco
    // (como usa XOR al dibujarlo por segunda vez se borra)
    if (State.Contains(odFocused))
        lb->Canvas->DrawFocusRect(Rect);
}

Este es el resultado:
            
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Muchisimas gracias Responder citando

Very Happy Muchas gracias, y el ejemplo perfecto. Gracias de nuevo por tu ayuda desinteresada
Volver arriba
Mensaje    Asunto: Responder citando

Bueno, para el ejemplo mostrado por Leo cambio el codigo, para usarlo en un combobox, pero al colocar la propiedad Style del TListBox en tiempo de diseño a csOwnerDrawVariable, me sale un error:

Project conta.exe raised exception ... access violation at address 77D15201 un module 'user32.dll'...

Entonces, es posible hacer algo similar a lo que se hace en el ejemplo con el listbox??

Gracias Twisted Evil
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.