【问题标题】:How to get reference to the Calling Form from function without parameter如何从没有参数的函数中获取对调用表单的引用
【发布时间】:2017-09-22 13:35:06
【问题描述】:

我有两个项目。一是GUI,二是DLL。

我在 Form1 的 DLL 中调用 函数

DLL 函数必须与表单接口(例如,更改背景颜色)

我想获取调用表单作为参考,而不作为参数传递。

这是表格 1 中的示例

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ChangeBackColor()
End Sub

DLL 函数

Public Sub ChangeBackColor()
  Dim CallingForm as Form
  '''GET PARENT HERE'''
  CallingForm.BackColor = Color.Cyan
End Sub

显然,如果我每次都通过 Form,我可以做到这一点,但尽量避免这种情况。 提前致谢

有人注意到此问题已在其他地方得到解答。据我所知,它还没有被回答(或被问到)。这特定于引用表单,而不是方法或其他对象。

我已经通过引用 Form.ActiveForm 获得了引用调用表单的解决方案,现在我在下面回答我自己的问题。

【问题讨论】:

  • 为什么需要从 Form 调用 DLL 方法来更改 Form 的背景色?
  • 简答:否。长回答:可能与IS there any way to get a reference to the calling object in c#?重复
  • @Plutonix 这只是一个例子。真正的代码要大得多,和颜色无关,但参考原理是一样的
  • 但如果你必须知道.. DLL 会截取调用它的应用程序的屏幕截图。我需要让表单找到它的大小和位置,这样屏幕截图就不是全屏的。这个dll会在其他应用程序中使用,所以它与应用程序是分开的

标签: c# vb.net dll


【解决方案1】:

从设计的角度来看,这确实是一件不好的事情。

以这种方式设计您的应用程序存在许多严重问题:

  • 您依赖于诸如环境上下文之类的东西,如果使用不当,这是一种反模式。这是一个典型的错误使用案例,原因是:
  • 您隐藏了ChangeBackColor 函数依赖于调用该方法的表单的事实!!如果其他代码块正在调用此代码怎么办?代码会失败!!

最后一点尤其成问题,因为这使得对这段代码进行单元测试非常困难并且容易出错。方法签名都是关于传达函数的意图,因此还需要告诉它需要哪些东西(对象、值、服务等)来执行工作。

因此,如果函数中需要表单或任何对象,请在签名中显示!

如果您不喜欢在每次调用中都需要添加它,您可以通过将代码创建为扩展方法来美化代码:

Public Module FormExtensions
   <Extension>
   Public Sub ChangeBackColor(form as Form, newBackColor as Color)
        form.Backcolor = newBackColor
   End Sub
End Module

您在表单实例中这样称呼它:

Me.ChangeBackColor(Color.Red)

【讨论】:

  • 背景色只是说明我想要达到的目的的例子,而不是实际问题。我真的需要这个来获取调用表单的位置和大小,并将其设置为 DLL 中新表单的父级。另外,我不在乎这种情况下的良好做法,我只需要这个工作
  • 本质上,我想要一个像 FOO() 这样的函数,然后引用父级的公共属性(大小、位置、自身)。这样我就可以将 DLL 表单与调用表单重叠在同一屏幕上
【解决方案2】:

我最终通过使用来调用活动表单

Form.ActiveForm

以下功能现在可以工作(与其他功能一起)

Public Sub ChangeBackColor()
  Dim CallingForm as Form
  '''GET PARENT HERE'''
  CallingForm = Form.ActiveForm
  CallingForm.BackColor = Color.Cyan
End Sub

感谢所有尝试帮助的人

【讨论】:

    猜你喜欢
    • 2017-12-27
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多