Vb.net 如何使事件在对象';s的构造函数完成了吗?
研究告诉我,从构造函数本身引发事件是不可行的,因为对象可能没有完全初始化。。。那么,一旦构造函数被激发,我可以从哪里激发事件呢?您可以使用所示构造函数中的加载或显示事件Vb.net 如何使事件在对象';s的构造函数完成了吗?,vb.net,events,constructor,Vb.net,Events,Constructor,研究告诉我,从构造函数本身引发事件是不可行的,因为对象可能没有完全初始化。。。那么,一旦构造函数被激发,我可以从哪里激发事件呢?您可以使用所示构造函数中的加载或显示事件 Private Sub myForm_Shown(sender As Object, e As EventArgs) Handles Me.Shown End Sub 或 您可以做的一件事是添加一个方法来处理其他post任务: Friend Class FooBar Public Sub New
Private Sub myForm_Shown(sender As Object, e As EventArgs) Handles Me.Shown
End Sub
或
您可以做的一件事是添加一个方法来处理其他post任务:
Friend Class FooBar
Public Sub New
' your code here
End Sub
Public Sub Create
' do anything you want
End Sub
End Class
其他地方:
Friend WithEvents Foo As Foobar
' ...
Foo = New FooBar ' Foo doesnt exist until ctor code executes and the
' code returns to here.
Foo.Create ' do whatever you like, as long as any other
' objects referenced have been created.
从ctor调用sub来引发事件无法与类一起工作的原因如下:
Private Sub SomeEvent(sender As Object, e As EventArgs) Handles Foo.SomeEvent
Console.Beep()
End Sub
关键是处理Foo.SomeEvent
没有Foo
处理该事件。它不会崩溃,也不会引发事件,但侦听器没有对象来捕获/处理事件。在InitializeComponents
中创建了足够多的表单,它可以与表单一起工作
也可能有一个接口来实现类似的东西,我知道有些接口用于组件,但不用于类。您可以通过向构造函数添加一个参数并在最后一行调用委托来实现这一点
Public Class Foo
Public Sub New(ByVal action As Action(Of Foo))
'...
'...
'...
If (Not action Is Nothing) Then action.Invoke(Me)
End Sub
End Class
示例
Public Class Form1
Private Sub Button1_Click(sender As Object, ev As EventArgs) Handles Button1.Click
Dim foo1 As New Foo("foo1", AddressOf Me.HandleFooCtor)
Dim foo2 As New Foo("foo2", Sub(f As Foo) MessageBox.Show(f.Name))
End Sub
Private Sub HandleFooCtor(f As Foo)
MessageBox.Show(f.Name)
End Sub
Public Class Foo
Public Sub New(name As String, Optional ByVal action As Action(Of Foo) = Nothing)
'...
'...
'...
Me.Name = name
If (Not action Is Nothing) Then action.Invoke(Me)
End Sub
Public ReadOnly Name As String
End Class
End Class
这是一个控件、组件还是一个基本类?@puropoix抱歉-只是一个类,您是在处理类似
初始化的事件吗?谁是听众?这就是我一直在寻找的。。。。我正在为一个战斗游戏创建角色,该游戏在日志中报告类内事件生成的动作,例如成功攻击对手或死亡,但我想为角色重生生成日志条目。显然,它不必在构造函数中触发,但我希望它是内部的,并且在对象实例化完成后立即发生。在这种情况下,为什么不直接或通过方法添加日志条目呢?事件侦听器就是问题所在。e、 gLog.AddLine(“巨型死亡机器人创造…”
是的,这基本上就是我的研究得出的结论。当我试图在New()中引发该事件时,什么也没发生。很好的解决办法,虽然不是我想要的,但至少保持封装,谢谢!
Public Class Form1
Private Sub Button1_Click(sender As Object, ev As EventArgs) Handles Button1.Click
Dim foo1 As New Foo("foo1", AddressOf Me.HandleFooCtor)
Dim foo2 As New Foo("foo2", Sub(f As Foo) MessageBox.Show(f.Name))
End Sub
Private Sub HandleFooCtor(f As Foo)
MessageBox.Show(f.Name)
End Sub
Public Class Foo
Public Sub New(name As String, Optional ByVal action As Action(Of Foo) = Nothing)
'...
'...
'...
Me.Name = name
If (Not action Is Nothing) Then action.Invoke(Me)
End Sub
Public ReadOnly Name As String
End Class
End Class