Sign in to follow this  
Followers 0
Crayfish

[SOLVED] 2D Array replace specific column only.

5 posts in this topic

#1 ·  Posted (edited)

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



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

#3 ·  Posted (edited)

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
1 person likes this

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

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

Excellent 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  
Followers 0