我对HTA和VBScript相对较新。我试图使用HTA和VBScript复制一些VBA功能,以消除对像MS Excel这样的VBA容器的需要。
我的应用程序使用iGrid V5.0控件。我让HTA正在显示网格的一个实例,我可以填充它。
我遇到的问题与处理iGrid事件参数有关。我正在使用RequestEdit事件,该事件具有通过引用传递的bCancel参数。使用VBA时,在RequestEdit事件中将bCancel设置为True会禁用对活动列的编辑,这是所需的行为。我使用ByRef为bCancel参数在VBScript中创建了RequestEdit事件。当事件执行时,我将某些网格列的bCancel参数设置为True(并使用MsgBox bCancel验证),但此值不会返回给iGrid控件。无论bCancel的值如何,所有列都可以编辑。
这是否与作为Variants传递的所有VBScript变量/参数有关?关于成功将ByRef事件参数值传递回ActiveX控件需要做些什么的建议?
以下是我的两个代码示例。这首先使用VBA并按预期运行,其中值为“已锁定”的单元格取消编辑以保持锁定,并且“可编辑”单元格允许更新:
Option Explicit
Private Sub grdTest_RequestEdit(ByVal lRow As Long, ByVal lCol As Long, ByVal lCharCode As Long, bCancel As Boolean, sText As String, lMaxLength As Long, eTextEditOpt As iGrid500_10Tec.ETextEditFlags)
bCancel = (lCol = 1)
End Sub
Private Sub UserForm_Activate()
With grdTest
.ColCount = 2
.RowCount = 1
.RowHeight(1) = 20
.CellValue(1, 1) = "Locked"
.CellValue(1, 2) = "Editable"
End With
End Sub
第二个例子是我的HTA代码,其中两个单元格都可以编辑。我在RequestEdit事件中添加了MsgBox命令以显示bCancel的值:
<head>
<title>Test iGrid</title>
<HTA:APPLICATION
APPLICATIONNAME="Test iGrid"
SCROLL="yes"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
/>
<script type="text/VBScript">
Sub Window_OnLoad()
With grdTest
.ColCount = 2
.RowCount = 1
.RowHeight(1) = 20
.CellValue(1, 1) = "Locked"
.CellValue(1, 2) = "Editable"
End With
End Sub
Sub grdTest_RequestEdit(ByVal lRow, ByVal lCol, ByVal lCharCode, ByRef bCancel, ByRef sText, ByRef lMaxLength, ByRef eTextEditOpt)
bCancel = (lCol=1)
Msgbox bCancel
End Sub
</script>
</head>
<body>
<body bgColor="C0C0C0">
<object id="grdTest" classid="clsid:3F7D8777-8E7B-4AD1-9A24-D453DC390BAD" codebase="iGrid500_10Tec.ocx" Width="800" Height="400">
</object><br>
</body>