Jump to content
Sign in to follow this  
Crayfish

[SOLVED] 2D Array replace specific column only.

Recommended Posts

Crayfish

guinness excellent array function example.

Is there a way to replace array column value to a specific defined text?

Example I want to replace all 1 value in first column to "Offline" value 3 to "Not available" etc...

Thank you.

#include <Array.au3> ; Required only for _ArrayDisplay().
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
Local $iWidth = 600, $iHeight = 400, $iListView
Local $hGUI = GUICreate('_GUICtrlListView_CreateArray()', $iWidth, $iHeight, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))

_CreateListView($hGUI, $iListView)

Local $iGetArray = GUICtrlCreateButton('Get Array', $iWidth - 90, $iHeight - 28, 85, 25)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKSIZE + $GUI_DOCKBOTTOM)

Local $iRefresh = GUICtrlCreateButton('Refresh', $iWidth - 180, $iHeight - 28, 85, 25)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKSIZE + $GUI_DOCKBOTTOM)

GUISetState(@SW_SHOW, $hGUI)

Local $aReturn = 0, $aStringSplit = 0
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop

Case $iGetArray
$aReturn = _GUICtrlListView_CreateArray($iListView, Default) ; Use | as the default delimeter.
_ArrayDisplay($aReturn, '_GUICtrlListView_CreateArray() array.')

$aStringSplit = StringSplit($aReturn[0][2], '|')
_ArrayDisplay($aStringSplit, 'StringSplit() to retrieve column names.')

Case $iRefresh
GUICtrlDelete($iListView)
_CreateListView($hGUI, $iListView)

EndSwitch
WEnd
GUIDelete($hGUI)
EndFunc ;==>Example

Func _CreateListView($hGUI, ByRef $iListView) ; Thanks to AZJIO for this function.
Local $aClientSize = WinGetClientSize($hGUI)
$iListView = GUICtrlCreateListView('', 0, 0, $aClientSize[0], $aClientSize[1] - 30)
GUICtrlSetResizing($iListView, $GUI_DOCKBORDERS)
Sleep(250)

Local $iColumns = 3
__ListViewFill($iListView, $iColumns, Random(25, 100, 1)) ; Fill the ListView with Random data.
For $i = 0 To $iColumns
_GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE)
_GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
Next
EndFunc ;==>_CreateListView

Func __ListViewFill($hListView, $iColumns, $iRows) ; Required only for the Example.
If Not IsHWnd($hListView) Then
$hListView = GUICtrlGetHandle($hListView)
EndIf
Local $fIsCheckboxesStyle = (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES)

_GUICtrlListView_BeginUpdate($hListView)
For $i = 0 To $iColumns - 1
_GUICtrlListView_InsertColumn($hListView, $i, 'Column ' & $i + 1, 50)
_GUICtrlListView_SetColumnWidth($hListView, $i - 1, -2)
Next
For $i = 0 To $iRows - 1
_GUICtrlListView_AddItem($hListView, random(1,8,1), $i)
If Random(0, 1, 1) And $fIsCheckboxesStyle Then
_GUICtrlListView_SetItemChecked($hListView, $i)
EndIf
For $j = 1 To $iColumns
_GUICtrlListView_AddItem($hListView, random(1,8,1), $i)
_GUICtrlListView_AddSubItem($hListView, $i, 'Row ' & $i + 1 & ': Col ' & $j + 1, $j)
Next
Next
_GUICtrlListView_EndUpdate($hListView)
EndFunc ;==>__ListViewFill

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_CreateArray
; Description ...: Creates a 2-dimensional array from a lisview.
; Syntax ........: _GUICtrlListView_CreateArray($hListView[, $sDelimeter = '|'])
; Parameters ....: $hListView - Control ID/Handle to the control
; $sDelimeter - [optional] One or more characters to use as delimiters (case sensitive). Default is '|'.
; Return values .: Success - The array returned is two-dimensional and is made up of the following:
; $aArray[0][0] = Number of rows
; $aArray[0][1] = Number of columns
; $aArray[0][3] = Delimited string of the column name(s) e.g. Column 1|Column 2|Column 3|Column nth

; $aArray[1][0] = 1st row, 1st column
; $aArray[1][1] = 1st row, 2nd column
; $aArray[1][2] = 1st row, 3rd column
; $aArray[n][0] = nth row, 1st column
; $aArray[n][1] = nth row, 2nd column
; $aArray[n][2] = nth row, 3rd column
; Author ........: guinness
; Remarks .......: GUICtrlListView.au3 should be included.
; Example .......: yes
; ===============================================================================================================================
Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
If $iColumnCount < 3 Then
$iDim = 3 - $iColumnCount
EndIf
If $sDelimeter = Default Then
$sDelimeter = '|'
EndIf

Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
For $i = 0 To $iColumnCount - 1
$aColumns = _GUICtrlListView_GetColumn($hListView, $i)
$aReturn[0][2] &= $aColumns[5] & $sDelimeter
Next
$aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))

For $i = 0 To $iItemCount - 1
For $j = 0 To $iColumnCount - 1
$aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
Next
Next
Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
EndFunc ;==>_GUICtrlListView_CreateArray
Edited by Crayfish

Share this post


Link to post
Share on other sites
jmon

You can do it this way, using a switch (notice I added the variable $randtext and process the result):

Func __ListViewFill($hListView, $iColumns, $iRows) ; Required only for the Example.
    If Not IsHWnd($hListView) Then
        $hListView = GUICtrlGetHandle($hListView)
    EndIf
    Local $fIsCheckboxesStyle = (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES)

    _GUICtrlListView_BeginUpdate($hListView)
    For $i = 0 To $iColumns - 1
        _GUICtrlListView_InsertColumn($hListView, $i, 'Column ' & $i + 1, 50)
        _GUICtrlListView_SetColumnWidth($hListView, $i - 1, -2)
    Next
    For $i = 0 To $iRows - 1
        Local $RandText = Random(1, 8, 1)
        Switch $RandText
            Case 1
                $RandText = "Offline"
            Case 3
                $RandText = "Not Available"
        EndSwitch
        _GUICtrlListView_AddItem($hListView, $RandText, $i)
        If Random(0, 1, 1) And $fIsCheckboxesStyle Then
            _GUICtrlListView_SetItemChecked($hListView, $i)
        EndIf
        For $j = 1 To $iColumns
            _GUICtrlListView_AddItem($hListView, Random(1, 8, 1), $i)
            _GUICtrlListView_AddSubItem($hListView, $i, 'Row ' & $i + 1 & ': Col ' & $j + 1, $j)
        Next
    Next
    _GUICtrlListView_EndUpdate($hListView)
EndFunc   ;==>__ListViewFill

Share this post


Link to post
Share on other sites
Crayfish

Jmon - Thank you for pointing me with the switch. That's good way to replace it.

Since the actual data is not random, is there a way to read the existing array and replace the value instead?

Updated: I solved with the right direction from Jmon using switch. Here is example if anyone ever need to replace array on fly.

#include <Array.au3> ; Required only for _ArrayDisplay().
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Example()

Func Example()
Local $iWidth = 600, $iHeight = 400, $iListView
Local $hGUI = GUICreate('_GUICtrlListView_CreateArray()', $iWidth, $iHeight, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))

_CreateListView($hGUI, $iListView)

Local $iGetArray = GUICtrlCreateButton('REPLACE', $iWidth - 90, $iHeight - 28, 85, 25)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKSIZE + $GUI_DOCKBOTTOM)

Local $iRefresh = GUICtrlCreateButton('Refresh', $iWidth - 180, $iHeight - 28, 85, 25)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKSIZE + $GUI_DOCKBOTTOM)

GUISetState(@SW_SHOW, $hGUI)

Local $aReturn = 0, $aStringSplit = 0
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop

Case $iGetArray
$aReturn = _GUICtrlListView_CreateArray($iListView, Default) ; Use | as the default delimeter.
_ArrayDisplay($aReturn, 'BEFORE')
; replace string in array for specific column
For $A = 0 To UBound($aReturn, 1)-1
Switch $aReturn[$A ][0]
Case 1
$aReturn[$A ][0] = "Offline"
Case 3
$aReturn[$A ][0] = "Online"
Case 8
$aReturn[$A ][0] = "I don't even know"
EndSwitch
Next
_ArrayDisplay($aReturn, 'AFTEr')

Case $iRefresh
GUICtrlDelete($iListView)
_CreateListView($hGUI, $iListView)

EndSwitch
WEnd
GUIDelete($hGUI)
EndFunc ;==>Example

Func _CreateListView($hGUI, ByRef $iListView) ; Thanks to AZJIO for this function.
Local $aClientSize = WinGetClientSize($hGUI)
$iListView = GUICtrlCreateListView('', 0, 0, $aClientSize[0], $aClientSize[1] - 30)
GUICtrlSetResizing($iListView, $GUI_DOCKBORDERS)
Sleep(250)

Local $iColumns = 3
__ListViewFill($iListView, $iColumns, Random(25, 100, 1)) ; Fill the ListView with Random data.
For $i = 0 To $iColumns
_GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE)
_GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
Next
EndFunc ;==>_CreateListView

Func __ListViewFill($hListView, $iColumns, $iRows) ; Required only for the Example.
If Not IsHWnd($hListView) Then
$hListView = GUICtrlGetHandle($hListView)
EndIf
Local $fIsCheckboxesStyle = (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES)

_GUICtrlListView_BeginUpdate($hListView)
For $i = 0 To $iColumns - 1
_GUICtrlListView_InsertColumn($hListView, $i, 'Column ' & $i + 1, 50)
_GUICtrlListView_SetColumnWidth($hListView, $i - 1, -2)
Next
For $i = 0 To $iRows - 1
_GUICtrlListView_AddItem($hListView, Random(1,9,1), $i)
If Random(0, 1, 1) And $fIsCheckboxesStyle Then
_GUICtrlListView_SetItemChecked($hListView, $i)
EndIf
For $j = 1 To $iColumns
_GUICtrlListView_AddItem($hListView, Random(1, 8, 1), $i)
_GUICtrlListView_AddSubItem($hListView, $i, 'Row ' & $i + 1 & ': Col ' & $j + 1, $j)
Next
Next
_GUICtrlListView_EndUpdate($hListView)
EndFunc ;==>__ListViewFill

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_CreateArray
; Description ...: Creates a 2-dimensional array from a lisview.
; Syntax ........: _GUICtrlListView_CreateArray($hListView[, $sDelimeter = '|'])
; Parameters ....: $hListView - Control ID/Handle to the control
; $sDelimeter - [optional] One or more characters to use as delimiters (case sensitive). Default is '|'.
; Return values .: Success - The array returned is two-dimensional and is made up of the following:
; $aArray[0][0] = Number of rows
; $aArray[0][1] = Number of columns
; $aArray[0][3] = Delimited string of the column name(s) e.g. Column 1|Column 2|Column 3|Column nth

; $aArray[1][0] = 1st row, 1st column
; $aArray[1][1] = 1st row, 2nd column
; $aArray[1][2] = 1st row, 3rd column
; $aArray[n][0] = nth row, 1st column
; $aArray[n][1] = nth row, 2nd column
; $aArray[n][2] = nth row, 3rd column
; Author ........: guinness
; Remarks .......: GUICtrlListView.au3 should be included.
; Example .......: yes
; ===============================================================================================================================
Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
If $iColumnCount < 3 Then
$iDim = 3 - $iColumnCount
EndIf
If $sDelimeter = Default Then
$sDelimeter = '|'
EndIf

Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
For $i = 0 To $iColumnCount - 1
$aColumns = _GUICtrlListView_GetColumn($hListView, $i)
$aReturn[0][2] &= $aColumns[5] & $sDelimeter
Next
$aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))

For $i = 0 To $iItemCount - 1
For $j = 0 To $iColumnCount - 1
$aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
Next
Next
Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
EndFunc ;==>_GUICtrlListView_CreateArray
Edited by Crayfish
  • Like 1

Share this post


Link to post
Share on other sites
jmon

Hi,

I made a quick example to explain how to modify an array on the fly:

#include <GUIConstantsEx.au3>
#include <Array.au3>


$GUI = GUICreate("Test", 400, 600)
$LV = GUICtrlCreateListView("Col1|Col2|Col3", 0, 0, 400, 600)
GUISetState()


;Here is a 2D Array Example:
;We create the array with 5 rows and
;3 columns:
Global $ARRAY[5][3]


;Fill the array with random values:
For $i = 0 To UBound($ARRAY) -1
    $ARRAY[$i][0] = Random(0, 5, 1)
    $ARRAY[$i][1] = Random(0, 5, 1)
    $ARRAY[$i][2] = Random(0, 5, 1)
Next


;See how the array is now:
_ArrayDisplay($ARRAY, "Array before modification:")


;Now modify the array.
;Let's say we replace all the 1 values
;by "not Online" and the 3 values
;by "not available":
For $i = 0 To UBound($ARRAY) -1
    ;We test Row $i | column 0
    Switch $ARRAY[$i][0]
        Case 1
            $ARRAY[$i][0] = "Not Online"
        Case 3
            $ARRAY[$i][0] = "Not Available"
    EndSwitch

    ;We test Row $i | column 1
    Switch $ARRAY[$i][1]
        Case 1
            $ARRAY[$i][1] = "Not Online"
        Case 3
            $ARRAY[$i][1] = "Not Available"
    EndSwitch

    ;We test Row $i | column 2
    Switch $ARRAY[$i][2]
        Case 1
            $ARRAY[$i][2] = "Not Online"
        Case 3
            $ARRAY[$i][2] = "Not Available"
    EndSwitch
Next


;See how the array is after modification:
_ArrayDisplay($ARRAY, "Array after modification:")


;Now we create the listview columns and Rows:
For $i = 0 To UBound($ARRAY) -1
    GUICtrlCreateListViewItem( $ARRAY[$i][0] & "|" & $ARRAY[$i][1] & "|" & $ARRAY[$i][2], $LV)
Next


;now loop until the user exit:
While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch

    Sleep (50)

WEnd

In the previous example, what I was showing was how to modify the data before putting it in the listview. With this new example, I modify the array before and then update the listview with the data from the array. I hope it helps.

Edited by jmon

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
Sign in to follow this  

×