我要开发一个类似Tedit类的控件但是对于其父类(TWinControl)中的有些代码感到困惑:
///在delphi的controls单元文件中
TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;
.............
type
TWinControl = class(TControl)
private
FOnKeyPress: TKeyPressEvent;
.........
protected
procedure KeyPress(var Key: Char); dynamic;
property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
//属性property OnKeyPress在其后代类Tedit中被放到了published后;
....
public
.....
published
.......
end;
......
implementation
...........procedure TWinControl.KeyPress(var Key: Char);
begin
if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key);
//我想这应该是调用onkeypress事件的代码end;//用Twincontrol的后代类Tedit定义一控件Tmoneyedit
//代码如下;type
Tmoneyedit=class(Tedit)
private
.........
protected
procedure keypress(var key:char);override;
.........
public
......
published
.........
end;implementation
........
procedure keypress(var key:char);override;
begin
自己的代吗
end;
问题:我在Tmoneyedit中覆盖了父类原来的keypress的代码:"if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key)".
那么子类moneydeit的onkeypress事件应该不会被触发,是不是这样?我发现在使用Tmoneyedit的控件时在onkeypress事件中写的代码仍有效,这是为什么?谢谢!
///在delphi的controls单元文件中
TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;
.............
type
TWinControl = class(TControl)
private
FOnKeyPress: TKeyPressEvent;
.........
protected
procedure KeyPress(var Key: Char); dynamic;
property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
//属性property OnKeyPress在其后代类Tedit中被放到了published后;
....
public
.....
published
.......
end;
......
implementation
...........procedure TWinControl.KeyPress(var Key: Char);
begin
if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key);
//我想这应该是调用onkeypress事件的代码end;//用Twincontrol的后代类Tedit定义一控件Tmoneyedit
//代码如下;type
Tmoneyedit=class(Tedit)
private
.........
protected
procedure keypress(var key:char);override;
.........
public
......
published
.........
end;implementation
........
procedure keypress(var key:char);override;
begin
自己的代吗
end;
问题:我在Tmoneyedit中覆盖了父类原来的keypress的代码:"if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key)".
那么子类moneydeit的onkeypress事件应该不会被触发,是不是这样?我发现在使用Tmoneyedit的控件时在onkeypress事件中写的代码仍有效,这是为什么?谢谢!
begin
自己的代吗 //自己的代码里有无inherited?有就去掉
end;如果不行直接继承TCustomEdit,不要发布OnKeyDown
procedure keypress(var key:char);
begin
自己的代吗 //自己的代码里没有.
end;我直接继承TCustomEdit,但是在onkeydown事件的代码还是能执行,而且总是在
procedure keypress(var key:char);
begin
自己的代吗
end;
之后执行事件代码.
真是搞不懂,难到在注册自定义组件时delphi会在keypress中加一个inherited?
和你说的onkeydown事件
是两个事件!如果你都不用,就都要重写他们!
FOnKeyPress
和你说的onkeydown事件
-----------------------
不好意思,刚刚我打错啦是onkeypress事件;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMoneyEdit = class(TEdit)
private
{ Private declarations }
protected
procedure keypress(var key:char);override;
public
{ Public declarations }
published
{ Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TMoneyEdit]);
end;{ TMoneyEdit }procedure TMoneyEdit.keypress(var key: char);
begin
ShowMessage('');
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MCForms, StdCtrls, MoneyEdit;type
TForm1 = class(TForm)
MoneyEdit1: TMoneyEdit;
procedure MoneyEdit1KeyPress(Sender: TObject; var Key: Char);
private
{ 私有成员(变量、函数)声明 }
public
{ 公共成员(变量、函数)声明 }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.MoneyEdit1KeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage('触发了KeyPress');
end;end.测试通过没问题!
应该是onkeypress事件啊!
keypress是你在form中自定义的,与onkeypress不是一回事;
什么地方不明?
那么子类moneydeit的onkeypress事件应该不会被触发,是不是这样?我发现在使用Tmoneyedit的控件时在onkeypress事件中写的代码仍有效,这是为什么?谢谢!我上面的代码不是解决了你这个问题了吗?
我上面的代码
ShowMessage('触发了KeyPress');
这一句是根本不会执行的
不好意思,自己粗心搞错啦!你是对的.谢谢大家.