在开发控件过程中遇到的困惑?请大家帮看看,谢谢!
我要开发一个类似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事件中写的代码仍有效,这是为什么?谢谢!
[解决办法]
procedure keypress(var key:char); //去掉这里的override
begin
自己的代吗 //自己的代码里有无inherited?有就去掉
end;
如果不行直接继承TCustomEdit,不要发布OnKeyDown
[解决办法]
FOnKeyPress
和你说的onkeydown事件
是两个事件!如果你都不用,就都要重写他们!
[解决办法]
unit MoneyEdit;
interface
uses
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;
implementation
procedure Register;
begin
RegisterComponents( 'Samples ', [TMoneyEdit]);
end;
{ TMoneyEdit }
procedure TMoneyEdit.keypress(var key: char);
begin
ShowMessage( ' ');
end;
end.
unit Unit1;
interface
uses
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.
测试通过没问题!
------解决方案--------------------
问题:我在Tmoneyedit中覆盖了父类原来的keypress的代码: "if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key) ".
那么子类moneydeit的onkeypress事件应该不会被触发,是不是这样?我发现在使用Tmoneyedit的控件时在onkeypress事件中写的代码仍有效,这是为什么?谢谢!
我上面的代码不是解决了你这个问题了吗?
我上面的代码
ShowMessage( '触发了KeyPress ');
这一句是根本不会执行的