[英]Control as parameter on delegate method
我不确定如何处理该问题的标题,因此我将描述自己的处境,希望我能清楚自己的疑问。 (如果对标题有更好的建议,我将其更改)
在过去的几天里,我一直在阅读有关使用该方案的多线程和GUI控件修改的信息。 我的问题涉及将控件更改为我的委托和方法的参数。 假设我有一个ListView1,我想向它添加一个组(这是一种简单的体验,几乎没有代码)
根据我所看到的例子,做到这一点的方法是
Private Delegate Sub ResultsAddGroup_Delegate(ByVal FondsGroup As ListViewGroup)
Private Sub ResultsAddGroup(ByVal FondsGroup As ListViewGroup)
If Me.ListView1.InvokeRequired Then
Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup)
Dim ParamArgs() As Object = New Object() {FondsGroup}
Me.ListView1.BeginInvoke(d, ParamArgs)
Else
Me.ListView1.Groups.Add(FondsGroup)
End If
End Sub
我通常喜欢将控件作为参数传递,以使代码清晰,并使方法或函数远离特定的控件对象。 如果我想将ListView作为上述情况的参数传递,如下所示:
Private Delegate Sub ResultsAddGroup_Delegate(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup)
Private Sub ResultsAddGroup(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup)
If LView.InvokeRequired Then
Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup)
Dim ParamArgs() As Object = New Object() {LView, FondsGroup}
LView.BeginInvoke(d, ParamArgs)
Else
LView.Groups.Add(FondsGroup)
End If
End Sub
对于多线程和控制更改目的,这将代表任何类型的问题吗? 如果是这样,是否有另一种方法可以不指定控件呢?
另一方面,我通常做方法的方式是否有问题(如上所述,将控件作为参数传递)?
谢谢
我本人在一些项目中使用了第二种模式。 似乎可以完成此工作,因为Ctrl.InvokeRequired是线程安全的。 使用控件作为参数很好,因为它只是一个对象引用。
我认为在第一个代码块中,对象数组初始化中有一个小错误,这是有意的:
Dim ParamArgs() As Object = New Object() {FondsGroup}
但是如果我丢失了一些东西,我会犹豫是否更改它:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.