Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema TStringGrid dinámico y evento OnDrawCell (https://www.clubdelphi.com/foros/showthread.php?t=62395)

waremovil 20-12-2008 14:28:29

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

waremovil 20-12-2008 16:05:39

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

escafandra 20-12-2008 20:01:51

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.

escafandra 20-12-2008 20:38:59

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.

waremovil 22-12-2008 19:43:46

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


La franja horaria es GMT +2. Ahora son las 04:40:13.

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