请问如何在组件的父类事件中加入自己想要的代码!(50分)

  • 主题发起人 主题发起人 Linux2002
  • 开始时间 开始时间
L

Linux2002

Unregistered / Unconfirmed
GUEST, unregistred user!
比如这样一个组件
TMyButton = class(TButton)
我想改写TButton的OnKeyDown事件怎么改写呢!
我直接
TMyButton = class(TButton)
public
procedure OnKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);override;
end;
这样无法通过编译,说基类没有这个方法!我应该如何改写呢,谢谢各位高人了!
 
实在不行自己处理WM_KEYDOWN消息吧
 
你应该重载procedure KeyDown(var Key: Word; Shift: TShiftState);这个方法。
 
to:星语心愿
你再仔细看一下我的问题好吗!就是基类没有这个方法让我重载所以才不知道如何阿,
哪位大哥告诉我吧!
 
procedure MW_KEYDOWN(VAR MSG:TMESSAGE);MESSAGE WM_KEYDOWN;

 
sorry,我写错了,应该是
procedure KeyDown(var Key: Word; Shift: TShiftState);override;
在其父类TWinControl中定义的,你可以重载。
 
OnKeyDown不是方法(是一个事件也就是一个方法指针类型的属性)当然找不到。
星语心愿说的对。
你应该覆盖KeyDown方法
 
OnKeyDown不是方法(是一个事件也就是一个方法指针类型的属性)当然找不到。
星语心愿说的对。
你应该覆盖KeyDown方法
 
这样吧,这个就可以看出来了
比如TListView的property OnAdvancedCustomDrawItem;
我这样写
TMyListView = class(TListView)
public
procedure OnAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem;
State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);override;
end;

procedure OnAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem;
State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin

end;
这样就会告诉我父类没有OnAdvancedCustomDrawItem这个方法,无法覆盖。我想要在TMyListView
里面改写TListView的OnAdvancedCustomDrawItem应该怎么做呢!
 
其实没有必要覆盖,因为父类并没有定义这个过程.
你可以这样:
TMyListView = class(TListView)
private
//自己定义一个过程
procedure Proc1(Sender: TCustomListView; Item: TListItem;
State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);//override;
public
constructor Create(AOwner: TComponent); override;

end;

procedure TMyListView.proc1(Sender: TCustomListView; Item: TListItem;
State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin

end;

constructor TMyListView.Create(AOwner: TComponent);
begin
inherited;
self.OnAdvancedCustomDrawItem:=self.proc1;//加上这句就ok了.
end;
 
看来只能用这个方法了,我本来也是用的这个方法,不过总觉得好像不爽,所以才问的!
 
接受答案了.
 
后退
顶部