1

我真的在这里为某些事情苦苦挣扎。我有一个类模块,我们称之为 FormMan,它有一堆与我项目中的大量用户表单相关的方法。一种特殊的方法可以从很多不同的地方调用,而且非常简单——它只是将用户定义的控件数量添加到表单并扩展表单高度以适应这些新控件。

用户传递控件的数量和用户窗体。

oF.AddControlsToForm iNumberOfControls,frmTest

在 FormMan 类模块中:

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

在 Locals 窗口中,oForm 没有高度属性,所以很公平。但 oForm 已被定义为 frmTest。我可以说oForm.BackColor = vbred,我可以设置ctl = oform.TextBox1例如

这是一个通用过程,可以将一堆控件添加到任何形式。在将表单分配给 oForm 之前,我已经尝试加载并显示表单。

为什么用户窗体的高度和显示属性和方法,而不是声明为用户窗体的对象?我究竟做错了什么?

非常感谢任何帮助。

4

2 回答 2

4

这里的问题是 UserForm 和 frmTest 对象不是同一类型。事实上,frmTest 是 UserForm 的一个子类型,它通过添加 Height 属性以及其他成员来扩展它。

您可能不得不求助于将您的函数参数声明为 Object。

Public Sub Addcontrols(iNum as integer, oForm as Object)

这应该可以按您的意愿工作,尽管不幸的是您会牺牲类型安全。大多数 OO 概念在 VBA 的上下文中往往会分崩离析。

于 2009-02-12T21:17:15.710 回答
1

关于 VBA,首先要记住的是它是准 OO,而不是完全 OO。我在这个问题上遇到了很多古怪的问题,所以我现在倾向于避免完全依赖 VBA 的一致性。

话虽如此,试试这个:

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

是不是很诡异?!?!我没有准备好等待的代码示例,所以我不能保证成功,但这感觉是正确的方法。

于 2009-02-12T21:20:51.287 回答