Hola,
No estoy seguro, pero se me ocurre que si creas el componente en diseño, el puntero al evento deje de apuntar a tu función, ya que normalmente todos aparecen apuntando a Nil.
De todas maneras, en todos los componentes que he creado a partir de otros de la VCL, donde he tenido que hacer cosas parecidas a la que tú haces he usado otra técnica que me parece mejor.
Te cuento, normalmente, para cada evento de un componente existe un procedimiento protected y virtual que es el que se encarga de llamar al evento si este esta asignado. Borland decidió hacer esto así pensando en que si alguien quería heredar de un componente pudiese modificar el comportamiento ante cierto evento sin tener que usar directamente el propio puntero. Además, esto es peligroso, ya que si se instancia el nuevo componente y se quiere programar dicho evento, perderás la funcionalidad que habías añadido al heredar. No sé si me he explicado, pero me permito modificar tu código como ejemplo.
De todas formas, ten en cuenta que no tengo el Delphi a mano y no estoy seguro que el procedimiento que voy a sobreescribir exista o se llame así, pero como ejemplo creo que servirá.
Código:
unit DBGridPlus;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, DB;
type
TDBGridPlus = class(TDBGrid)
private
procedure MiDrawDataCell(Sender: TObject; const Rect: TRect;Field: TField; State: TGridDrawState);
protected
procedure DoDrawDataCell(const Rect: TRect;Field: TField; State: TGridDrawState);override;
//este es el procedimiento que llama al evento, comprueba que es así
public
{ Public declarations }
property InplaceEditor;
//me he cargado el constructor y destructor porque no hacian falta
end;
implementation
procedure TDBGridPlus.DoDrawDataCell(const Rect: TRect;Field: TField; State: TGridDrawState);
begin
MiDrawDataCell(Self, Rect, Field, State);
inherited DoDrawDataCell(Rect, Field, State);
{
llamar antes o despues al inherited depende si quieres que se ejecute antes tu código o el de el evento.
Piensa que el codigo de este procedure será algo asi:
procedure TDBGrid.DoDrawDataCell(const Rect: TRect;Field: TField; State: TGridDrawState);
begin
if Assigned(FOnDrawDataCell) then
FOnDrawDataCell(Rect, Field, State);
end;
}
end;
procedure TDBGridPlus.MiDrawDataCell(Sender: TObject; const ect: TRect; Field: TField; State: TGridDrawState);
var
Grid : TStringGrid;
Texto : String;
Rectangulo : TRect;
begin
Rectangulo:=Rect;
Grid := TStringGrid(Sender);
if Field.IsBlob
then begin
Grid.Canvas.FillRect(Rect);
Texto := Field.AsString;
DrawText( Grid.Canvas.Handle,
PChar(Texto),
StrLen(PChar(Texto)), Rectangulo, DT_WORDBREAK);
end;
end;
end.