Jump to content
TimRude

_ArrayDisplay column sorting?

Recommended Posts

TimRude

The help text for the _ArrayDisplay function says: "Clicking on a column header sort it."

I'm wondering why the sorting of hex numbers (specifically window handles like 0x12345678) is so wonky.

Sample script:

#include <Array.au3>
Local $aList = WinList()
_ArrayDisplay($aList)

Clicking on the Col1 header to sort by window handle doesn't properly sort the list.

As a workaround, I'm sorting the array by window handle before displaying it using _ArraySort. But I still wonder what's up with the ListView sorting.

Workaround:

#include <Array.au3>
Local $aList = WinList()
_ArraySort($aList, 0, 1, 0, 1)
_ArrayDisplay($aList)

 

Share this post


Link to post
Share on other sites
AutoBert

Are you using a version from AutoIt < 3.3.12.x?

Share this post


Link to post
Share on other sites
TimRude

Sorry, I should have stated that in the initial post.

I'm using the latest release, 3.3.14.5.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • ternal
      By ternal
      Hi,
      Recently I have had the need to do a sort and then do a second sort while the item of the first sort stays the same ( double sorting , first on column x then while column x is the same sort column y).
      I did not put much efffort into error checking but so far I did not need it.
      For my applications so far it works perfectly however if someone is willing I want to test this extensivly.
      If anyone has big lists of random stuff to sort could you try this out please?
      #include <Array.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArraySort_Double ; Description ...: ; Syntax ........: _ArraySort_Double (Byref $array[, $first_index = Default[, $second_index = Default[, $ascending = Default]]]) ; Parameters ....: $array - 2d array to sort. ; $first_index - [optional] first column to sort. Default is 0. ; $second_index - [optional] second column to sort. Default is 1. ; $ascending - [optional] ascending/descending. Default is 1. ; Return values .: 1 if no errors occured , -1 if errors occured ; Author ........: Ternal ; Remarks .......: Needs excessive testing. ; Related .......: _arraysort() ; =============================================================================================================================== Func _ArraySort_Double (byref $array, $first_index = Default, $second_index = Default, $ascending = Default) Local $temp_value Local $counter = 1 If UBound($array, $UBOUND_DIMENSIONS) <> 2 Then MsgBox(0, "error", "error") return -1 EndIf If $first_index = Default Then $first_index = 0 If $second_index = Default Then $second_index = 1 If $ascending = Default Then $ascending = 1 _ArraySort($array, $ascending, 0, 0, $first_index); you can alter settings of primary sort here If @error Then MsgBox(0, "error", @error) return -1 EndIf $temp_value = $array[0][$first_index] For $x = 1 to UBound($array, 1) - 1 If Mod( $x, 10000) = 0 Then ConsoleWrite("at " & $x & " of a total : " & UBound($array, 1) & @CRLF) If $array[$x][$first_index] = $temp_value Then $counter+= 1 If $x = UBound($array, 1) - 1 Then; do last line here(if last line is not a new item) _ArraySort($array, $ascending, $x - $counter, $x, $second_index);you can alter settings of secondary sort here(don't forget to place line 34 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf EndIf Else If $counter > 0 Then ;at least 2 of the same _ArraySort($array, $ascending, $x - $counter, $x - 1, $second_index);you can alter settings of secondary sort here(don't forget to place line 29 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf $counter = 1 EndIf EndIf $temp_value = $array[$x][$first_index] Next Return 1 EndFunc Kind regards, Ternal
    • Skysnake
      By Skysnake
      I am tracking this topic by @LarsJ.  It is very advanced and overkill for what I am currently trying to do.
       
      Problem is this.
      Listview contains columns, one of which is right aligned and gets populated by float values, such as 123.99.  Some do not have decimals ie 124.00 and on sort gets truncated to 124.  Its obviously still the same value, but the display has reset.
      ; line below is for list VIEW ;..................................0.........1......2............ $cListView = GUICtrlCreateListView("CUSTOMER|AMOUNT|DESCRIPTION", 8, 152, 764, 279) GUICtrlSetBkColor($cListView, $GUI_BKCOLOR_LV_ALTERNATE) ; alternate between the listview background color and the listview item background color GUICtrlSetBkColor($cListView, $LVStdClr) ; Set the background color for the listview _GUICtrlListView_SetColumnWidth($cListView, 0, 120) ; -- the client name _GUICtrlListView_SetColumnWidth($cListView, 1, 90) ;-- the amount _GUICtrlListView_JustifyColumn($cListView, 1, 1) ; 1 - Text is right aligned _GUICtrlListView_SetColumnWidth($cListView, 2, 200) ; the description What I am looking for is something native and simple like a 
          _GUICtrlListView_SetColumnFormat($cListView, 1, "%.2f") ;  1 - column is stringformatted to "%.2f"
      So that after each sort it will appear as it was in the original rendering.
      Is there something like this? I have not been able to find a simple solution.

      Thanks.
      Skysnake
    • Ostap
      By Ostap
      I have a small script that checks if users from certain security groups exist or are disabled in AD. 
         For $j = Ubound ( $Users, 1 ) -1 To 0 Step -1       Switch _AD_IsObjectDisabled ( $Users[$j] )           Case 1             ClipPut ( $Users[$j] & " - account disabled; " )           Case 0             If @error = 1 Then                ClipPut ( $Users[$j] & " - account not found; " )             Else                ClipPut ( $Users[$j] & " - Ok; " )             EndIf       EndSwitch    $Clip = $Clip & @CRLF & ClipGet ()    Next   $Data[$O][1] = $Clip The code works correctly, at the end I have a 2D array $Data with security group in column 1 and checked user accounts in columns 2. However, _ArrayDisplay ( $Data ) shows users in one row, despite I added @CRLF. When I write $Clip to a text file, user accounts are written as column. Isn't it possible to have multiple-line cell split by @CRLF in _ArrayDisplay? 
    • AndyS19
      By AndyS19
      I have a list of filenames and their versions and I want to sort them by the versions.  However, they always sort like they were just strings.  The version numbers can have up to 4 components (eg: 1.22.3.4).  I want version '1.2.7' to sort ahead of '1.12.7', and '1.8 alpha' to sort ahead of '1.8 beta'

      Here's my array of items to be sorted:
      1.5 alpha.22.1\filexxx 1.9\filexxx 1.8beta\filexxx 1.8alpha\filexxx 1.6\filexxx 1.62\filexxx 1.5-alpha.2.1\filexxx 1.2\filexxx 1.11-beta\filexxx I want the sorted list to look like this:
      1.2\filexxx 1.5-alpha.2.1\filexxx 1.5 alpha.22.1\filexxx 1.6\filexxx 1.62\filexxx 1.8alpha\filexxx 1.8beta\filexxx 1.9\filexxx 1.11-beta\filexxx But, what I end up with is this:
      1.2\filexxx 1.6\filexxx 1.9\filexxx 1.62\filexxx 1.8beta\filexxx 1.8alpha\filexxx 1.11-beta\filexxx 1.5 alpha.22.1\filexxx 1.5-alpha.2.1\filexxx Here is my test script:
      #include <Debug.au3> _DebugSetup(@ScriptName & "_debug.txt", False, 5, "") _DebugOut("=============== " & @MON & "/" & @MDAY & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " ====================" & @CRLF) #include <Array.au3> #include <String.au3> test() Func test() Local $ar $ar = StringSplit("", "") _ArrayAdd($ar, "1.5 alpha.22.1\filexxx") _ArrayAdd($ar, "1.9\filexxx") _ArrayAdd($ar, "1.8beta\filexxx") _ArrayAdd($ar, "1.8alpha\filexxx") _ArrayAdd($ar, "1.6\filexxx") _ArrayAdd($ar, "1.62\filexxx") _ArrayAdd($ar, "1.5-alpha.2.1\filexxx") _ArrayAdd($ar, "1.2\filexxx") _ArrayAdd($ar, "1.11-beta\filexxx") dumparray($ar, "$ar - initial values") setupVerSort($ar) ; Prepend each item in the array with a formatted version number dumparray($ar, "$ar - after setup") _ArraySort($ar, 0, 1) ; Sort based on the formatted version numbers cleanupVerSort($ar) ; Strip off the formatted version numbers dumparray($ar, "$ar - after cleanup") EndFunc ;==>test ; For each item in the array, extract the version number part, format it for sorting ; and put the formatted version in front of the item string (separated by " + ") Func setupVerSort(ByRef $ar) Local $ndx, $ndx2, $verIN, $verOUT, $vpartIN, $vpartOUT, $parts, $maxdepth $maxdepth = 4 For $ndx = 1 To UBound($ar) - 1 $verIN = StringSplit($ar[$ndx], "\", 2)[0] ; Get the version number $parts = StringSplit($verIN, '.', 2) ; Split the components into the $parts array redim $parts[$maxdepth] ; Only look at $maxdepth version components ; Format each component to be a set character length (8) For $ndx2 = 0 To UBound($parts) - 1 $vpartIN = $parts[$ndx2] If (StringRegExp($vpartIN, "[a-zA-Z]+")) Then $vpartOUT = StringRegExpReplace($vpartIN, "([a-zA-Z])*", "\0") logmsg("$vpartIN ==>" & $vpartIN & "<==, $vpartOUT ==>" & $vpartOUT & "<==") logmsg("") Else $vpartOUT = $vpartIN EndIf $parts[$ndx2] = StringFormat("%8s", $vpartOUT) ; Format this conponent to be 8 characters wide Next $verOUT = _ArrayToString($parts, ".", 0) $ar[$ndx] = $verOUT & " + " & $ar[$ndx] ; Prepend the formatted version Next EndFunc ;==>setupVerSort Func cleanupVerSort(ByRef $ar) Local $x For $ndx = 1 To UBound($ar) - 1 $x = StringInStr($ar[$ndx], " + ") $ar[$ndx] = StringTrimLeft($ar[$ndx], $x + 2) ; Strip off the formatted version Next EndFunc ;==>cleanupVerSort Func logmsg($msg, $lnum = @ScriptLineNumber) Local $str = ":" & $lnum & ": " & $msg ; Caller's line number plus the caller's message ; Send to both the Console and to DebugOut() _DebugOut($str) ConsoleWrite($str & @CRLF) EndFunc ;==>logmsg Func dumparray(ByRef $ar, $sTitle, $lnum = @ScriptLineNumber) Local $str = @CRLF & " -" & $lnum & "-" & " Dump of " & $sTitle & @CRLF If (IsArray($ar)) Then For $ndx = 0 To UBound($ar) - 1 $str &= " [" & $ndx & "] " & $ar[$ndx] & @CRLF Next Else $str = "<not an array>" EndIf logmsg($str) EndFunc ;==>dumparray  
    • distancesprinter
      By distancesprinter
      _ArrayDisplay($aArray, "Window Title", "1:", 0, Default, "Column") ; Expected results are rows 1 to the end of the array, all columns. The result is rows 0-1, all columns. The API reference is here:
      https://www.autoitscript.com/autoit3/docs/libfunctions/_ArrayDisplay.htm
       
      Am I doing something wrong?
×