自己写了一个控件,继承于TCustomPanel作为容器,在该控件上用一个TImage显示图片信息。我给该控件增加了一个双击事件,但发现在双击到TImage位置时不能触发事件(双击其它地方可以触发),不知怎么解决?代码如下:
  TSmallImg = class(TCustomPanel)
    img: TImage;
  private
    FDblClick:TNotifyEvent;
    procedure CDblClick(var Message: TMessage); message WM_LBUTTONDBLCLK;
  public
    constructor Create;
    destructor Destroy; override ;
    property OnDblClick:TNotifyEvent read FDblClick write FDblClick;
 end; constructor TSmallImg.Create;
 begin
  inherited Create(nil);
  Width:=105;
  Height:=129;  img:=TImage.Create(nil);
  img.Parent:=self;
  img.Top:=0;
  img.left:=0;
  img.Show;
 end; Destructor TSmallImg.Destroy;
 begin
  if img<>nil then img.Free;
  inherited Destroy ;
 end; procedure TSmallImg.CDblClick(var Message: TMessage);
 begin
   if assigned(FDblClick) then FDblClick(Self);
 end;分不够可以加!

解决方案 »

  1.   

    因为手头上没有Delphi,不知道TImage有没有OnDblClick事件,如果有,就简单了,可以这样:
    TSmallImg = class(TCustomPanel)
        img: TImage;
      private
        FDblClick:TNotifyEvent;
        procedure CDblClick(var Message: TMessage); message WM_LBUTTONDBLCLK;
        procedure ImgDblClick(Sender: TObject);
      public
        constructor Create;
        destructor Destroy; override ;
        property OnDblClick:TNotifyEvent read FDblClick write FDblClick;
     end;
      

  2.   

    constructor TSmallImg.Create;
     begin
      inherited Create(nil);
      Width:=105;
      Height:=129;  img:=TImage.Create(nil);
      img.OnDblClick := ImgDblClick;
      img.Parent:=self;
      img.Top:=0;
      img.left:=0;
      img.Show;
     end;procedure TSmallImg.ImgDblClick(Sender: TObject);
     begin
       if assigned(FDblClick) then FDblClick(Self);
     end;
      

  3.   

    你双击Image,触发的应该是Image的DbClick事件,如果你要达到双击Image而触发TSmallImg的DbClick事件,可以在Image的OnDbClick事件中发送一个消息。
    PostMessage(SmallIm1.handle,WM_LBUTTONDBLCLK,0,0);
      

  4.   

    chechy的办法我试了可行,但我又增加了一个鼠标右击的事件,该事件在TImage中是没有的,所以没办法在右击事件中指定处理函数,也没办法在右击事件中发消息。完整一点的代码贴在下面(已经把chechy的部分加上了):type
      TSmallImg = class(TCustomPanel)
      private
        img: TImage;
        FDblClick:TNotifyEvent;
        FRBUTTONUP:TNotifyEvent;
        procedure CDblClick(var Message: TMessage); message WM_LBUTTONDBLCLK;
        procedure CRBUTTONUP(var Message: TMessage); message WM_RBUTTONUP;
        procedure ImgDblClick(Sender: TObject);
      public
        constructor Create;
        destructor Destroy; override ;
        property OnDblClick:TNotifyEvent read FDblClick write FDblClick;
        property OnRBUTTONUP:TNotifyEvent read FRBUTTONUP write FRBUTTONUP;
      end;
    constructor TSmallImg.Create;
    begin
      inherited Create(nil);
      Width:=105;
      Height:=129;  img:=TImage.Create(nil);
      img.Parent:=self;
      img.Top:=0;
      img.left:=0;
      img.OnDblClick:=ImgDblClick;
      img.Show;
    end;destructor TSmallImg.Destroy;
    begin
      img.Free;
      inherited Destroy ;
    end;procedure TSmallImg.CDblClick(var Message: TMessage);
    begin
      if assigned(FDblClick) then FDblClick(Self);
    end;procedure TSmallImg.ImgDblClick(Sender: TObject);
    begin
      if assigned(FDblClick) then FDblClick(Self);
    end;procedure TSmallImg.CRBUTTONUP(var Message: TMessage);
    begin
      if assigned(FRBUTTONUP) then FRBUTTONUP(Self);
    end;
      

  5.   

    to fbysss(独孤求败),你的办法我没试,但我相信是可行的。只是我的问题是鼠标右击事件没法处理,因为TImage没有右击事件,也就不知道什么时候发鼠标右击消息或指定处理函数。不过我到是在TImage的OnMouseUp事件中实现了。
    constructor TSmallImg.Create;
    begin
      ...
      img.OnMouseUp:=ImgRBUTTONUP;
      ...  
    end;procedure TSmallImg.ImgRBUTTONUP(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    begin
      if Button=mbRight then
      begin
        if assigned(FRBUTTONUP) then FRBUTTONUP(Self);
        //这里我想用发消息的办法也可以实现了
      end;
    end;