【问题标题】:VB6 listbox sorting differently in different operating systemsVB6列表框在不同操作系统中排序不同
【发布时间】:2018-11-04 21:04:58
【问题描述】:

我正在开发一个 VB6 应用程序,我的一些客户使用旧版本,而我的一些客户使用新版本。

在新版本中,有一个使用 FileSystemObject 和 For Each 循环填充目录子文件夹的列表框:

Dim objFileSys As New FileSystemObject
Dim myFolder as Folder
Set myFolder = objFileSys.GetFolder(Path)
For Each mysubfolder In myFolder.SubFolders
    listbox1.AddItem mysubfolder.Name
Next

在旧版本中,使用了 Dir$ 函数:

Dim DirName As String
DirName = Dir$(Path, ATTR_DIRECTORY)
Do While DirName <> ""
  If DirName <> "." And DirName <> ".." Then
    If (GetAttr(Path & DirName) And ATTR_DIRECTORY) = ATTR_DIRECTORY Then
      listbox1.AddItem DirName
    End If
  End If
  DirName = Dir$
Loop

在旧版本中,listbox1.sort 属性为 true,而在新版本中,listbox1.sort 属性为 false。没有任何代码可以执行任何排序。

这就是奇怪的地方。当我在 Windows 10 中运行应用程序时,列表框在两个版本中都正确排序。当我在 Windows 7 中运行应用程序时,旧版本(listbox.sort=true 的那个)排序不正确,但新版本(listbox.sort=false 的那个)排序正确。

什么可能导致这种情况发生?

【问题讨论】:

  • 排序不正确是什么意思?
  • 它不是按字母数字排序的。排序似乎是完全随机的。
  • 显示排序示例。
  • “随机排序”和“不排序”有区别吗?
  • 我需要所有版本和所有操作系统的排序都是字母数字。我不在可以访问示例的位置。所有子文件夹均以 BCH 开头,后跟 5 位数字。

标签: sorting vb6


【解决方案1】:

这可能取决于操作系统中文件系统 API 调用返回文件的顺序。这也可能与所使用的文件系统有关。

许多文件系统本质上不是排序结构,但用于表示它们的客户端软件通过排序掩盖了这一事实,例如文件和文件夹列表。

例如Flash MP3 播放器的一个常见问题是人们将音乐文件复制到它们并且它们播放乱序,因为固件只是按照它们在文件分配表中出现的顺序读取文件,而忽略文件名(即使它们有 @ 987654321@ 种名称)。

听起来以下其中一项是正确的

  • Windows 10 API 在返回文件名列表时对文件名进行排序
    • 鉴于 MS 对向后兼容性的热情,我不确定这是否属实,尤其是所有用户软件早已习惯了未排序的列表
  • 您的 Windows 10 系统较新,并且文件是新复制到该系统上的
    • 这意味着文件在磁盘上的实际复制顺序可能是排序顺序
    • Windows 7 机器可能已经保存了一段时间的文件,并且它们以未排序的顺序写入磁盘
    • 因此幸运的是,“旧”代码可以在 Windows 10 上运行

所以这可以解释“随机”排序顺序。


回到 VB6:VB6 ListBox 控件的 Sorted 属性是所谓的“Action”属性 - 设置它会做一些事情。当您填充列表时,控件不会对列表进行排序。填充列表然后设置 .Sorted 属性。

新代码可能会生成一个排序列表,因为 FileSystemObject 的行为与 Dir$() 不同(即,它可能会对文件进行排序,因为这是一种常见的挫败感)


Dim DirName As String
DirName = Dir$(Path, ATTR_DIRECTORY)
Do While DirName  ""
  If DirName  "." And DirName  ".." Then
    If (GetAttr(Path & DirName) And ATTR_DIRECTORY) = ATTR_DIRECTORY Then
      listbox1.AddItem DirName
    End If
  End If
  DirName = Dir$
Loop
listbox1.Sorted = True ' After the loop

【讨论】:

  • Windows 10 机器上的用户没有任何问题。问题在于 Windows 7 机器上的所有用户。所有人都在阅读位于 Windows Server 2012 上的目录列表。在最近更新 Windows 7 机器或服务器之前,这一切正常。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多