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 

Crear un ListBox al que se asocien colores a cada item

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Crear un ListBox al que se asocien colores a cada item Responder citando

Si alguien tiene por ahí un listbox al que se puedan asociar colores a cada uno de sus items, por favor, que me lo pase, porque he hecho uno pero el programa que lo utiliza se queda colgado (unas veces funciona bien, pero al rato se queda colgado a la primera ocasión).

Si, no teneis por ahí un componente de este tipo pero conoceis cómo se crean componentes para Builder, os adjunto a continuación el código fuente del componente que hemos creado (pero que como digo, no funciona correctamente). Os agradecería mucho que le echarais un vistazo y me dijerais donde puede estar el error. GRACIAS:

Si este foro no es para estas cosas, lo siento, no lo volveré a hacer Embarassed

FICHERO DE CABECERA (CTlistBox.h)
----------------------------------------
#ifndef CTListBoxH
#define CTListBoxH
#define EMNumColores 80

#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <StdCtrls.hpp>
AnsiString version = "version 1.0.1";

class PACKAGE CTListBox : public TListBox
{
private:
TColor colores[80]; // la estructura no maneja más de 80 elementos
void __fastcall DrawItem(int Index, const Windows::TRect &Rect,TOwnerDrawState State);

protected:
public:
TColor colores[EMNumColores]; // la estructura no maneja más de 80 elementos
__fastcall CTListBox(TComponent* Owner);
void __fastcall anadir_color(int indice,TColor color);
AnsiString& Version(void);
};
#endif

CÓDIGO C++ (CTlistBox.cpp)

----------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "CTListBox.h"
#pragma package(smart_init)
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(CTListBox *)
{
new CTListBox(NULL);
}

__fastcall CTListBox::CTListBox(TComponent* Owner) : TListBox(Owner)
{
}
// --------------------------------------------------------------------------
void __fastcall CTListBox::DrawItem(int Index, const Windows::TRect &Rect, TOwnerDrawState State)
{
// Este método se ejecuta cuando Windows necesita "pintar" un item del listBox

TListBox::DrawItem(Index,Rect,State);
TCanvas *pCanvas = this->Canvas;
pCanvas->Brush->Color = this->colores[Index];
pCanvas->FillRect(Rect);
pCanvas->TextOut(Rect.Left,Rect.Top, this->Items->Strings[Index]);

}
// --------------------------------------------------------------------------
void __fastcall CTListBox::anadir_color(int indice, TColor color){
// Añade un color a un item, asociándolo al array de colores (en la posición dada por "indice")
TRect rect;
TOwnerDrawState estado;


if ((indice >= 0)&&(indice < EMNumColores)){
rect = this->ItemRect(indice);
colores[indice] = color;
DrawItem(indice, rect,estado);
}
}
// ----------------------------------------------------------------
AnsiString& CTListBox::Version(void) { // Esta función no sirve para nada
return (version);
}
// ----------------------------------------------------------------
namespace Ctlistbox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(CTListBox)};
RegisterComponents("Samples", classes, 0);
}
}
Volver arriba
Mensaje    Asunto: Responder citando

HOLA:

Bueno dos cosillas.
Las primera, y por que no os funciona, es por que se se os ha olvidado poner en el constructor la propiedad style = lbOwnerDrawFixed;
Esto hacer que pase por DrawItem.

Y la segunda, no me gusta
TCanvas *pCanvas = this->Canvas;
Si puedes crea una variable de la clase, asi la puedes construir y destruir.

By.
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.