 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
najenko Invitado
|
Publicado: Vie 18 Abr, 2003 1:23 am Asunto: ¿Como pues mostrar todo el contenido de un ListBox? |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 20 Abr, 2003 2:11 pm Asunto: |
|
|
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 |
|
 |
najenko Invitado
|
Publicado: Jue 24 Abr, 2003 4:04 pm Asunto: Muchisimas gracias |
|
|
Muchas gracias, y el ejemplo perfecto. Gracias de nuevo por tu ayuda desinteresada |
|
| Volver arriba |
|
 |
asabogal Ens


Registrado: 14 Jul 2003Mensajes: 30
|
Publicado: Vie 15 Ago, 2003 12:15 pm Asunto: |
|
|
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  |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|