我要开发一个类似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事件中写的代码仍有效,这是为什么?谢谢!

解决方案 »

  1.   

    procedure keypress(var key:char);  //去掉这里的override
    begin
     自己的代吗 //自己的代码里有无inherited?有就去掉
    end;如果不行直接继承TCustomEdit,不要发布OnKeyDown
      

  2.   

    to  HsWong() ( ) 信誉:100 
    procedure keypress(var key:char);  
    begin
     自己的代吗 //自己的代码里没有.
    end;我直接继承TCustomEdit,但是在onkeydown事件的代码还是能执行,而且总是在
    procedure keypress(var key:char);  
    begin
     自己的代吗 
    end;
    之后执行事件代码.
    真是搞不懂,难到在注册自定义组件时delphi会在keypress中加一个inherited?
      

  3.   

    FOnKeyPress
    和你说的onkeydown事件
    是两个事件!如果你都不用,就都要重写他们!
      

  4.   

    to chenzhuo(Jack Chen)
    FOnKeyPress
    和你说的onkeydown事件
    -----------------------
    不好意思,刚刚我打错啦是onkeypress事件;
      

  5.   

    unit MoneyEdit;interfaceuses
      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.测试通过没问题!
      

  6.   

    to  chenzhuo(Jack Chen)  
    应该是onkeypress事件啊!
    keypress是你在form中自定义的,与onkeypress不是一回事;
      

  7.   

    to  chenzhuo(Jack Chen) 
    什么地方不明?
      

  8.   

    问题:我在Tmoneyedit中覆盖了父类原来的keypress的代码:"if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key)".
    那么子类moneydeit的onkeypress事件应该不会被触发,是不是这样?我发现在使用Tmoneyedit的控件时在onkeypress事件中写的代码仍有效,这是为什么?谢谢!我上面的代码不是解决了你这个问题了吗?
    我上面的代码
    ShowMessage('触发了KeyPress');
    这一句是根本不会执行的
      

  9.   

    to  chenzhuo(Jack Chen) 
    不好意思,自己粗心搞错啦!你是对的.谢谢大家.