簡體   English   中英

如何從不帶參數的函數中獲取對調用表單的引用

[英]How to get reference to the Calling Form from function without parameter

我有兩個項目。 一個是GUI,第二個是DLL。

我從Form1調用DLL中的函數

DLL函數必須連接表單(例如,更改背景色)

我想獲取Calling表單作為參考,而不必將其作為參數傳遞。

這是表格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獲得了引用調用表單的解決方案,並且現在在下面回答我自己的問題。

從設計的角度來看,這確實是一件壞事。

以這種方式設計應用程序存在許多嚴重的問題:

  • 您所依賴的是諸如環境上下文之類的東西,如果使用不正確,這將是一種反模式。 這是不正確使用的典型情況,原因是:
  • 您隱藏了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)

我最終使用調用了活動表單

Form.ActiveForm

以下功能現在可以使用(以及其他功能)

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

謝謝所有嘗試幫助的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM