一個簡單的繼承問題。(20分)

  • 主题发起人 主题发起人 leway
  • 开始时间 开始时间
L

leway

Unregistered / Unconfirmed
GUEST, unregistred user!
TMyEdit = class(TEdit)
TMyEdit是TEdit的子類,
我想在TMyEdit中寫OnMouseDown( )取代從TEdit繼承下來的OnMouseDown( ),該如何實現。
謝謝。
 
MyEditNameMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
 
OnMouseDown是TEdit的属性而已,你怎么想取代呢,他也不是过程
 
type
TMyEdit = class(TEdit)
private
{Private declarations}
public
{ Public declarations }
procedure OnMouseDown(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
end;
procedure OnMouseDown(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
end;
編譯出錯:Method 'OnMouseDown' not found in base class
 
Type
TMyEdit = class(TEdit)
private
{Private declarations}
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure MyOnMouseDown(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
end;


{ TMyEdit }

constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited;
OnMouseDown:=MyOnMouseDown;
end;

procedure TMyEdit.MyOnMouseDown(sender: tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//add your MouseDown code here!
end;
 
我觉得不能在TMyEdit重写OnMouseDown事件,该事件是从TEdit从TControl继承下来的,不是
虚拟方法,应该不能够重写,但是可以直接使用
MyEditNameMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
編譯出錯:Method 'OnMouseDown' not found in base class也就是因为他不是虚拟方法的原因.
 
我在表達上可能有些問題,讓大家迷惑了。
我是想在從TEdit繼承下來的TMyEdit的OnMouseDown中填入代碼,使它響應鼠標的點擊。
 
那就直接在程序中使用,就象你定义的窗口可以响应TForm的事件一样.
 
procedure MyOnMouseDown(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
inhirted;
//写代码
end;
 
我已查了继承链:
unit MEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
TMEdit = class(TEdit)
private
{ Private declarations }
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;

protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('YWF', [TMEdit]);
end;

{ TMEdit }

procedure TMEdit.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
// MouseDown是接管OnMouseDown 的唯一过程,在TWinControl中定义
//inherited相当于后面的注释。
inherited; // if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);


end;

end.
 
你用消息试试了。
 
多謝大家。
請教YFeral,
procedure Register;
begin
RegisterComponents('YWF', [TMEdit]);
end;
是幹什麼的。
 
to leway:
你直接在MouseDown中写代码就行,我以前定制过一个ChekBox就是用了类似的办法
你用一用绝对没问题,用消息也是调用MouseDown的不信你查查。
 
to leway:
哎呀,那是注册控件的过程,你可以改成你喜欢的控件面板名。
 
多人接受答案了。
 
后退
顶部