【发布时间】:2020-04-09 20:27:58
【问题描述】:
- 我有一个具有固定大小和一些控件的表单(名为 Form1)。
- 我创建了另一个表单(名为 Form2),它是 Form1 的副本,唯一的区别是固定大小不同。
- 我创建了一个“SharedForm”表单,其中包含两个表单使用的子项和函数(因此我不必为每个表单编写它们)。
我的问题是:我不知道如何为任何一种形式保留参考(一次只有一个,永远)。
如果我将 FormRef 变量声明为 Form,则会收到“label1 不是表单成员”的错误消息。 (否则,如果我声明为 Form1 或 Form2 它可以正常工作,但当然只适用于一种形式)
SharedForm 如下所示:
Public Class SharedForm
Public Shared FormRef As Form 'problem is here
Private Sub SharedForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FormRef = New Form2
FormRef.Show()
End Sub
Public Shared Sub Button1_Click(sender As Object, e As EventArgs)
FormRef.Label1.Text = "test"
End Sub
End Class
Form1 和 Form2 是这样的。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler Button1.Click, AddressOf SharedForm.Button1_Click
End Sub
End Class
Public Class Form2
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler Button1.Click, AddressOf SharedForm.Button1_Click
End Sub
End Class
【问题讨论】:
-
当 Form1 可以同时完成两者的工作时,为什么要创建一个新的 Form 类并不明显。第二个实例只需要不同的 Size 值。
-
@HansPassant 这是因为它更容易处理设计方面的问题,它不是标准形式而是复杂的形状,按钮甚至是单独“制作”的。将所有内容设置在应有的位置和使用另一种形式的动画会更容易。
-
@CruleD 您对使用
Option Strict Off感觉如何?如果你没问题,你可以简单地将FormRef声明为Object。 -
SharedForm是由其他两种形式共享的基础Form类,还是只是一个辅助类,其他两种形式中的每一个都包含一个实例?无论哪种方式,这似乎都是以两种形式共享功能的自然场所。事实是,如果它不是基于共享的类,它可能应该是,那么Label1可以在该类中,并且您的FormRef可以声明为该类型。不幸的是,您的问题缺少minimal reproducible example,因此太模糊而无法实际回答。 -
@JayV - 请不要建议
Option Strict Off。你不妨说Run With Scissors。