怎样访问其他窗体中控件的方法

edreamy 2002-05-28 04:31:41
在A窗体中要调用B窗体中的一个控件的方法,怎样才能实现呢?
...全文
105 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
edreamy 2002-06-02
  • 打赏
  • 举报
回复
用New就是实例化一个类的实例,这是没有什么需要怀疑的,所以你的想法有点偏差。
sumtec 2002-06-02
  • 打赏
  • 举报
回复
edreamy(梦缘居士) :
请你再看清楚一点我的例子!!!!!!
另外,请你:
解决方案资源管理器->WindowsApplication1(右击)->属性->启动对象(S)->Sub Main
然后在运行一下我的例子!

'Module1.vb
Module Module1
Public Frm1 As New Form1() '这里是Form1类的第一个实例
Public Frm2 As New Form2() '这里是Form2类的第一个实例
'-----------------------------------------------------
'我要问你,难道你在我的例子里面还看到任何一个新的实例吗?
'或者说你还能看到一句 New Form1()?
'如果你用Sub Main() 作为启动对象,那么任何一个窗口都需要你自己手动去实例化第一个对象!!
'也就是说VB并不会为你自动生成哪一个类的实例!
'_____________________________________________________
Sub Main()
Frm1.Show()
Application.Run(Frm1)
End Sub
End Module

'Form1.vb
Public Class Form1
...
Friend Button1 As New Button() ' 界面设计器自动生成的部分。
Sub Using_Frm2_Button2()
Debug.Writeline(Frm2.Button2.Name)
End Sub
End Class

'Form2.vb
Public Class Form2
...
Friend Button2 As New Button()
Sub Using_Frm1_Var1()
Debug.Writeline(Frm1.Button1.Name)
End Sub
End Class
edreamy 2002-06-01
  • 打赏
  • 举报
回复
多谢各位了,不过你们说得都不对,都不能解决我的问题。既然我已经打开了窗体,那么它必然已经被实例化,你们还用New的话,怎么对这个已经实例话的窗体实例访问,也许我的概念真的不太清楚,但我绝不会用New一个窗体实例后去访问一个已经实例化的窗体实例。非常感谢Dlmhtao的帮助,也对楼上各位表示感谢!
phoenixv 2002-06-01
  • 打赏
  • 举报
回复
我觉得你应该找找有这样的类,就是能够得到正在运行的程序的实例,我想应该是在system下面吧。我记得java里面就有这样的功能,可以直接访问同时运行的实例。还有一个问题就是使用new并不一定是构造了一个实例,实际上实例的这个概念和c里面的指针差不多,你再frm1里面构造了frm2实例,实际上是建立了一个对frm2的引用,而不是建立了一个新的frm2,不知道我的说法对不对,如果不对的话,希望大家更正。谢谢。我是个新人,还什么都不懂呢:)
我不是天才。
shine 2002-05-30
  • 打赏
  • 举报
回复
既然已经打开,就更方便啦。
当然,你必须搞清楚:form2 是谁打开的,你又打算在哪里访问:

if 你想从打开form2的过程里(比如是 form1.P1()过程)访问form2的话 then
直接在P1()里写 form2.button.text
elseif 你想从别的过程(比如form1.P2())里访问的话 then
你就必须把form2定义成该form1的全局变量,就是说在form1的最前面
定义:
dim frm as form2
然后这个 frm 变量就可以在 form1 的所有过程里使用了。
即使是在form1.p1()里打开的,比如 :
frm = new form1()
frm.show()
在form1.p2()里也可以这样访问:
msgbox (frm.button.text)
elseif 你想在第三个窗体(比如:form3)里访问form2 then
就得另外生成一个全局模块,用来装这个系统的全局变量,在里面的变量可以在所有的地方访问:
public frm as form2
然后即使是你在 form1 里打开的 ,在 form3 里也可以这样访问:

msgbox(frm.button.text)

end if

看来你的面向对象的抽象能力还不够理解这些,楼上的兄弟们都已十分清楚的说明了,你就是没有耐心,不用心理解,还以为我们不清楚。
你的态度真有问题。
edreamy 2002-05-29
  • 打赏
  • 举报
回复
你怎么就不明白呢,我的两个窗口都已经打开了,你再声明一个New又有什么意义,我是要对已经显示出来的窗体中的控件访问,如果是对新窗体中的控件的访问就不用提问了。
edreamy 2002-05-29
  • 打赏
  • 举报
回复
你试试能访问吗,不要只凭想象。具体一点的代码,在A中有一个Button,在B中也有一个Button,现在我在B中写Button的Click事件,要得到A中Button的Name属性,要用A.Button.Name吗?你先试一试,别急着回答抢分,能行的一定有分的。
sumtec 2002-05-29
  • 打赏
  • 举报
回复
正规方法:

'Module1.vb
Module Module1
Public Frm1 As New Form1()
Public Frm2 As New Form2()

Sub Main()
Frm1.Show()
Application.Run(Frm1)
End Sub
End Module

'Form1.vb
Public Class Form1
...
Friend Button1 As New Button() ' 界面设计器自动生成的部分。
Sub Using_Frm2_Button2()
Debug.Writeline(Frm2.Button2.Name)
End Sub
End Class

'Form2.vb
Public Class Form2
...
Friend Button2 As New Button()
Sub Using_Frm1_Var1()
Debug.Writeline(Frm1.Button1.Name)
End Sub
End Class



edreamy(梦缘居士) :
请先弄清楚你所说的窗体到底是指窗体的类呢,还是那个类的实例?否则你会有很多概念性的问题,会很混乱的。
VB.NET 里面的 Public Class Form1 中的 Form1 已经不是VB6里面的那个 Form1 了!! VB6里面的Form1既是类,又是实例。 VB.NET 里面的 Form1 仅仅是一个类,你不能直接访问类里面的成员,而只能产生一个类的实例,然后访问该实例的成员。比如:

Class A
Public Member As Integer
End Class

Debug.WriteLine(A.Member) ' 错!!!(其实也有可以这么用的特例——Shared成员,只是你现在先当他是错的比较好,以免混淆概念。)

Dim B As A = New A()
Debug.WriteLine(B.Member) ' 对!!!

如果你不懂我说什么,请你回忆一下这个:
Type A
Member As Integer
End Type

Debug.Print(A.Member) ' 错!!!

Dim B As A
Debug.Print(B.Member) ' 对!!!


Sumtec宇宙技术中心 VB技术支持
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利,并保持和微软所提供的条款一致。具体事项可参考微软公司的使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
(因为比较紧急,没有制作自己的网页,敬请见谅。谢谢使用!)
bhhxd 2002-05-29
  • 打赏
  • 举报
回复
怎么不可以呢?
请看如下代码:(form1中)
Dim frm2 As New Form2()
Debug.WriteLine(frm2.Button1.Text)
frm2.Show()
Debug.WriteLine(frm2.Button1.Name)
Form2中有一个Button 名为Button1
在这里没有用ShowDialog是因为可以立刻看到输出窗口的代码

jon_bon_jovi 2002-05-29
  • 打赏
  • 举报
回复
把两个窗体设为friend就可以了
bhhxd 2002-05-28
  • 打赏
  • 举报
回复
窗体中的控件默认是Friend类型的,所以只要这个窗体打开,其他窗体就可以访问他的控件的属性,但控件的方法默认是Private,所以只要将方法改为Public类型就可以了。
最好不要直接访问控件的方法,因为需要设定参数(sender,e),可以将其中的程序段单列在一个自定义Public方法中,然后调用。
如果要访问一个已经存在的窗体,但又没有一个变量指向它,可以按照如下方法获得变量:
创建一个窗体集合类,元素为窗体对象,每打开一个窗体,在类中添加一个元素,关闭一个窗体则删除该元素。
遍历该集合即可获得指向该窗体的变量。
edreamy 2002-05-28
  • 打赏
  • 举报
回复
你是新生成了一个窗体实例,你觉得使用中这种情况多吗?我是已经打开了那个窗体,进程中已经有了窗体的实例,不能在新生成一个窗体了,要访问这个窗体中的控件。
shine 2002-05-28
  • 打赏
  • 举报
回复
哦,搞错了,应该是:

dim frm as B = new B
frm.oper()
shine 2002-05-28
  • 打赏
  • 举报
回复
B窗体的该控件定义成 Public ,该方法(比如:Oper())也定义成 Public ,然后在A窗体中:

dim frm as B = new B
b.oper()

就可以了,不一定要显示B窗体的。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧