Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Asignar evento OnDrawColumnCell en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=44169)

gluglu 30-05-2007 13:41:51

Asignar evento OnDrawColumnCell en tiempo de ejecución
 
Hola amigos !

Por qué no me deja asignar un evento OnDrawColumnCell a un DBGrid en tiempo de ejecución ?

Intento, en tiempo de ejecución, hacer :
Código Delphi [-]
DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;
pero el compilador me lanza un error '[Pascal Error] E2009 Incompatible types: 'Parameter lists differ'

Por supuesto que en tiempo de diseño funciona perfectamente.

Un saludo a todos y gracias por vuestros consejos !

Casimiro Notevi 30-05-2007 14:43:21

Se da por supuesto que son dbgrids del mismo tipo, no serán de distintos componentes, no?

gluglu 30-05-2007 15:29:53

No, no ...

Es el mismo Grid. Lo que pasa es que me interesa desactivar en un momento determinado el 'repintado' del Grid. Precisamente cuando voy a hacer un Drag&Drop de varios registros de ese Grid.

Cuando termine el Drag&Drop quería volver a asignarle el mismo procedimiento al evento del DBGrid. Y al parecer en tiempo de ejecución no me lo permite. Muy raro. Me pide los parámetros. Pero claro, no sólo entiendo que no hace falta pasarle ahí los parámetros, sino que además si intento pasarle parámetros 'ficticios' tay y como supuestamente me los pide, me salta otro error diciendo que no puedo asignarle el procedimiento a ese evento.

Puedo evitar la situación de otras maneras, lo que pasa es que me parecía muy curioso que no pudiera hacer lo que planteo en tiempo de ejecución, ya que en tiempo de diseño todos estamos acostumbrados a hacerlo con el evento OnDraColumnCell.

gatosoft 01-06-2007 07:28:46

Hola gluglu,

Pues la verdad no se que pueda estar ocurriendo pero creo que pueden haber problemas en la forma como estas asignado el evento....

Considero que lo correcto es definir una varaible en dnde puedas guardar el procedimiento (un puntero)...


Código Delphi [-]
var 
proc:TdrawColumnCellevent;

Luego, en la seccion en donde inhabilitas el procedimiento, guardas el procedimiento (tomado directamente del objeto), asi:

Código Delphi [-]
  proc:=dbgrid1.OnDrawColumnCell;
  dbgrid1.OnDrawColumnCell:=nil;

cuando lo quieras habilitar de nuevo, entonces haces la asignaci{on:

Código Delphi [-]
   dbgrid1.OnDrawColumnCell:=proc;

Y eso deberia funcionar, y como te digo, considero que es la forma correcta de hacerlo....

Por otro lado, supongo que puedes estar haciendo lo siguiente:
Código Delphi [-]
dbgrid1.OnDrawColumnCell:=nil;

y luego haces la asignaci{on del procedimiento que Delphi crea por defecto

Código Delphi [-]
dbgrid1.OnDrawColumnCell:=DBGrid1DrawColumnCell;

Lo cual en mi compilardor de Delphi 7 no me genera error ni advertencia, pero aun asi no creo que sea una buena tecnica...

Es solo una opini{on, pero como te dije en mi compilador no me ocurre, por lo que debe haber algo que estes haciendo diferente... si pudieras copiar el codigo tal vez pudieramos saber que pasa..

Saludos.

Casimiro Notevi 01-06-2007 09:41:33

A mí también me funciona bien y sin la variable intermedia:confused:

gluglu 01-06-2007 12:38:48

Gracias a los dos por vuestros comentarios.

Delphi 2006 VCL.Net, Proyecto nuevo VCL, un nuevo Form VCL. Incluyo un DBGrid y un Botón.

Código :

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Proc : TDrawColumnCellEvent;
begin
 
  Proc := DBGrid1.OnDrawColumnCell;
  DBGrid1.OnDrawColumnCell := Proc;   // Aqui el compilador no me dá error
 
  DBGrid1.OnDrawColumnCell := nil;
  DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;  // Aquí el compilador me lanza el error
 
end;
 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  DBGrid1.Font.Size := 8;
end;
Será de nuevo algo especial del Delphi VCL.Net como me he encontrado otras varias ya.

Gracias por la idea de la variable intermedia.

Casimiro Notevi 01-06-2007 13:14:58

La única diferencia que he encontrado es esta:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;  DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; Rect: TRect;  DataCol: Integer; Column: TColumn; State: TGridDrawState);


La franja horaria es GMT +2. Ahora son las 06:58:08.

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