UserForm.Caption 有什么问题?

问题描述

有VBA编码经验的人可以解释一下这种疯狂吗!

@MockBean(classes = BaseTests.Service.class)
class MockBeanTests extends BaseTests {

    @BeforeEach
    void setUpMock() {
        when(service.getMessage()).thenReturn("mock");
    }

    @Test
    @Override
    void service() {
        assertThat(service.getMessage()).isEqualTo("mock");
    }

}

为什么 thisForm 在我询问它的一个控件之前不知道它的标题? 我从调用嵌套在模块中的过程的形式的命令按钮执行此操作

解决方法

这似乎是由于基类的属性没有正确映射到子类属性的错误造成的!

ACADProject.FormENU 继承自 MSForms.UserForm。它比 MSForms.UserForm 具有更多的属性和方法,但它is a MSForms.UserForm,因此它可以存储在类型为 MSForms.UserForm 的变量中。

看起来在内部 MSForms.UserForm 及其子类(由用户设计的实际用户表单)被实现为不同的对象,其中基虚拟对象的属性返回任何实际派生对象返回的属性(其中使它看起来更像是上面链接中的 has-a,而不是 is-a)。
并且似乎映射 MSForms.UserForm 的所有属性以返回实际子类的相应值的人忘记了映射 Caption 属性:

Dim FormAsSelf As UserForm1
Dim FormAsForm As MSForms.UserForm
Dim FormAsObject As Object

Set FormAsSelf = New UserForm1
Set FormAsForm = FormAsSelf
Set FormAsObject = FormAsSelf

Debug.Print "Caption from self: ",FormAsSelf.Caption,TypeName(FormAsSelf),ObjPtr(FormAsSelf),TypeOf FormAsSelf Is UserForm1
Debug.Print "Caption from form: ",FormAsForm.Caption,TypeName(FormAsForm),ObjPtr(FormAsForm),TypeOf FormAsForm Is UserForm1
Debug.Print "Caption from object: ",FormAsObject.Caption,TypeName(FormAsObject),ObjPtr(FormAsObject),TypeOf FormAsObject Is UserForm1

Unload FormAsSelf
标题 标题 类型名称 对象地址 UserForm吗?
来自自己的标题: 用户表单1 用户表单1 4144272 真的
来自表单的标题: 用户表单1 96261568 真的
来自对象的标题: 用户表单1 用户表单1 4144272 真的

其他属性似乎已正确映射,因此如果您设计一个粉红色背景的表单并请求 .BackColor 而不是上面代码中的 .Caption,您将得到所有三个相同的答案(实际上是两个)表格的“侧面”:

标题 背景色 类型名称 对象地址 UserForm 吗?
来自自己的标题: 16744703 用户表单1 4144272 真的
来自表单的标题: 16744703 用户表单1 96261568 真的
来自对象的标题: 16744703 用户表单1 4144272 真的

如相关问题下的 in a comment 所述,整个继承情况类似于 Sheet1Worksheet 之间的关系。然而,这些似乎在内部实现不同,所以只有一个“方面”开始:

Dim SheetAsSelf As Sheet1
Dim SheetAsSheet As Excel.Worksheet
Dim SheetAsObject As Object

Set SheetAsSelf = ThisWorkbook.Worksheets(1)
Set SheetAsSheet = SheetAsSelf
Set SheetAsObject = SheetAsSelf

Debug.Print "Caption from self: ",SheetAsSelf.Name,TypeName(SheetAsSelf),ObjPtr(SheetAsSelf),TypeOf SheetAsSelf Is Sheet1
Debug.Print "Caption from sheet: ",SheetAsSheet.Name,TypeName(SheetAsSheet),ObjPtr(SheetAsSheet),TypeOf SheetAsSheet Is Sheet1
Debug.Print "Caption from object: ",SheetAsObject.Name,TypeName(SheetAsObject),ObjPtr(SheetAsObject),TypeOf SheetAsObject Is Sheet1
标题 姓名 类型名称 对象地址 Sheet1吗?
来自自己的标题: 表 1 工作表 463669552 真的
来自工作表的标题: 表 1 工作表 463669552 真的
来自对象的标题: 表 1 工作表 463669552 真的

(不过,如果你深入挖掘,你会发现工作表甚至是crazier shenanigans!)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...