如何让事件触发的时候,内部外部都函数处理 ( 积分: 50 )

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

k2536

Unregistered / Unconfirmed
GUEST, unregistred user!
如果一个对象的事件在内部处理了,外部就不能再处理,只有一个函数能处理这种事件,因为DELPHI的事件处理机制是
对象.事件名 = 函数 这样就限制了一个事件只能由一个函数来处理,如果一个事件既要控件内部处理,又要控件外面处理就解决不了了,而C# 采用的是 对象.事件名 += 函数,这样一个事件可以由多个函数同时处理,我就设计就是采用的这种思想,到最后的时候发现DELPHI不支持一个事件的多外处理,这下玩完了,有没有解决的办法?
如例子
type
TmyButton = class(TButton)
private
procedure myclick(sender:TObject);
public
constructor Create(Aowner:TComponent);override;
end;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure myclick2(sender:Tobject);
public
{ Public declarations }
end;
constructor TmyButton.Create(Aowner:TComponent);
begin
inherited create(Aowner);
self.OnClick := self.myclick;
end;
procedure TmyButton.myclick(sender:TObject);
begin
showmessage('aaaaaaaaaaaaaaaaaaa');
end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
my:TMyButton;
begin
my := TMyButton.Create(self);
my.Parent := self;
MY.OnClick := self.myclick2;


end;
procedure TFORM1.myclick2(sender:Tobject);
begin
showmessage('bbbbbbbbbbbbbbb');
end;
自定义了一个控件TMyButton 对事件的内部处理是显示aaaaaaaaaaaaa 外面处理是显示bbbbbbbbb, 永远地,不能让 myclick1 和myclick2都执行,我就是这里玩死了,请各位救命哈
 
当然是可以的了,换一换思路就可以了
 
不一定要直接附值的嘛
 
type

TmyButton = class(TButton)
private
NoteEventList : TList ;
FOnClick2: TNotifyEvent;
procedure myclick(sender:TObject);
public
property OnClick2 : TNotifyEvent read FOnClick2 write FOnClick2;
constructor Create(Aowner:TComponent);override;
end;

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

var
Form1 : TForm1 ;

implementation
{$R *.dfm}

constructor TmyButton.Create(Aowner:TComponent);
begin
inherited create(Aowner);
self.OnClick := self.myclick;
end;


procedure TmyButton.myclick(sender:TObject);
begin
showmessage('aaaaaaaaaaaaaaaaaaa');
if Assigned(FOnClick2) then FOnClick2(sender) ;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
my:TMyButton;
begin
my := TMyButton.Create(self);
my.Parent := self;
MY.OnClick2 := self.myclick2;
end;

procedure TFORM1.myclick2(sender:Tobject);
begin
showmessage('bbbbbbbbbbbbbbb');
end;
 
有没有搞错啊,楼上的,你是想多定义一个事件来处理,如果一个类被包很多层,那么每包一层都要定义一个事件,全乱套了,看来DELPHI真的对此事没办法了
 
TmyButton = class(TButton)
private
procedure myclick(sender:TObject);
protected
procedure Click; override;
public
constructor Create(Aowner:TComponent);override;
end;

.....

procedure TMyButton.Click;
begin
myClick(Self);
inherited Click; //这里就会调用OnClick了(如果有的话)
end;

个人认为在控件内部不应该使用事件,应该通过继承
 
实现他的本意不难,关键就是本身语言就不支持那样的语法,当然是退而求次的了.使用观察者模式或者结合接口,不用事件那样的观念去做这事情也不是没有办法的,而且他还不明白我的本意~~
 
后退
顶部