2014-10-06 46 views
0

我們有一個學校項目,我試圖將我們的代碼分成組。我將FormBorderStyle設置爲None,因此我可以修改它。但是,我可以使用另一個類來修改我的主要組件中的組件嗎? 一個例子是:通過另一個類修改主類的組件

Public Class main 
    Private Sub btn_title_bar_exit_Click(sender As Object, e As EventArgs) Handles btn_title_bar_exit.Click 
     Me.Close() 
    End Sub 
    Private Sub btn_title_bar_minimize_Click(sender As Object, e As EventArgs) Handles btn_title_bar_minimize.Click 
     Me.WindowState = FormWindowState.Minimized 
    End Sub 

End Class 

Public Class user_interface 
    'Modify components and the form through here 
    'example: btn_exit.ForeColor = Color.Black 
    'example: Me.Close() 
End Class 

也想知道,這是一個很好的方式來打破代碼?

+0

問題你必須問自己,這樣做的理由是什麼?您是否試圖從主窗體代碼中分離出格式和表示邏輯?假設控件屬性是公開的(我認爲它們在WinForms中是默認的),你可以這樣做,你只需要將表單的一個實例傳遞給你的'user_interface'類。儘管如此,你仍然可以將格式化代碼作爲主窗體的一部分 - 這取決於你想要實現什麼 – Charleh 2014-10-06 13:00:40

+0

你可能聽說過MVVM,這就是WPF/Silverlight等現代技術如何將演示和格式化代碼分離出來業務邏輯,但在WinForms中做起來可能不那麼容易,因爲WPF綁定機制是將演示文稿鏈接到MVVM邏輯層的完美「粘合劑」 – Charleh 2014-10-06 13:03:57

+0

如何傳遞實例? – 707 2014-10-06 13:31:19

回答

1

如果你只是想單獨程序(函數/方法/變量的聲明......),因爲你必須填寫您的類文件的代碼加載,只需使用:

1)Partial關鍵字

Public Partial Class MainClass 
    ' MAIN CONTENT 

    Public Sub New() 
     Me.InitializeComponents() 
     ' ... 
    End Sub 

    ' ... 
End Class 

,並在另一個文件:

Public Partial Class MainClass 
    ' USER INTERFACE HANDLERS... 

    'Modify components and the form through here 
    'example: btn_exit.ForeColor = Color.Black 
    'example: Me.Close() 

    ' ... 
End Class 

所以這是同一類,其他類可能無法訪問/修改其成員。

2)或要麼使用#Region分裂代碼和組它們:

Public Class MainClass 

    #Region "Instanciation..." 
    Public Sub New() 
     Me.InitializeComponents() 
     ' ... 
    End Sub 
    #End Region 

    #Region "User Interface..." 
     'Modify components and the form through here 
     'example: btn_exit.ForeColor = Color.Black 
     'example: Me.Close() 
     Public Sub btn1_Click(...) 
     Public Sub Picture1_MouseMove(...) 
    #End Region 

    #Region "Public Properties..." 
    '... 
    #End Region 

End Class 

然後使用正/負展開/摺疊的代碼的部分。



如果你真的想從另一個類,比如說,RemoteClass編輯MainClass的成員,也有噸方式這麼做了,要看是什麼究竟你想要做的。

你可以做一切你MainClass Public

找到您的窗體設計文件(包含窗體的所有控件的聲明的一個),每個申報轉變爲公共。

Private pictureBox1 As Picturebox 
' becomes 
Public pictureBox1 As Picturebox 

(或者只需點擊在IDE控制,並改變其進入等級爲public)

然後,如果你能在RemoteClass一個實例傳遞一個變量指向的MainClass一個實例,然後,通過RemoteClass,您可以訪問TheMainClassInstance.pictureBox1,並更改其大小,位置等所有內容。

那麼如何在RemoteClass中創建一個MainClass的實例?這取決於你的應用程序的結構...沒有細節,猜猜..我們必須猜測..!

Public Class RemoteClass 
    Private _InstanceOfMainClass As MainClass = Nothing 

    Public Sub New(ByRef NewInstanceOfMainClass As MainClass) 
     _InstanceOfMainClass = NewInstanceOfMainClass 
     ' ^^ this is one way doing it. 
     ' ... 
    End Sub 
    ' ... 

    Private Sub ChangeBackgroundColor() 
     _InstanceOfMainClass.picturebox1.BackColor = Color.Black ' and voila ! 
    End Sub 

End Class 

然後,您的RemoteClass中有一個MainClass。不要忘記處理_InstanceOfMainClass以避免內存泄漏(我假設你知道如何..)


MainClass有多少個實例?
如果它只是一個,並且您有幾個RemoteClass類,那麼您可以考慮將您希望作爲靜態(共享)成員訪問的MainClass的成員。

Public Class MainClass 
    Private Shared _MyInstance As MainClass = Nothing 

    Private Shared Sub InitializeMyInstance() 
     If _MyInstance Is Nothing Then 
      _MyInstance = New MainClass(...) 
     Else 
      If _MyInstance.IsDisposed Then 
       ' Requires an IDisposable interface 
       ' and handling of Me.Closed event elsewhere... 
       _MyInstance = Nothing 
       _MyInstance = New MainClass(...) 
      End If 
     End If 
    End Sub 

    Public Shared ReadOnly Property MyInstance() As MainClass 
     Get 
      InitializeMyInstance() 
      Return _MyInstance 
     End Get 
    End Property 

    Public Shared ReadOnly Property PictureBox1() As PictureBox 
     Get 
      Return MyInstance.pictureBox1 
     End Get 
    End Property 

    ' Create as many Properties as required... 

End Class 

然後在任何RemoteClass例如,您只要致電:

MainClass.PictureBox1.Width = 400 
MainClass.Close() 
MainClass.PictureBox1.Height = 200 

但正如我所說,這隻有當你只有MainClass的單​​個實例。


如果您有幾個MainClass實例和多個RemoteClass實例,請考慮使用唯一ID和靜態函數/屬性來訪問特定實例。

如何創建ID?

Public Class MainClass 
    Private Shared _NextID As Integer = 0 
    Private _ID As Integer 

    Public ReadOnly Property ID() As Integer 
     Get 
      Return _ID 
     End Get 
    End Property 

    Public Sub New(...) 
     Me.InitializeComponents() 
     ' ... 
     _ID = _NextID 
     _NextID = _NextID + 1 
    End Sub 

    ' ... 
End Class 

則...創建一個包含所有的ID排序列表:

Public Class MainClass 

    Private Shared _IDsList As New SortedList(Of Integer, MainClass) 

    ' then edit your New() method : 
    Public Sub New(...) 
     Me.InitializeComponents() 
     ' ... 
     _ID = _NextID 
     _NextID = _NextID + 1 
     _IDList.Add(_ID, Me) 
    End Sub 

    ' ... 
End Class 

然後創建一個靜態函數由它的ID來獲得MainClass的具體實例。

Public Class MainClass 

    ' ... 

    Public Shared Function GetInstanceByID(ByVal iID As Integer) As MainClass 
     If _IDList.ContainsKey(iID) Then 
      Return _IDList.Item(iID) 
     Else 
      Return Nothing 
     End If 
    End Function 

    ' ... 

    ' And create the appropriate Dispose() method 
    ' the appropriate Clear() method 
    ' the appropriate FormClosing events handlers 
    ' etc. etc. etc. 

End Sub 

的事情是,我們不知道什麼是你的MainClass的目的呢,爲什麼RemoteClass實例具有順便說一下?控制,變量,添加/刪除控件修改MainClass成員(成員? )

+0

我寧願使用區域,在你回答之前還沒有知道它,而且你很高興能夠爲我的問題提供選擇,我可能稍後會使用其他方法......保持它!謝謝! – 707 2014-10-08 10:03:14