C#事件与Delphi事件的⽐较
C#中的 事件就像在Delphi(或者我应该说 Object Pascal)中⼀样只是类的属性(properties)。事件是将调⽤委托给calling类的⽅法指针。
事件具有三个主要部分:
1. ⽅法指针属性(method pointer property)
2. 事件的触发
3. 事件处理程序(event handler)
public delegate void OnSomething(object Sender, int Value);
1. ⽅法指针属性。
Delphi 和 C# 有很多标准⽅法指针类型。最常见的 Delphi ⽅法指针类型是 TNotifyEvent。在 C#(或 .NET 框架)中,这是System.EventHandler。
您可以使⽤这些⽅法,但您也可以制作⾃⼰的⽅法。
定义⽅法指针类型:
在 C# 中:
public delegate void OnSomething(object Sender, int Value);
在 .NET 中,您当然可以将参数存储在(派⽣的)System.EventArgs 对象中。
Delphi中:
TOnSomething = procedure (Sender : TObject; Value : Integer) of Object;
它们只是使⽤它们的对象必须可⽤的类型。
想要引发事件的类必须有⼀个公共属性:
在 C# 中:
public event OnSomething BeforeSomething;
delphi中:
property BeforeSomething : TOnSomething read FBeforeSomething write BeforeSomething;
(Where FBeforeSomething is a private field of the same type)
2.触发事件delphi app
在此⽰例中,触发 BeforeSomething 事件。如果调⽤类已将属性分配给(事件)类,则该类可以触发它。
在 C# 中:
public virtual void LetItHappen()
{
// 类应该为事件添加⼀个有效的整数值,这⾥是 10
if (OnSomething!= null )
OnSomething(this, 10);
}
In Delphi:
procedure TSomeClass.LetItHappen;
begin
if Assigned(FOnSomething) then
FOnSomething(Self, 10);
end;
您必须检查该属性是否已分配,否则您将收到访问冲突。 C# 和 Delphi 的代码惊⼈地相似。如果你愿意,你可以让它更相似:
private bool Assigned(object AObject)
{
if (AObject != null)
return true;
else
return false;
}
the C# code then could be:
if Assigned(OnSomething)
OnSomething(this, 10);
3. The eventhandler
在能调⽤对象中,您应该⾸先创建⼀个事件处理程序⽅法: (假设能调⽤是 SomeObject : TSomeClass)
In C#:
private void MyBeforeSomething(object Sender, int Value)
{
MessageBox.Show(Value.ToString());
}
In Delphi:
procedure TSomeClass.MyBeforeSomething(Sender : TObject; Value :
Integer);
begin
ShowMessage(IntToStr(Value);
end;
您现在应该做的最后⼀件事是分配属性:
In C#:
SomeObject.BeforeSomething += new OnSomething(MyBeforeSomething);
In Delphi:
SomeObject.BeforeSomething := MyBeforeSometing;
⼀个完整的delphi⽰例如下:
program MQTest;
{$APPTYPE CONSOLE}
type
{ Define a procedural type }
TPingEvent = procedure of object;
{ The observed object }
TObservedObject = class
private
FPing: TPingEvent;
public
property OnPing: TPingEvent read FPing write FPing;
{ Triggers the event if anything is registered }
procedure TriggerEvent();
end;
{ The listener }
TListener = class
procedure Ping;
end;
procedure TObservedObject.TriggerEvent;
begin
{ Call the registerd event only if there is a listener }
if Assigned(FPing) then
FPing();
end;
procedure TListener.Ping;
begin
Writeln('TListener has been pinged.');
end;
var
ObservedObject: TObservedObject;
Listener: TListener;
begin
{ Create object instances }
ObservedObject := TObservedObject.Create();
Listener := TListener.Create();
{ Register the event handler }
ObservedObject.OnPing := Listener.Ping;
{ Trigger the event }
ObservedObject.TriggerEvent();//Should output 'TListener has been pinged' Readln; // Pause console before closing
end.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论