我想创建一个vb程序,在选项按钮中预定义多个选项的标签中询问随机问题。每个问题和多个选择应该在特定的子程序中。因此,如果要问10个问题,那么问题将有10个子程序。由于我希望在没有特定顺序的情况下随机询问问题,我想将问题子程序放在一个数组中,我可以使用randomize函数随机调用这些程序。
即将这两个子程序放入数组
private sub question1()
lblquestion.caption = "What is 1 + 1"
opt1.caption="A. 2"
opt2.caption="B. 3"
end sub
private sub question2()
lblquestion.caption = "What is 5 + 1"
opt1.caption="A. 4"
opt2.caption="B. 6"
end sub
答案 0 :(得分:3)
(这个答案的大部分都是从我的other answer on calling a function by its name as a String复制的,虽然这个问题可能有些重复,但有些人可能会发现在这种情况下描述解决方案也很有帮助。)
VB6在很多方面都是面向对象的语言。即使它在某些方面可能没有像C#或Java那样多的面向对象,它确实支持多个类和多态。因此,如果您想要在运行时选择其中一个实现,那么您显然只想拥有多个类,并选择运行时使用哪个对象。
实际上,VB6甚至可以让你定义真实的实际接口。 (它们碰巧看起来像任何其他类模块,但在函数中没有任何内容。)创建一个用于您的接口的类模块,比如名为MyInterface
:
Public Sub DoStuff()
End Sub
然后,创建十个类模块,每个模块用于接口的每个可能实现:
在MyClassOne
:
Implements MyInterface
Public Sub MyInterface_DoStuff()
Msgbox "I'm function one"
End Sub
然后,在MyClassTwo
中,同样的事情,但另一个实现:
Implements MyInterface
Public Sub MyInterface_DoStuff()
Msgbox "I'm function two"
End Sub
等等。您要创建的数组不是方法,而是实现定义的接口的对象:
Dim MyObjects(10) As MyInterface
Set MyObjects(1) = New MyClassOne
Set MyObjects(2) = New MyClassTwo
' and so on
现在,你可以找出你想要的实现,然后调用它:
Dim WhichObject As Integer
WhichObject = SomehowSelectANumber()
MyObjects(WhichObject).DoStuff
要在MSDN库中进一步阅读:
答案 1 :(得分:0)
我设法通过使用决策制定声明的@ bob77想法找到一种更简单的方法。我选择使用精选案例作为可能的解决方案,当然还有它的简单性。然而,我摆脱了阵列(猜测这将不再回答问题,但仍将实现预期)。这是代码。
dim q as integer
private sub cmdask_click()
Randomize
q = int((rnd * 10)+1)
select case q
case 1
call question1
case 2
call question2
'and so on..
End select
然而,最大的限制是代码真的很笨重(假设程序有100个问题)而且重复问题也是一个问题(我学习者不知道如何处理如果有人会建议一个能够处理重复和繁琐的代码,我将非常感激。(是的,我知道可能已经回答了有关重复和庞大的问题。我只想为这个帖子提供更多自定义代码。)