1

我正在使用文件夹和文件填充分层列表框。我用这些代码行填充我的列表框:

  For i As Integer = 1 To General.GetBlocksFolder.count
    If General.GetBlocksFolder.Item(i).Directory Then
       frmMain.BlockList.Append(General.GetBlocksFolder.Item(i).DisplayName, True)
       frmMain.BlockList.RowTag(i-1) = General.GetBlocksFolder.Item(i).GetSaveInfo(GetFolderItem(""))
    End if
  Next

General.GetBlocksFolder 是一个在我的系统上保存文件夹信息的对象。BlockList 是在我的程序中显示“块”的列表。这按预期工作,我看到该列表中的文件夹。

然后,当我展开一行时,我使用以下代码:

  Dim ItemsAdded as integer
  Dim CurrentFolder As FolderItem = General.GetBlocksFolder.GetRelative(me.RowTag(row))

  For i As Integer = 1 To CurrentFolder.count
    ItemsAdded = ItemsAdded +1 
    If CurrentFolder.Item(i).Directory Then
      frmMain.BlockList.Append(CurrentFolder.Item(i).DisplayName, True)
      frmMain.BlockList.RowTag(i+ItemsAdded) = CurrentFolder.Item(i).GetSaveInfo(GetFolderItem(""))
    Else
      frmMain.BlockList.Append(CurrentFolder.Item(i).DisplayName)
    End if
  Next

这很好用,但是当我深入到 3 个级别时,我得到一个错误。'CurrentRow' 上的 nilObjectException

有谁知道这是什么法术?

提前感谢马蒂亚斯

4

1 回答 1

2

您必须考虑 Item() 返回 nil。例如,如果文件在您处于循环中时被删除,或者当您遇到由于特殊类型或缺少权限而无法访问的项目时,就会出现这种情况。

因此,首先将 CurrentFolder.Item(i) 分配给一个变量,并在进一步使用它之前测试它是否为 nil,如下所示:

for i as integer = 1 to dir.count
  dim f as folderitem = dir.trueitem(i)
  if f = nil then continue // skip inaccessible items
  addrow ...
next

此外,您的代码中存在设计错误:

您应该使用 TrueItem() 函数,而不是 Item()。否则,您可能会在更深入时陷入无限循环,遇到符号链接或 Mac Finder 别名。

于 2013-11-13T11:33:56.030 回答