如何定义函数(50分)

  • 主题发起人 主题发起人 kmgyl
  • 开始时间 开始时间
K

kmgyl

Unregistered / Unconfirmed
GUEST, unregistred user!

Tmaskedit 有个虚拟函数
procedure ValidateEdit
virtual;
该函数可以获取maskedit 中的输入错误事件;
现在我想在程序中重载它:
先定义一个函数
procedure abc;
begin
..
end

然后定义validateEdit事件:
ValidateEdit:=abc;
但这样定义出错,请问要实现这一步该如何写?
谢谢!!


 
直接赋值是错误的,你可以自己定义一个EDIT类,就写成

TMyMaskEdit = class(TMaskEdit)
...
procedure ValidateEdit
override;
end;

然后将ABC里面的内容写入ValidateEdit函数体中就行了


 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TMyMask=Class(TMaskEdit)
protected
procedure ValidateEdit;override;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ MyMask }

procedure TMyMask.ValidateEdit;
begin
Showmessage('Invalid Input');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
tt:TMyMask;
begin
tt:=TMyMask.Create(self);
tt.parent:=self;
tt.EditMask:='!99/99/00;1;_';
tt.SetBounds(50,50,200,50);
tt.Show;
end;

end.

当焦点离开tt时,讲坛出invaild提示
 
TMyMaskEdit = class(TMaskEdit)
...
procedure ValidateEdit
override;
end

procedure TMyMaskEdit.ValidateEdit;
begin
abc;//你的abc
end;
 
呵呵,
首先,重载不是你这样做的,应该是前几位的做法;
其次,事件的方法是不能被替换的, 事件倒是可以;
再其次,如果想替换构件的事件,替换函数应该是对象的事件类型,
象各构件的事件都是如下定义的,
type
TMouseEvent = procedure(Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer) of object;

TControl = class(TComponent)
FOnMouseDown: TMouseEvent;
FOnMouseMove: TMouseMoveEvent;
...
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;

所以如果你想替换构件的事件,必须用一个对象内的可访问的事件来替换。
 
不能直接复制赋值
应该这样申明一个过程(procedure 可不是函数)
unit Unit1;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Mask;
type TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyMask=Class(TMaskEdit)
protected procedure ValidateEdit;override;
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TMyMask。ValidateEdit;
begin
{你在 abc 写的内容或者是}
abc(){括号里是参数)
end;
 
关注,我也想了解一些控件修改和编写方面的知识
 
我也很想多了解一些类的建立和函数的重载
但,我对VIRTUAL和OVERRIDE 的用法还有些不清楚,望各位高手能指点一二

谢谢
 
kmgyl,以上各位大虾讨论的都是实际操作,都对的很,在下不才,谈谈理论方面。
你知道此方法是虚拟方法,(virtual)那么在派生类中重载它一定要先声明才行。
声明用override保留字,如下例,
type
tdraw=class
procedure draw(x,y:integer);virtual;
end;
trectangle=class(tdraw)
procedure draw;override;
end;
tellipse=class(tdraw)
procedure draw;override;
end;
var mydraw:tdraw;
begin
mydraw:=trectangel.create;
mydraw.draw;{调用的是trectangel类的draw}
mydraw.destroy;
mydraw:=tellipse.create;
mydraw.draw;{调用的是tellipse类的draw};
mydraw.destroy;
end;
 
多人接受答案了。
 
后退
顶部