我自己编写的一个控件,大致模型如下://定义
TSmallImage=Class(TCustomControl)
  ...
end;//创建
procedure TViewManager.CreateImg;
var
  img:TSmallImage;
begin
  img:=TSmallImage.Create(panel1);
  img.OnKeyDown := ImgKeyDown;
end;//事件
procedure TViewManager.ImgKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ShowMessage('ok!');
end;procedure TFrmMain.FormShow...
var
  VM:TViewManager;
begin
  VM := TViewManager.Create;
  ...
  VM.CreateImg;
end;
大致思路是,在主窗体显示时利用类ViewManager的实例对象vm,调用其CreateImg过程动态创建一个TSmallImage对象放到窗体Panel1面板上,并且动态设置了其OnKeyDown事件为自定义事件。问题是:程序运行后,在TSmallImage上按键盘上任何按键都不起作用,不触发ShowMessage('ok!');需要注意的是我的TSmallImage里并没有显式定义OnKeyDown,因为从其父类TCustomControl继承而来的我以为是主窗体的KeyPreview的问题,但是改了一样不解决问题。谁知道的说下,谢谢!!!

解决方案 »

  1.   

    但是如果设置img.OnDblClick := imgDblClick的话,在运行时能正常调用imgDblClick里的代码,发现OnDblClick属于TComponent类,而OnKeyDown属于TControl类,但是从继承关系上看,TComponent是TControl的子类。有点迷糊了。。
      

  2.   

    SmallImage需要取得焦点才能激发OnKeyDown事件
      

  3.   

    erhan() 你说的情况我考虑到了,我在imgClick的第一句就是
    if Sender is TSmallImage then
    Windows.SetFocus();
      

  4.   

    erhan() 你说的情况我考虑到了,我在imgClick的第一句就是
    if Sender is TSmallImage then
      Windows.SetFocus(TSmallImage(Sender).Handle);
      

  5.   

    尽管你SetFocus(),也不一定能接受焦点,你的控件显然是没有成功接受焦点。
      

  6.   

    你们的回答都不对。我已经解决了。在TSmallImage里增加一个消息处理procedure TSmallImage.CMWantSpecialKey(var Message: TCMWantSpecialKey);
    begin
      //自定义按键处理
      if Message.CharCode in [VK_UP,VK_DOWN,VK_HOME,VK_END,VK_PRIOR,VK_NEXT,VK_LEFT,VK_RIGHT] then
      begin
        Message.Result := 1;
      end;
    end;这样就可以了。不相信的或者没做过的可以试验下。很抱歉你们的回答不负责任,不给分了