Vb.net 通过子控件引用窗体上的控件';s参数
对于VisualBasic类的最后一个项目,我正在制作一个Windows窗体版本的战舰(我称之为“NavalQuest”:p)。每个玩家的棋盘都有一个表格,我有一个.vb文件用于公共共享信息。在这个文件中,我有一个名为“Place”的公共共享子文件,在放置船只时调用它。以下是我必须领导的小组:Vb.net 通过子控件引用窗体上的控件';s参数,vb.net,Vb.net,对于VisualBasic类的最后一个项目,我正在制作一个Windows窗体版本的战舰(我称之为“NavalQuest”:p)。每个玩家的棋盘都有一个表格,我有一个.vb文件用于公共共享信息。在这个文件中,我有一个名为“Place”的公共共享子文件,在放置船只时调用它。以下是我必须领导的小组: Public Shared Sub Place(ByRef form As Form, ByRef board(,) As PictureBox, ByRef picbox As PictureBox)
Public Shared Sub Place(ByRef form As Form, ByRef board(,) As PictureBox, ByRef picbox As PictureBox)
其中,“form”是从中调用Sub的形式(p1或p2),“board(,),”是实际board的图片框的2D数组,以及“picbox”,用户希望在其上放置相关船舶的图片框
用户选择“水平”或“垂直”单选按钮,该按钮与船的方向一致。子系统将检查单击的是哪一个。这就是为什么我有一个“form”参数来引用单选按钮所在的表单,因为我不能直接从global.vb文件中引用它。但是,当计算机读取:
form.radhoriz.checked
在我尝试运行之前,它会出错,因为“radhoriz”显然不是Windows.System.Forms.Form的属性。它不明白我要的是窗体上的控件,而不是窗体本身的属性。即使我在“radhoriz”的每个表单上创建一个属性,错误仍然存在,因为“radhoriz”将是“p1board”和“p2board”(表单名称)的属性,而不是Windows.System.Forms.form
我尝试将参数的数据类型更改为一个对象。没有出现任何蓝色的错误行,所以我运行了应用程序。运行时错误的原因与以前相同
这有什么办法吗?我想我可以为我引用的表单的所有控件添加参数,但这是唯一的方法吗?谢谢你的帮助
-Ryan忽略了这是一个可怕的整体设计。。。 *不过,这并不意外,因为你是一名学生 在您的参数签名中 更改:
ByRef form As Form
致:
其中“frmName”是玩家棋盘表格的名称
另外,将所有ByRef都更改为ByVal。您可能应该更改应用程序名称的拼写,以免一些毫无戒心的用户认为他们在探索肚脐。令人尴尬的拼写错误已修复:)哦,忘了表单名称会变成它自己的对象类型!谢谢是的,我只是把它当作ByRef,因为我不确定我是否会在表格上做任何更改。出于好奇,有什么更好的设计?设计是我整体lol中最薄弱的一点,希望在这方面有所改进!实际上,请注意,这种方法实际上不起作用,因为Sub是从两种不同的形式调用的…因此从玩家二的形式调用它将检查玩家一的形式上的单选按钮,反之亦然…更好的方法是将游戏表示和逻辑与UI分离。创建一个类来保存游戏的状态,然后针对该状态调用方法。表单只显示当前状态。至于最后一个问题,有几种方法。(1) 使窗体实现一个接口,然后将类型更改为该接口;(2) 使用Controls.Find()搜索具有正确名称的控件;(3) 使用反射来访问控件。我现在只想使用controls.Find()函数,如果我有足够的时间,可能会考虑升级设计哈哈…非常感谢!
ByRef form As frmName