PDA

Ver la Versión Completa : Asignar evento OnDrawColumnCell en tiempo de ejecución


gluglu
30-05-2007, 13:41:51
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 :
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)...



var
proc:TdrawColumnCellevent;


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


proc:=dbgrid1.OnDrawColumnCell;
dbgrid1.OnDrawColumnCell:=nil;


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


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:

dbgrid1.OnDrawColumnCell:=nil;


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


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 :

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:

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);