【问题标题】:Visual Basic scripting dynamic arrayVisual Basic 脚本动态数组
【发布时间】:2013-07-13 20:32:49
【问题描述】:

所以我有一个扫描 RAP(运行广告程序)的 vb 脚本,如果该程序没有上次运行时间,但该程序的全名放入一个数组中,那么我将这个数组回显到一个消息框。我初始化数组以存储 10 个值,但是为了保持消息框的清洁,我想在找到所有程序后重新调整数组大小(不应该超过 3,但谁知道客户)。但是我似乎无法让数组调整大小,它会打印一个带有 10 个数组插槽 + 它找到的程序的消息框。

Dim vprglist(10)
Dim i  
Dim strBuf 
Dim intIndex 

Set vprograms = oUIResource.GetAvailableApplications

i = 0 
For Each vprogram In vprograms
     If vprogram.LastRunTime = "" Then
         vprglist(i) = vprogram.FullName
         i = i + 1
     End If   
Next

ReDim Preserve vprglist(i)

If vprglist <> Null Then  

    For intIndex = LBound(vprglist) To UBound(vprglist)
        strBuf = strBuf & "   -  " & vprglist(intIndex) & vbLf 
    Next
        vmsgbox = MsgBox("Do you want to Install(Yes) or Defer(No) the follow software: " & vbLf & strBuf,64+4)
        Select Case vmsgbox

【问题讨论】:

    标签: scripting vbscript


    【解决方案1】:

    您无法对固定大小的数组 (Dim vprglist(10)) 重新设置维度。如果您想要一个动态数组,请定义一个“普通”变量并为其分配一个空数组:

    Dim vprglist : vprglist = Array()
    

    或者直接用ReDim定义:

    ReDim vprglist(-1)
    

    然后您可以像这样重新调整数组的尺寸:

    If vprogram.LastRunTime = "" Then
      ReDim Preserve vprglist(UBound(vprglist)+1)
      vprglist(UBound(vprglist)) = vprogram.FullName
      i = i + 1
    End If
    

    ReDim Preserve 会将数组的所有元素复制到一个新数组中,但是,它在大规模时不会表现得很好。如果性能是一个问题,您最好改用System.Collections.ArrayList 类:

    Dim vprglist : Set vprglist = CreateObject("System.Collections.ArrayList")
    ...
    If vprogram.LastRunTime = "" Then
      vprglist.Add vprogram.FullName
      i = i + 1
    End If
    

    【讨论】:

    • 不,列表不应该超过 10,这种情况很少见,谢谢。
    • 直接使用System.Collections.ArrayList 对我来说是最好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多