首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

在开发控件过程中遇到的困惑?请大家帮看看,多谢

2012-02-23 
在开发控件过程中遇到的困惑?请大家帮看看,谢谢!我要开发一个类似Tedit类的控件但是对于其父类(TWinContro

在开发控件过程中遇到的困惑?请大家帮看看,谢谢!
我要开发一个类似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 ');
这一句是根本不会执行的

热点排行