Сортировка списка VB6 по-разному в разных операционных системах - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над приложением 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) сортируется правильно.

Что может быть причиной этого?

1 Ответ

0 голосов
/ 04 ноября 2018

Это, скорее всего, порядок, в котором файлы возвращаются вызовом API файловой системы в операционной системе.Это также может быть связано с используемой файловой системой.

Многие файловые системы не являются изначально отсортированными структурами, но клиентское программное обеспечение, используемое для их представления, скрывает этот факт путем сортировки, например, списков файлов и папок.

напримеробщая проблема с флэш-MP3-плеерами заключалась в том, что люди копировали музыкальные файлы на них и воспроизводили их не по порядку, поскольку микропрограмма просто считывала файлы в порядке их появления в таблице размещения файлов и игнорировала имена файлов (даже если они имели 01 - track name вид имен).

Звучит так, что верно одно из следующего

  • API Windows 10 сортирует имена файлов, когда возвращает их списки
    • Учитывая пыл, который MS вкладывает в обратную совместимость, я не уверен, что это правда, тем более что все пользовательское программное обеспечение давно привыкло к несортированным спискам
  • Ваша система Windows 10более новые, и файлы были скопированы на него свежим
    • Это означает, что файлы находятся на диске в фактическом илиКогда они были скопированы, вероятно, это отсортированный порядок
    • В коробке Windows 7, вероятно, были файлы в течение некоторого времени, и они записаны на диск в несортированном порядке
    • . Поэтомупросто удача, что «старый» код работает в Windows 10

Так что это может объяснить «случайный» порядок сортировки.


Назадк VB6: свойство Sorted элемента управления ListBox VB6 - это то, что называется свойством «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...