如何在vb.net的单独类文件中为表单加载创建共享函数

如何在vb.net的单独类文件中为表单加载创建共享函数,vb.net,class,function,Vb.net,Class,Function,我希望在一个单独的类文件中有一个共享函数来处理表单位置。 但是我不知道我怎样才能让它工作。 如果我在我的表格中使用下面的代码,它将起作用。但我不能将其移动到类文件中 Shared Sub Formlocation() Me.StartPosition = FormStartPosition.Manual Me.Location = Screen.GetWorkingArea(Me).Location End Sub 不能从类实例外部访问表

我希望在一个单独的类文件中有一个共享函数来处理表单位置。 但是我不知道我怎样才能让它工作。 如果我在我的表格中使用下面的代码,它将起作用。但我不能将其移动到类文件中

     Shared Sub Formlocation()
         Me.StartPosition = FormStartPosition.Manual
         Me.Location = Screen.GetWorkingArea(Me).Location
     End Sub

不能从类实例外部访问表单实例“Me”

将函数更改为参数化子函数,并在调用子函数时传递表单实例

Shared Sub Formlocation(ByVal frm As Form)
    frm.StartPosition = FormStartPosition.Manual
    frm.Location = Screen.GetWorkingArea(frm).Location
End Sub

另一种方法可以是扩展方法(.NET 3.5及更高版本)

听起来您可能想拥有一些表单所共有的功能

如果是这种情况,您可能需要考虑创建继承自<代码>窗体< /代码>的基类,使每个可应用的窗体继承此,然后从窗体调用该方法。< /P> 例如,以下是基本表单的示例:

Public Class MyBaseForm
    Inherits Form

    ' Contains standard sizing logic, but can be overridden by inheritors
    Protected Overridable Sub InitializeFormLocation()
        Me.StartPosition = FormStartPosition.Manual
        Me.Location = Screen.GetWorkingArea(Me).Location
    End Sub

    ' An optional method for initializing the form location that will be automatically implemented for all child forms
    Private Sub MyBaseForm_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Call InitializeFormLocation()
    End Sub
End Class
下面是一个子窗体的示例

Public Class MyForm1
    Inherits MyBaseForm

    ' An optional way for the child forms to call the method
    Private Sub DoInitialization()
        Call MyBase.InitializeFormLocation()
    End Sub
End Class

仅供参考,
frm
不应通过
byref
传递,除非您计划在方法中创建它的新实例。由于它是一个对象,它无论如何都会传递一个引用,还是不传递?是的,对象是通过引用传递的,但您所做的是将引用传递给原始变量,这通常不是一个好的做法。问题是,如果被调用的方法修改变量本身的值(即
frm=newform
),这将通过byref传播回调用方。如果参数不是byref,则赋值将严格地局限于方法。