Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2008
waremovil waremovil is offline
Miembro
 
Registrado: ago 2007
Ubicación: Zaragoza
Posts: 78
Poder: 17
waremovil Va por buen camino
Problema TStringGrid dinámico y evento OnDrawCell

Hola, a ver si alguien me puede decir qué es lo que se me está escapando

He trabajado antes muchas veces con stringGrids pero no de manera dinámica (siempre los creaba desde la barra de componentes)

pues bien, ahora instancio dinámicamente un objeto TStringGrid

el problema viene a la hora de personalizarlo. Como es normal establezco la propiedad "DefaultDrawing = false" para poder dibujarlo yo, hasta ahi ok

entonces intento definir un método OnDrawCell propio

SGrid->OnDrawCell = MiDrawCell;

aquí viene el problema, me salta el siguiente error:
[C++ Error] FUsers.cpp(341): E2034 Cannot convert
'void (_fastcall * (_closure )(TObject *,int,int,TRect &,TGridDrawState))(TObject *,int,int,TRect &,TGridDrawState)' to
'void (_fastcall * (_closure )(TObject *,int,int,const TRect &,TGridDrawState))(TObject *,int,int,const TRect &,TGridDrawState)'

como podeis ver me pide que en la definición de mi método defina TRect como const

efectivamente, si lo hago así , me permite compilar pero entonces no puedo personalizar el grid (no me permite variar TRect)

sin embargo cuando trabajo con StringGrids estáticos, en la definición del método automáticamente lo define como NO-CONSTANTE

Ejemplo:
void __fastcall TFormMain::GridModulosDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)

Esto es válido en estático, en dinámico me obliga a que sea así:
void __fastcall TFormMain::GridModulosDrawCell(TObject *Sender, int ACol,
int ARow, const TRect &Rect, TGridDrawState State)

alguien sabe por qué? necesito solventar esto y no veo información al respecto, parece que nadie en el mundo necesitara definir sus propios StringGrids de forma dinámica

gracias por adelantado
Responder Con Cita
  #2  
Antiguo 20-12-2008
waremovil waremovil is offline
Miembro
 
Registrado: ago 2007
Ubicación: Zaragoza
Posts: 78
Poder: 17
waremovil Va por buen camino
fantástico, parece ser un fallo del builder

http://qc.codegear.com/wc/qcmain.aspx?d=17890

lo que me fastidia es que creado estáticamente no tengo el problema

en fin, a buscar otra manera de implementar algo, como tantas veces nos ha pasado a todos

hasta otra
Responder Con Cita
  #3  
Antiguo 20-12-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No se muy bien porqué quieres modificar ese TRect, pero he cotilleado un poco las definiciones de los eventos y he visto esto:

El evento TDrawGrid::OnDrawCell de define asi:

Código:
typedef void __fastcall (__closure *TDrawCellEvent)(System::TObject* Sender, int ACol, int ARow, const Windows::TRect &Rect, TGridDrawState State);
Eso quiere decir que Rect siempre es un const TRect &.

He probado a usar el TStringGrid dinámicamente y me pasa lo que a tí, no me extraña pues espera una función con el const TRect &

Cuando lo uso como componente visual, es cierto que la definición del evento no requiere const TRect& pero lo que si ocurre es que si modificas el valor del Rect no tiene efecto entre llamada y llamada, a pesar de ser una referencia. Con lo que me inclino a pensar que a todos los efectos es una constante.

Pero repito, no se para que quieres modificar ese valor.

Saludos.
Responder Con Cita
  #4  
Antiguo 20-12-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Bueno te dejo un truco para que compile y tu función OnDrawCell no tenga const TRect &Rect:

Define un nuevo tipo de evento en la cabecera.h de tu form (o en otra incluida):
Código:
typedef void __fastcall (__closure *TDCE)(System::TObject *Sender, int ACol, int ARow,
           Windows::TRect &Rect, TGridDrawState State);
Define un puntero a ese tipo de evento en la definición de tu Form:
Código:
TDCE _DrawCell;
Y en OnCreate, por ejemplo, asigna tu función MiDrawCell de esta forma:

Código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // Asignación en dos pasos o no te deja...
    _DrawCell = MiDrawCell;
    SGrid->OnDrawCell = (TDrawCellEvent)_DrawCell;
    // Para luego visualizar el control, ya sabes....
    InsertControl(SGrid);
}
Espero que te ayude.
Saludos.
Responder Con Cita
  #5  
Antiguo 22-12-2008
waremovil waremovil is offline
Miembro
 
Registrado: ago 2007
Ubicación: Zaragoza
Posts: 78
Poder: 17
waremovil Va por buen camino
magistral escafandra, muchas gracias te has tomado muchas molestias

al final me tuve que apañar cambiando la forma de dibujar trect que usaba

pero me apunto tu truco porque pienso que será muy útil cuando pelee con las redefiniciones de eventos



un saludo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con TPageControl Dinamico NeoAnderson API de Windows 3 05-02-2008 21:07:47
¿Evento scroll en TStringGrid? grotero76 OOP 3 05-06-2007 15:57:59
Problema con una TStringGrid azaghal Varios 2 20-05-2006 03:20:56
Evento onclick en formulario dinámico jfgaliano OOP 1 23-12-2005 14:05:46
evento on keypress y componente dinamico Rabata OOP 4 26-07-2005 21:54:38


La franja horaria es GMT +2. Ahora son las 11:18:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi