【问题标题】:Setting default property fails because it is read only?设置默认属性失败,因为它是只读的?
【发布时间】:2020-01-14 20:30:34
【问题描述】:

此代码是从 VB6 转换为 VB.Net:

Public prvMainForm = VB6Form    
If prvMainForm IsNot Nothing Then
    CObj(prvMainForm).StatusBar.Panels(1) = "Initializing Folders..."
End If

(我的代码很长,所以我刚刚添加了这个 if 块,这是实际错误发生的地方。)

错误出现在 If 语句内的单行中:

属性“项目”是“只读”

【问题讨论】:

  • 显然您的意思是设置.Panels(1) 返回的对象的属性。所以指定该属性。
  • 我在即时窗口中尝试了 .Panels(1),似乎应该是 .Panels(1).Text
  • 在 VB6 中,该语句等同于 Set CObj(...).Panels(1) = ...。使用 Set 表示您打算替换对象而不是分配面板的 Text 属性。 VB.NET 放弃了对 Set 的支持,太含糊了。

标签: vb.net vb6-migration


【解决方案1】:

StatusBar.Panels(1) 返回一个MSComctlLib.Panel

StatusBar.Panels(1) = "Initializing Folders..." 在 VB6 中有效,因为 default properties

VB.NET 中的默认属性必须有参数。无参数属性不能是默认的,因此不能省略。因此,.Panels(1) = "..." 被 VB.NET 理解为试图替换 Panels 属性中的整个 Panel,这是不允许的。

您可以在VB6对象浏览器中查找默认属性的名称,原来是Property _ObjectDefault As String,所以您应该可以这样做:

CObj(prvMainForm).StatusBar.Panels(1).[_ObjectDefault] = "Initializing Folders..."

正如您所观察到的,分配Text 应该做同样的事情:

CObj(prvMainForm).StatusBar.Panels(1).Text = "Initializing Folders..."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多