Что нового

Сортировка массива [файлов с индексом]

Krokodile

Новичок
Сообщения
43
Репутация
1
Не удовлетворяет результат сортировки массива.
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#Include <Array.au3>
#Include <WinAPI.au3>

Dim $fl[50], $filelist[50][3]

GUICreate("",300,140)
GUISetState()

$wd=@WorkingDir
DirCreate (@WorkingDir&"\jpg")
_WinAPI_CreateFile(@WorkingDir&"\jpg\file.jpg",1)
_WinAPI_CreateFile(@WorkingDir&"\jpg\elif.jpg",1)
For $i = 1 to 3
   _WinAPI_CreateFile(@WorkingDir&"\jpg\file("&$i&").jpg",1)
Next
_WinAPI_CreateFile(@WorkingDir&"\jpg\Русский.jpg",1)
FileChangeDir(@WorkingDir&"\jpg")


$tr1=GUICtrlCreateTreeView(10,10,280,120,BitOR($TVS_LINESATROOT,$TVS_FULLROWSELECT,$TVS_CHECKBOXES),$WS_EX_CLIENTEDGE)
$search = FileFindFirstFile("*.jpg")

$i=0
While 1
   $i+=1
   $file=FileFindNextFile($search) 
   If @error Then ExitLoop
   $filelist[$i][1]=$file
WEnd
$n=$i-1

FileClose($search)
FileChangeDir($wd)

_ArraySort($filelist,0,1,$n,1)


For $i= 1 to $n
   GUICtrlCreateTreeViewItem($filelist[$i][1],$tr1)
Next

$msg = 0
While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
WEnd

e8962b29267c8b54c77f722985c163e2.jpg


Надо, чтобы file стоял над списком file($i)(соответсветнно "русский" над "русский($i)", как это происходит при сортировке explorere или т.п. В остальном все нормально.


Добавлено:
Сообщение автоматически объединено:

P.S.: Скрипт добавит папку jpg в рабочей директории
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Krokodile

Как то вроде всё удовлетворяет. Проверил и с _ArraySort и с GUICtrlRegisterListViewSort, всё идеально, аналогично эксплореру.

Код:
#include <Array.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

Global $aa[6]=['русский(2)', 'русский(4)', 'русский', 'русский(5)', 'русский(1)', 'русский(3)']
_ArraySort($aa)

GUICreate("ListView", 220, 260, 100, 200)
GUISetBkColor(0xd5d2af)

$ListView = GUICtrlCreateListView(" колонка 1    ", 10, 10, 200, 150)
GUICtrlSetBkColor(-1, 0xFFFEEE)
For $i = 0 To 5
	GUICtrlCreateListViewItem($aa[$i], $ListView)
Next

GUISetState()

Do
Until GUIGetMsg() = -3
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Krokodile [?]
Не удовлетворяет результат сортировки

Ну так сортируйте имена файлов (без расширений) :
Код:
#Include <Array.au3>

$str = 'elif.jpg|file(1).jpg|file(2).jpg|file(3).jpg|file.jpg|Аа.jpg|Аб.jpg|Ва.jpg|PyccKnn(1).jpg|PyccKnn(2).jpg|PyccKnn(3).jpg|PyccKnn.jpg'
$ar = StringRegExp($str, '([^|]+)', 3)

_ArrayDisplay($ar)
__ArraySort($ar)
_ArrayDisplay($ar)

Func __ArraySort(ByRef $inArray, $iDescending = 0)
	If Not IsArray($inArray) Then Return
	Local $aTmp1, $aTmp2, $i
	Dim $aTmp1[UBound($inArray)][2]
	For $i = 0 To UBound($inArray) -1
		$aTmp2 = StringRegExp($inArray[$i], '^(.+)(\.[^.]+)$', 3)
		If IsArray($aTmp2) Then
			$aTmp1[$i][0] = $aTmp2[0]
			$aTmp1[$i][1] = $aTmp2[1]
		Else
			$aTmp1[$i][0] = $inArray[$i]
		EndIf
	Next
	_ArraySort($aTmp1, $iDescending)
	For $i = 0 To UBound($inArray) -1
		$inArray[$i] = $aTmp1[$i][0] & $aTmp1[$i][1]
	Next
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Krokodile

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#Include <Array.au3>
#Include <WinAPI.au3>

Dim $fl[50], $filelist[50][3]

GUICreate("",300,140)
GUISetState()

$wd=@WorkingDir
DirCreate (@WorkingDir&"\jpg")
_WinAPI_CreateFile(@WorkingDir&"\jpg\file.jpg",1)
_WinAPI_CreateFile(@WorkingDir&"\jpg\elif.jpg",1)
For $i = 1 to 3
   _WinAPI_CreateFile(@WorkingDir&"\jpg\file("&$i&").jpg",1)
Next
_WinAPI_CreateFile(@WorkingDir&"\jpg\Русский.jpg",1)
FileChangeDir(@WorkingDir&"\jpg")


$tr1=GUICtrlCreateTreeView(10,10,280,120,BitOR($TVS_LINESATROOT,$TVS_FULLROWSELECT,$TVS_CHECKBOXES),$WS_EX_CLIENTEDGE)
$search = FileFindFirstFile("*.jpg")

$i=0
While 1
   $i+=1
   $file=FileFindNextFile($search) 
   If @error Then ExitLoop
   $filelist[$i][1]=$file
   $filelist[$i][2]=StringRegExpReplace($file, '(.*)\.(.*)$', '\1')
WEnd
$n=$i-1
ReDim $filelist[$i][3]
$filelist[0][0]=$n

FileClose($search)
FileChangeDir($wd)

_ArraySort($filelist,0,1,0,2)


For $i= 1 to $n
   GUICtrlCreateTreeViewItem($filelist[$i][1],$tr1)
Next

$msg = 0
While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
WEnd
 
Автор
K

Krokodile

Новичок
Сообщения
43
Репутация
1
Спасибо, пример с отбросом расширений помог. Но почему так происходит? Вроде расширение везде одно.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Krokodile
Вроде расширение везде одно
так не с центра сотртировка происходит, а от левого края. Расширение в данном контексте нет, это просто текст, в котором в одном случае символ "(" в другом "."
 
Верх