Ver Mensaje Individual
  #2  
Antiguo 26-07-2003
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Reputación: 22
marto Va por buen camino
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.
__________________
E pur si muove
Responder Con Cita