shotiko

ListViewEx and Arrays

3 posts in this topic

#1 ·  Posted (edited)

I have a problem using listview and arrays: I try to create listview from file which contains multiples of 3 lines, therefore 3 columns and rows of total number of lines devided on 3. creation works fine but it adds extra rows as as number of items: ex. 24 lines in text creates 3 columns 8rows and other 16 rows empty. this is seen in listview and adds scroll even though my gui shouldn't need.  I tried looking at styles and extended styles but couldn't find forcing limitation on number of rows created.

Func _config()
    $configMain = GUICreate('Settings', 530, 330, -1, -1, '', '', $mainGUI)
    Global $editBtn = GUICtrlCreateButton("Edit", 430, 50, 70, 30); Edit Btn
    Global $saveBtn = GUICtrlCreateButton("Save", 430, 120, 70, 30); Save Btn
    Global $cancelBtn = GUICtrlCreateButton("Cancel", 430, 180, 70, 30); Cancel Btn

    ; create listview with 3 columns
    $cLV = GUICtrlCreateListView("Server Name|server address|user Name", 10, 10, 400, 280)

    GUICtrlSetFont(-1, 10); set font for previous control
    _GUICtrlListView_SetColumnWidth(-1, 0, 95); first column size
    _GUICtrlListView_SetColumnWidth(-1, 1, 180); second column size
    _GUICtrlListView_SetColumnWidth(-1, 2, 100); third column size

    Local $j = 1, $k = 2, $l = 3 ; starting lines for $j - server; $k - server address; $l - account name
    For $i = 1 To _FileCountLines($configF); 1 to  number of lines present in file
        $sLine = FileReadLine($configF, $j); Server name Line read
        $saLine = FileReadLine($configF, $k); server address Line read
        $anLine = FileReadLine($configF, $l); user Name read

        $listV = GUICtrlCreateListViewItem($sLine & '|' & $saLine & '|' & $anLine, $cLV); assign 3 values each with iteration _
        ;  seperated and concatenated by '|'
        $j += 3; move three lines below
        $k += 3; move three lines below
        $l += 3; move three lines below
    Next


    $cLVarray = _GUIListViewEx_ReadToArray($cLV); read ListView to array
    $cLVinit = _GUIListViewEx_Init($cLV, $cLVarray, 0, 0, True, 1 + 2 + 512); Initialize
    _GUIListViewEx_SetEditStatus($cLVinit, "*") ; all columns can be edited
    _GUIListViewEx_MsgRegister() ; receive messages for UDF functions
    _GUIListViewEx_SetActive($cLVinit) ; set $cLVinit - 1 as active

    GUISetState(@SW_SHOW, $configMain)
EndFunc   ;==>_config

 

i can avoid this by

For $i = 1 To 50
        _GUICtrlListView_DeleteItem($cLV, 8)
        $i += 1
    Next


if i know maximum number of rows i will need, but items in listview are editable and therefore unreliable. I tried

_GUICtrlListView_DeleteItem($cLV, _GUICtrlListView_GetItemCount($cLV) / _GUICtrlListView_GetColumnCount($cLV))

this returns empty listview

when it comes to editing part:

$cLVarrayModif = _GUIListViewEx_ReturnArray($cLVinit, 0)
                 _ArrayDisplay($cLVarrayModif)

this also shows 24 rows 3columns

Edited by shotiko
typo

Share this post


Link to post
Share on other sites

shotiko,

If you read the file like this, you avoid the extra lines - and it is faster:

#include <GUIConstantsEx.au3>

#include "GuiListViewEx.au3"

$configF = FileOpen("Data.txt") ; Open file to get handle <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

$configMain = GUICreate('Settings', 530, 330)
Global $editBtn = GUICtrlCreateButton("Edit", 430, 50, 70, 30) ; Edit Btn
Global $saveBtn = GUICtrlCreateButton("Save", 430, 120, 70, 30) ; Save Btn
Global $cancelBtn = GUICtrlCreateButton("Cancel", 430, 180, 70, 30) ; Cancel Btn

; create listview with 3 columns
$cLV = GUICtrlCreateListView("Server Name|server address|user Name", 10, 10, 400, 280)

GUICtrlSetFont(-1, 10) ; set font for previous control
_GUICtrlListView_SetColumnWidth(-1, 0, 95) ; first column size
_GUICtrlListView_SetColumnWidth(-1, 1, 180) ; second column size
_GUICtrlListView_SetColumnWidth(-1, 2, 100) ; third column size

Local $j = 1, $k = 2, $l = 3 ; starting lines for $j - server; $k - server address; $l - account name
While 1
    $sLine = FileReadLine($configF) ; Server name Line read             ; Use handle to read file line <<<<<<<<<<<<<<<<<<<<<
    If @error = -1 Then ExitLoop                                        ; Exit loop when file ends <<<<<<<<<<<<<<<<<<<<<<<<<
    $saLine = FileReadLine($configF) ; server address Line read         ; Line number automatically increases <<<<<<<<<<<<<<
    $anLine = FileReadLine($configF) ; user Name read                   ; And it is much faster as well! <<<<<<<<<<<<<<<<<<<

    $listV = GUICtrlCreateListViewItem($sLine & '|' & $saLine & '|' & $anLine, $cLV) ; assign 3 values each with iteration _
WEnd

GUISetState(@SW_SHOW, $configMain)

FileClose($configF) ; Do not forget to close the file <<<<<<<<<<<<<<<<<<<<<<<

$cLVarray = _GUIListViewEx_ReadToArray($cLV); read ListView to array
_ArrayDisplay($cLVarray, "", Default, 8)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

thanks Melba, always good to discover how to shorten my script (and make it work)

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

    • ronmage
      By ronmage
      So I have a loop that keeps reading data from an array and searching it for the same value. If the value is no there it does work then adds the value to the array to prevent it from doing the same work.
      If _ArraySearch($ID,$filearray[$i]) = -1 Then Work.... _ArrayAdd($ID,$filearray[$i]) EndIf This is in a for loop hence $i
      So what is happening is the code works great for several hours. After a period of time _ArraySearch($ID,$filearray[$i]) will result in -1 even if $ID = $filearray. So it ready as if there is no data in the array. Anyone have this problem? 
       
      Also I am just running in using F5 not compiling it and running it if that makes a difference.
       
    • Ascer
      By Ascer
      1. Description.
      Udf working with MSDN System.Collections.ArrayList. Allow you to make fast operations on huge arrays, speed is even x10 better than basic _ArrayAdd.  Not prefered for small arrays < 600 items. 2. Requirements
      .NET Framework 1.1+ System Windows 3. Possibilities.
      ;=============================================================================================================== ; UDF Name: List.au3 ; ; Date: 2018-02-17, 10:52 ; Description: Simple udf to create System Collections as ArrayList and make multiple actions on them. ; ; Function(s): _ListCreate -> Creates a new list ; _ListCapacity -> Gets a list size in bytes ; _ListCount -> Gets items count in list ; _ListIsFixedSize -> Get bool if list if fixed size ; _ListIsReadOnly -> Get bool if list is read only ; _ListIsSynchronized -> Get bool if list is synchronized ; _ListGetItem -> Get item on index ; _ListSetItem -> Set item on index ; ; _ListAdd -> Add item at end of list ; _ListClear -> Remove all list items ; _ListClone -> Duplicate list in new var ; _ListContains -> Get bool if item is in list ; _ListGetHashCode -> Get hash code for list ; _ListGetRange -> Get list with items between indexs ; _ListIndexOf -> Get index of item ; _ListInsert -> Insert a new item on index ; _ListInsertRange -> Insert list into list on index ; _ListLastIndexOf -> Get index last of item ; _ListRemove -> Remove first found item ; _ListRemoveAt -> Remove item in index ; _ListRemoveRange -> Remove items between indexs ; _ListReverse -> Reverse all items in list ; _ListSetRange -> Set new value for items in range ; _ListSort -> Sort items in list (speed of reading) ; _ListToString -> Get list object name ; _ListTrimToSize -> Remove unused space in list ; ; Author(s): Ascer ;=============================================================================================================== 4. Downloads
      List.au3 5. Examples
      SpeedTest _ArrayAdd vs ListAdd SpeedTest ArraySearch vs ListIndexOf Basic usage - crating guild with members  
    • FMS
      By FMS
      Hello,
      I'm trying to read a binary file to an array but couln't get it to work.
      Also I coul not find any help in the forum around this subject whish was helpfull.
      Is there any way it could be done?
      I tried a lot of ways but maybe somebody know's the right way?
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include <File.au3> #include <Array.au3> #include <AutoItConstants.au3> Local $in=FileOpen("TEST_labels.idx1-ubyte",16) ; 16+0=Read binary Local $data = FileRead($in) Local $FileArray = BinaryToString($data,4) ;~ $FileArray = StringSplit($BinarydData, @CRLF, 1+2) ;~ Local $FileArray = StringRegExp($BinarydData, "[^\r\n]+", 3) FileClose($in) _ArrayDisplay($FileArray,"$FileArray","",32) MsgBox($MB_SYSTEMMODAL, "", "$FileArray = " & $FileArray )  
      TEST_labels.idx1-ubyte
    • ur
      By ur
      I am reading a CSV file which is tab seperated as below.
      Local $aArray = FileReadToArray($file) And now, I am splitting this main array record wise so that Array contains internally another arrow to represent each row.
      For $i = 0 to (UBound($aArray) - 1) ;MsgBox(0,"",$aArray[$i]) $aArray[$i] = StringSplit(StringStripCR($aArray[$i]), Chr(9),2);Chr(9) for tab ;_ArrayDisplay($aArray[$i]) Next Afther that, _ArrayDIsplay is able to see the individual internal arrays.
      _ArrayDisplay($aArray[1]) But If I try to access the individual element of it as below.It is not showing any result.
      MsgBox(0,"",$aArray[1][1]) Any suggestion, below is the sample csv file.
      New Text Document.csv
    • Jibsbrown
      By Jibsbrown
      Need some help understanding why the ConsoleWrite works inside 2nd For loop but not out side. Between Audit Wiki, Help file , Forum searching (lots of code reading), and YouTube ( shout out to TutsTeach), I have not been able to find the reason why. 
      $sIniPath = "installLog.ini" ; - Get section name $iniSctionNames = IniReadSectionNames($sIniPath) ; - Get Keys and Vaules For $a = 1 to UBound($iniSctionNames) - 1 $keys = IniReadSection($sIniPath , $iniSctionNames[$a]) For $b = 1 to UBound($keys) - 1 $oldSysInfo = IniRead($sIniPath , $iniSctionNames[1], $keys[$b][0], "") $PntIPInfo = IniRead($sIniPath , $iniSctionNames[2], $keys[$b][0], "") $NewPCInfor = IniRead($sIniPath , $iniSctionNames[3], $keys[$b][0], "") ;ConsoleWrite($oldSysInfo & @LF) Next ;ConsoleWrite($oldSysInfo & @LF) Next ConsoleWrite($oldSysInfo) My intention is to use the variables later for Listboxes. Any explanation, forum post links or whatever would help. Sorry also very very new to Autoit.
      Also here's the ini file.
      [OldSysInfo] 4=192.168.0.4|DESKTOP-RDIU2SN|R90M05Q8 5=192.168.0.5|SD0123456789101|R9WGP9P 6=192.168.0.6|SD0123456789102|R9WGP9PT 3=192.168.0.3|DESKTOP-3RS4LKL|R9WGP9P 23=192.168.0.23|SD0123456789102|MXL1234P5I [PrinterIp] 50=192.168.0.50 48=192.168.0.48 47=192.168.0.47 [NewSysInfo] newPC = SD0123456789adfs|192.168.0.185|2UA1234FTR Thank you for your time.