Jump to content

Creation of ListView Items takes a lot of time...


Recommended Posts

Good evening everyone :)
I am building a management for the company I work with, and I just imported a real amount of rows ( about 29000 ), in my SQLite DB.
The thing I am not understanding, is the time that the script takes to build this amount of rows in the ListView.
I didn't measure it, but I think it took 2 minutes or so to create each ListView item...
It is normal that it takes so much time?
What can I do to improve the creation of the items?

Here's the code I am using to query and to create ListView items...

; Articles ListView:
Global $lvwArticles = GUICtrlCreateListView("ID|Fornitore|Codice|Descrizione|EU|Prezzo|Sconto Applicato|Note", 14, 87, 1507, 660, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_SORTASCENDING,$LVS_SORTDESCENDING), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))

; Query
$strQuery = "SELECT * FROM ARTICOLI;"

; Query Execution
_SQLite_GetTable2d($objDatabase, $strQuery, $arrResult, $intRows, $intColumns)
If @error Then
    ; Error Handling
Else
    ; Cleaning the ListView
    _GUICtrlListView_DeleteAllItems($lvwArticles)
    If @error Then
        ; Error Handling
    Else
        ; No records in the Table
        If UBound($arrResult) < 2 Then
            ; Error Handling
        Else
            _GUICtrlListView_BeginUpdate($lvwArticles)

            For $intCounter = 1 To UBound($arrResult) - 1

                $strListViewItem = $arrResult[$intCounter][0] & "|" & _
                                   $arrResult[$intCounter][1] & "|" & _
                                   $arrResult[$intCounter][2] & "|" & _
                                   $arrResult[$intCounter][3] & "|" & _
                                   $arrResult[$intCounter][4] & "|" & _
                                   $arrResult[$intCounter][5] & "|" & _
                                   $arrResult[$intCounter][6] & "|" & _
                                   $arrResult[$intCounter][7]

                $objListViewItem = GUICtrlCreateListViewItem($strListViewItem, $lvwArticles)
            Next

            _GUICtrlListView_EndUpdate($lvwArticles)

        EndIf
    EndIf
EndIf

Thanks in advance :)


Best Regards.

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

@AutoBert

I didn't watch closely in the Help file!

Didn't know about that function :)

I will try that tomorrow, and I'll let you know :)

Thanks for the suggestion.

PS: How could I measure the time since I start to create ListView Items and when the last ListView Item is displayed? 

Just for curiosity :)

Thanks again!

 

Best Regards.

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

To get an idea of how fast you can insert the rows in a listview, try displaying the array with _ArrayDisplay(). The code in _ArrayDisplay() is optimized code and It can probably not be done faster.

If it's not fast enough, then there is an ultimate solution. This solution consists of using a virtual listview. In a virtual listview, data is not inserted in the listview. Instead, the virtual listview reads data directly from the source. In this case either the array or the SQLite database.

Virtual listviews are fully and completely supported by AutoIt code.

To get an idea of how fast you can show the array in a virtual listview, try displaying the array with _ArrayDisplayEx().

There is also a function _SQLite_Display() that can display data from a SQLite database directly in a virtual listview. This function is very very fast. The total time spent reading the 29,000 rows from the database and displaying the first page in the listview will probably be less than one second.

Use this example to create your own virtual listview.

Link to post
Share on other sites

@AutoBert Thanks for your suggestions :) I will check them tomorrow in the morning.

@LarsJ Wow! Didn't know anything about that... :) Let me take a look and bring you a feedback :)

Another little question ( for me you are like Masters in this programming language ): I'd like to improve my knowledge about AutoIt... Where can I take a look? 

Thanks! 

 

Best Regards.

 

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

@AutoBert
Now it takes about 19 seconds to "fill" the ListView, but the "bug" is, that the ListView is not filled correctly, because, in the ListView, it is displayed only the first and the last element of the array.
I don't know why...


I'm going to see what kind of things are Virtual ListViews :)


Best Regards.

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

And you remembered to check the input parameters for _GUICtrlListView_AddArray() in the help file?

Another little answer: You can take a look in the Microsoft documentation.

Link to post
Share on other sites
27 minutes ago, LarsJ said:

And you remembered to check the input parameters for _GUICtrlListView_AddArray() in the help file?

Sure :)

Isn't a Result array from _SQLite_GetTable2() already formatted in that way ( as _GUICtrlListView_ArrayAdd requests )? :)

The Help file is my Guide :D

 

Best Regards.

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

Link to post
Share on other sites

Yes, It's just a normal 2D array. And _GUICtrlListView_AddArray() is pretty simple code. And therefore it should work. And when simpel code isn't working, it should not be ignored. You have to investigate the problem.

Link to post
Share on other sites

@LarsJ

I'll do some screenshot in order to let you see what is the issue I reported to AutoBert.

I didn't investigate on this, but If I use _SQLite_Display2DResult() or _ArrayDisplay, it works correctly.

Today, I spent my time studying on how Virtual ListView controls work, but, there were a lot information provided by your code, and not so much experience about that by my side.

So, I had to start from a previous step, or:

Since Virtual ListViews are created capturing WM_NOTIFY Windows Message, I had/have to understand how all Notification Codes and Structs and so on work.

So, I was asking where I can find those information.

I am 22 yo, with a big willingness to learn...

Every suggest is really appreciated.

Thanks again for your help :)

 

Best Regards.

Edited by FrancescoDiMuro

Click here to see my signature:

Spoiler

ALWAYS GOOD TO READ:

 

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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Dan_555
      Hi.
      I'm using the FreeCommander XE file manager here, and i'v written a script, which will create an empty, new file, after choosing an extension out from the Listbox.
       
      The listview code  is not mine, iv found the scripts somewhere on this forum. I have no credits in it, because it was intended to be only for my personal use.
      But now, i have a lot of free time, so i remembered that i haven't posted anything on this forum, yet, so here is my first script:
      It should be compiled with the Autoit v3.3.14.3 .
      The compiled exe needs a folder passed as a parameter, so that it know where to create the new file.
      A Listbox is opened, with a selection of available extensions.
      After selecting and doubleclicking (or using the ok button), the script creates a filename (if specified in the config file) with increased numbers (up to 9999).
      If the filename exist, the counter is checking the next number, until the maximum is reached.
      This script uses an ini file for configuration, called "NewFile.ini" which should be in the same folder, as the compiled exe.
      NewFile.au3
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #include <String.au3> #include <WinAPIFiles.au3> #include <Array.au3> #include <EditConstants.au3> #include <GuiEdit.au3> #include <ScrollBarsConstants.au3> Global $test[0][2], $hFile, $cmd = "", $cmdtmp, $tmptxt, $tmpinidir, $filesetting, $MouseX, $MouseY, $UseMouseX, $UseMouseY, $Edit1 Global $aArray[1] = [] $cmdtmp = StringReplace($cmdlineraw, Chr(34), "") If StringLen($cmdtmp) = 2 Then     If StringRight($cmdtmp, 1) = ":" Then         $cmd = $cmdtmp & "\"     EndIf Else     If StringRight($cmdtmp, 1) <> "\" Or StringRight($cmdtmp, 1) <> "/" Then         $cmd = $cmdtmp & "\"     EndIf EndIf If Not FileExists($cmd) Then                    ;Check if the folder exists, display an error message if not !     DisplayReadMe(1)     Exit EndIf If StringLen(@ScriptDir) > 3 And StringRight(@ScriptDir, 1) <> "\" Then     $tmpinidir = @ScriptDir & "\" Else     $tmpinidir = @ScriptDir EndIf Local Const $sFilePath = $tmpinidir & "NewFile.ini" $filesetting = IniRead($sFilePath, "setting", "filename", "MyNewFile") $filesetting = StringReplace($filesetting, ">", " ") ;msgbox (0,"",$filesetting)  ;Debugging $UseMouseX = IniRead($sFilePath, "setting", "UseMouseX", "1") $UseMouseY = IniRead($sFilePath, "setting", "UseMouseY", "0") If FileExists($sFilePath) Then     $aArray = IniReadSectionNames($sFilePath) ; Read the INI section names. This will return a 1 dimensional array. EndIf ; Check if an error occurred. If @error=0 Then     ; Enumerate through the array displaying the section names.     Local $count = 0     If FileExists($sFilePath) Then         For $i = 1 To $aArray[0]             $tmp1 = IniRead($sFilePath, $aArray[$i], "1", "none")             If $tmp1 <> "none" And StringLeft($tmp1, 1) = "." Then            ;Extension need to have a dot, or it will be ignored !                 $tmptxt = $tmptxt & $tmp1 & "|" & $aArray[$i] & @CRLF                 $count = $count + 1                                            ;Count how many extensions are added !             EndIf         Next     EndIf     If $count = 0 Then $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text File" & @CRLF     ;MsgBox($MB_SYSTEMMODAL,"",$tmptxt)     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) Else                                                            ;Reading the ini failed, create a default array for the extensions     $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text" & @CRLF     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) EndIf ;Local $test[5][2] = [['.au3', 'AutoIt'], ['.ahk', 'Auto Hotkey'], ['.txt', 'text'], ['.sdlbas', 'Sdl Basic'], ['.html', 'Webpage']] If $UseMouseX = 1 Then     $MouseX = MouseGetPos(0) Else     $MouseX = -1 EndIf If $UseMouseY = 1 Then     $MouseY = MouseGetPos(1) Else     $MouseY = -1 EndIf $Form1 = GUICreate("Create New File", 210, 247, $MouseX, $MouseY, $WS_CAPTION, $WS_EX_TOOLWINDOW) $List = GUICtrlCreateListView("", 5, 5, 200, 200) _GUICtrlListView_InsertColumn($List, 0, "Extension", 65) _GUICtrlListView_InsertColumn($List, 1, "Description", 115) _GUICtrlListView_AddArray($List, $test) GUICtrlCreateLabel("Example:" & $filesetting & "0000.ext", 5, 205) $Button1 = GUICtrlCreateButton("Ok", 16, 224, 45, 22) $Button3 = GUICtrlCreateButton("ReadMe", 80, 224, 55, 22) $Button2 = GUICtrlCreateButton("Cancel", 150, 224, 45, 22) $cDummy = GUICtrlCreateDummy() GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE, $Button2             Exit         Case $Button3             DisplayReadMe(0)         Case $Button1, $cDummy             Local $tmptxt = StringSplit(_GUICtrlListView_GetItemTextString($List), "|")[1]             If StringLen($tmptxt) > 0 Then                 Local $fnr = 0, $tmpfile = ""                 While $fnr < 10000                     $tmpfile = $cmd & $filesetting & _StringRepeat("0", 4 - StringLen($fnr)) & $fnr & $tmptxt                     ;MsgBox(0,"",$tmpfile) ; for debugging                     If Not (FileExists($tmpfile)) Then                         $hFile = _WinAPI_CreateFile($tmpfile, 0)                         _WinAPI_CloseHandle($hFile)                         Exit                     EndIf                     $fnr = $fnr + 1                 WEnd             EndIf     EndSwitch WEnd ;================================================================================ Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView     $hWndListView = $List     If Not IsHWnd($List) Then $hWndListView = GUICtrlGetHandle($List)     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))     $iCode = DllStructGetData($tNMHDR, "Code")     Switch $hWndFrom         Case $hWndListView             Switch $iCode                 Case $NM_DBLCLK                     ; Fire the dummy if the ListView is double clicked                     GUICtrlSendToDummy($cDummy)             EndSwitch     EndSwitch     Return $GUI_RUNDEFMSG EndFunc   ;==>WM_NOTIFY Func DisplayReadMe($err)     Local $Form1 = GUICreate("Read Me", 550, 400, 10, 10, BitOR($WS_CAPTION, $WS_THICKFRAME ,$WS_MAXIMIZEBOX))     $Edit1 = GUICtrlCreateEdit("", 0, 0, 549, 399)     GUICtrlSetData(-1, "")     GUISetState(@SW_SHOW)     If $err=1 then         local $txttmp01="Error: Path does not exist"         local $txttmp02="Commandline call was: "         AddText ($txttmp01)         Addtext ($txttmp02 & $cmd & @CRLF & @CRLF)     EndIf     AddText("Instructions:" & @CRLF)     AddText("Displays a selection of available extensions and then creates a new file at the Path's location." & @CRLF & @CRLF & "Usage: NewFile Path")     AddText("Example: NewFile c:\myfolder\" & @CRLF)     AddText("Result: A file with a name 'MyFile0000.ext' will be created at the Path's location.")     AddText("If the filename exists, the number counter will increase, until it finds a free number, up to 9999." & @CRLF)     AddText("Uses a configuration file in the .exe folder named NewFile.ini !" & @CRLF)     AddText("Example of a config file:" & @CRLF)     AddText("[setting]" & @CRLF & "filename=MyFile>")     AddText("UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings !")     AddText("UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates !" & @CRLF)     AddText(";Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number)" & @CRLF)     AddText(";Format for this ini file is:" & @CRLF & ";Name              e.g [Auto It]")     AddText(";extension       e.g 1=.au3" & @CRLF & "; p.s. only 1 extension per section ! the number must be 1" & @CRLF)     AddText("[AutoIt3]" & @CRLF & "1=.au3" & @CRLF & @CRLF & "[Text]" & @CRLF & "1=.txt")     _GUICtrlEdit_SetSel($Edit1, 0, 0)     _GUICtrlEdit_Scroll($Edit1, $SB_SCROLLCARET)     If $err=1 Then         _GUICtrlEdit_SetSel($Edit1, 0, StringLen($txttmp01 & $txttmp02 & $cmd)+5)     EndIf     While 1         $nMsg = GUIGetMsg()         Switch $nMsg             Case $GUI_EVENT_CLOSE                 GUIDelete($Form1)                 ExitLoop         EndSwitch     WEnd EndFunc   ;==>DisplayReadMe Func AddText($edittxt)     _GUICtrlEdit_AppendText($Edit1, $edittxt & @CRLF) EndFunc   ;==>AddText  
       NewFile.ini
      [setting] filename=MyNewFile_ UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings ! UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates ! ;Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number) ;Format for this ini file is: ;Name              e.g [Auto It] ;extension       e.g 1=.au3 ; p.s. only 1 extension per section ! the number must be 1 [AutoIt3] 1=.au3 [Auto Hotkey] 1=.ahk [Text] 1=.txt [Sdl Basic] 1=.sdlbas [Webpage] 1=.html [Basic] 1=.bas [Pascal] 1=.pas [Rich Text (RTF)] 1=.rtf [Word Document] 1=.doc [Hex File] 1=.hex
    • By RAMzor
      Hello, 
      I'm trying to implement Virtual ListView in my project. I have been based on example from @LarsJ.
      The script loads data from csv file instead of array as in original example and perform some parsing.
      Sometimes, when running a script, it adds garbage to the end of the correct data.
      The data is loaded correctly into the global array (double-clicking on a row with garbage displays it correct in the console), but is not displayed correctly.
      What am I missing or doing wrong?
      #include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <GuiStatusBar.au3> #include <FileConstants.au3> #include <GuiListBox.au3> #include <SendMessage.au3> #include <EditConstants.au3> Opt("MustDeclareVars", 1) Global $hWnd, $idLV, $hLV, $aItems[1][1] Global $gWinXMin = 1130, $gWinYMin = 615 Global Const $TopMost = 262144 ; Set MsgBox top-most attribute Example() Func Example() Local $Ver = "Virtual LV" ; Create GUI $hWnd = GUICreate("iTS - Test Sequencer [Ver " & $Ver & "]", $gWinXMin, $gWinYMin, -1, -1, BitOR($WS_SIZEBOX, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX)) ; Create ListView Reduces flicker Checkboxes Tooltip Icons Local $iLvStyle = BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_CHECKBOXES, $LVS_EX_INFOTIP);, $LVS_EX_SUBITEMIMAGES) $idLV = GUICtrlCreateListView("", 8, 50, 915, 477, $LVS_OWNERDATA, $iLvStyle) $hLV = GUICtrlGetHandle($idLV) ; Virtual listview ; --- ListView Add columns --- _GUICtrlListView_AddColumn($hLV, "# ID", 45) ; 0 _GUICtrlListView_AddColumn($hLV, "Group", 120) ; 1 _GUICtrlListView_AddColumn($hLV, "Name", 335) ; 2 _GUICtrlListView_AddColumn($hLV, "Min", 50) ; 3 _GUICtrlListView_AddColumn($hLV, "Max", 50) ; 4 _GUICtrlListView_AddColumn($hLV, "Result", 50) ; 5 _GUICtrlListView_AddColumn($hLV, "Status", 50) ; 6 _GUICtrlListView_AddColumn($hLV, "Description", 179) ; 7 ; Checkboxes _GUICtrlListView_SetCallBackMask($hLV, 32) ; 32 - The application stores the image list index of the current state image ; Load icon images ;~ Local $hImage = _GUIImageList_Create() ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0xFF0000, 16, 16)) ; Index = 0 ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0x00FF00, 16, 16)) ; Index = 1 ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0x0000FF, 16, 16)) ; Index = 2 ;~ _GUICtrlListView_SetImageList($hLV, $hImage, 1) ; --- StatusBar --- Local $aStatusBarParts[5] = [220, 160, 160, 140, -1] Global $StatusBar = _GUICtrlStatusBar_Create($hWnd, $aStatusBarParts) ; $SBARS_SIZEGRIP ; --- DEBUG --- Local $Debug_1 = GUICtrlCreateButton("Check Random", 928, 383, 91, 25) ; 152 Local $Debug_2 = GUICtrlCreateButton("Load From Array", 1024, 383, 91, 25) ; 152 Local $Debug_3 = GUICtrlCreateButton("Load 15 Rows", 928, 412, 91, 25) Local $Debug_4 = GUICtrlCreateButton("Load 500 Rows", 1024, 412, 91, 25) Local $DebugLabel_1 = GUICtrlCreateLabel("DEBAG", 928, 444, 36, 17) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO") ; Restrict minimaze window below specified size [$gWinXMin, $gWinYMin] GUISetState(@SW_SHOW) ; ============================================================================================= ; --- Load Test --- Local $sTestCsvFile = @ScriptDir & "\Test CSV 15.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized ; ============================================================================================= ; Message loop While 1 Switch GUIGetMsg() Case $Debug_1 ConsoleWrite(UBound($aItems, 1) & @CRLF) ConsoleWrite(UBound($aItems, 2) & @CRLF) For $i = 0 To UBound($aItems, 1) - 1 $aItems[$i][10] = 8192 ; Checked Next ConsoleWrite("- $i " & $i & @CRLF) GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $i, 0 ) ;~ $aItems[$i][10] = 4096 ; Unchecked ;~ $aItems[$k+$j][10] = 8192 ; Checked Case $Debug_2 Local $iRows = 250 Dim $aItems[$iRows+1][12] For $iRow = 0 To $iRows - 1 $aItems[$iRow][0] = $iRow + 1 $aItems[$iRow][1] = "AAA-" & Random(1000000, 9999999, 1) $aItems[$iRow][2] = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" $aItems[$iRow][3] = "CCC-" & Random(1000000, 9999999, 1) $aItems[$iRow][4] = "DDD-" & Random(1000000, 9999999, 1) $aItems[$iRow][10] = 4096 ; Unchecked Next GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iRow, 0 ) _GUICtrlStatusBar_SetText($StatusBar, $iRow & " Rows Loaded", 1) Case $Debug_3 GUICtrlSetData($Debug_3, "Load 15") $sTestCsvFile = @ScriptDir & "\Test CSV 15.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized Case $Debug_4 GUICtrlSetData($Debug_4, "Load 500") $sTestCsvFile = @ScriptDir & "\Test CSV 500.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete() EndFunc ;==>Example ; ; ; Return Test Count Func _ListView_Load($sTestCsvFile, ByRef $aItems, $AutoSize = True) Local $iRow = 0, $iNumLen, $aData, $aName, $GroupName, $TestName, $TestIdx, $MinVal, $MaxVal, $iStatus;, $aName Local $sTestIniFile = StringRegExpReplace($sTestCsvFile, '\.[^.]*$', '.tcf') ; INI File ;~ _SendMessage($hLV, $LVM_DELETEALLITEMS) ; Delete All Local $aCsv = FileReadToArray($sTestCsvFile) ; 9.289ms If @error Then Return MsgBox($TopMost+16, "_ListView_Load()", "! CSV File Reading ERROR") Local $LinesCount = @extended Dim $aItems[$LinesCount][12] $iNumLen = StringLen($LinesCount) For $i = 1 To $LinesCount-1 ; If StringLeft($aCsv[$i], 5) = "TEST_" Then $aData = StringSplit($aCsv[$i], ",") If $aData[0] >= 5 Then $iRow += 1 $aData[1] = StringReplace($aData[1], "TEST_", "", 1) $aData[1] = StringReplace(StringReplace($aData[1], "__", "|", 1), "_", " ", 1) $aName = StringSplit($aData[1], "|", 3) If @error Then $GroupName = "" $TestName = $aName[0] Else $GroupName = $aName[0] $TestName = StringReplace($aName[1], "_", " ") ; (all '_' replaced with ' ') EndIf $TestIdx = StringStripWS($aData[2], 7) $MinVal = StringStripWS($aData[3], 7) $MaxVal = StringStripWS( $aData[4], 7) $aItems[$iRow - 1][0] = StringFormat("%0" & $iNumLen & "i ", $iRow) $aItems[$iRow - 1][1] = $GroupName $aItems[$iRow - 1][2] = $TestName $aItems[$iRow - 1][3] = $MinVal $aItems[$iRow - 1][4] = $MaxVal $aItems[$iRow - 1][10] = 4096 ; 4096-Unchecked, 8192-Checked EndIf Else ContinueLoop EndIf Next _GUICtrlListView_BeginUpdate($hLV) GUICtrlSendMsg($idLV, $LVM_SETITEMCOUNT, $iRow, 0) ; Update data [$aItems] to ListView _GUICtrlListView_SetColumnWidth($hLV, 0, -1) If $AutoSize Then For $i = 1 To 2 _GUICtrlListView_SetColumnWidth($hLV, $i, $LVSCW_AUTOSIZE) Next EndIf _GUICtrlListView_EndUpdate($hLV) _GUICtrlStatusBar_SetText($StatusBar, $iRow & " Rows Loaded", 1) Return $iRow EndFunc ;==>_ListView_Load Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Local Static $tText = DllStructCreate("wchar[50]") Local Static $pText = DllStructGetPtr($tText) Local $tNMHDR, $hWndFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hLV Switch $iCode Case $LVN_GETDISPINFOW Local $tNMLVDISPINFO = DllStructCreate($tagNMLVDISPINFO, $lParam) Local $iItem = DllStructGetData($tNMLVDISPINFO, "Item") Local $iSubItem = DllStructGetData($tNMLVDISPINFO, "SubItem") Local $iMask = DllStructGetData($tNMLVDISPINFO, "Mask") ; Text If BitAND($iMask, $LVIF_TEXT) Then Local $sText = $aItems[$iItem][$iSubItem] DllStructSetData($tText, 1, $sText) DllStructSetData($tNMLVDISPINFO, "Text", $pText) DllStructSetData($tNMLVDISPINFO, "TextMax", StringLen($sText)) EndIf ; Checkbox in first column If BitAND($iMask, $LVIF_STATE) And $iSubItem = 0 Then DllStructSetData($tNMLVDISPINFO, "State", $aItems[$iItem][10]) EndIf ; Icon in first column ; Use proper $iSubItem value for other columns If BitAND($iMask, $LVIF_IMAGE) And $iSubItem = 6 Then ; Status Column Icon DllStructSetData($tNMLVDISPINFO, "Image", $aItems[$iItem][11]) EndIf Case $NM_CUSTOMDRAW Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage") Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") Switch $dwDrawStage ; Holds a value that specifies the drawing stage Case $CDDS_PREPAINT ; Before the paint cycle begins Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any item-related drawing operations Case $CDDS_ITEMPREPAINT ; Before painting an item If Mod($dwItemSpec, 2) = 1 Then DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) Else DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xEBF7FF) ; BGR EndIf Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors EndSwitch Case $NM_CLICK Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iItem = DllStructGetData($tInfo, "Index") Local $iSubItem = DllStructGetData($tInfo, "SubItem") If $iSubItem = 0 Then If $aItems[$iItem][10] = 4096 Then $aItems[$iItem][10] = 8192 ; Checked Else $aItems[$iItem][10] = 4096 ; Unchecked EndIf _GUICtrlListView_RedrawItems($hLV, $iItem, $iItem) EndIf Case $NM_DBLCLK ; User double-clicks an item with the left mouse button (No return value) Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iItem = DllStructGetData($tInfo, "Index") Local $iSubItem = DllStructGetData($tInfo, "SubItem") ConsoleWrite("--> DBLCLK Row : " & $iItem + 1 & @CRLF) ConsoleWrite("--> Name : " & $aItems[$iItem][$iSubItem] & @CRLF) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY ; Resize the status bar when GUI size changes Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam ;~ ConsoleWrite("ListView Width " & ControlGetPos($hWnd, "", $idLV)[2] & @CRLF) _GUICtrlStatusBar_Resize($StatusBar) Return $GUI_RUNDEFMSG EndFunc ;==>WM_SIZE Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam) Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam) DllStructSetData($minmaxinfo, 7, $gWinXMin); min X (+15) DllStructSetData($minmaxinfo, 8, $gWinYMin); min Y (+15) Return 0 EndFunc
      Test CSV 15.csv Test CSV 500.csv Virt_LV_Garbage.au3
    • By RAMzor
      Hello all,
      I have an ListView with checkboxes and about 300 - 400 items. Entire list is loaded (from ini) every time and I need to store and load "checked scenario" by name. 
      Store list of checked indexless is a bad idea because in the case of sorting the list - scenario will no longer be correct.
      What is the best way to store list of various scenarios of checked items?
      Base code and database ini are attached 
      Example_LV_Store_Scenario.au3 Example.ini
    • By diepfeile
      I'm using the following:
      Autoit 3.3.14.5
      newly installed Beta 3.3.15.5
      SQlite version 3380000 aka 3.38.0
      I put sqlite3.dll and sqlite3_x64.dll in C:\Windows\System32 since many scripts depend on them.


      I extended the output of _SQLite_Startup()
      with:
      ConsoleWrite("@AutoItX64 " & @AutoItX64 & @CRLF) ConsoleWrite("$sDll_Filename " & $sDll_Filename & @CRLF) ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF)

      Also using the script from https://www.autoitscript.com/autoit3/docs/libfunctions/_SQLite_Startup.htm for testing.

       
      >Running:(3.3.14.5):C:\Program Files (x86)\AutoIt3\autoit3.exe "R:\Download\aasdf.au3" @AutoItX64 0 $sDll_Filename sqlite3.dll _SQLite_LibVersion=0 >Running:(3.3.14.5):C:\Program Files (x86)\AutoIt3\autoit3_x64.exe "R:\Download\aasdf.au3" @AutoItX64 1 $sDll_Filename sqlite3_x64.dll _SQLite_LibVersion=3.38.0 >Running:(3.3.15.5):C:\Program Files (x86)\AutoIt3\Beta\autoit3.exe "R:\Download\aasdf.au3" @AutoItX64 0 $sDll_Filename sqlite3.dll _SQLite_LibVersion=0 >Running:(3.3.15.5):C:\Program Files (x86)\AutoIt3\Beta\autoit3_x64.exe "R:\Download\aasdf.au3" @AutoItX64 1 $sDll_Filename sqlite3_x64.dll _SQLite_LibVersion=3.38.0


      Why doesn't it work in 32bit, despite me having the 32bit sqlite.dll? Autoit urges running scripts in 32bit mode and Scite starts scripts just in 32bit mode without the flag?
      With #AutoIt3Wrapper_UseX64=Y it just works, both normal Autoit and beta!
      sqlite3.dll sqlite3_x64.dll
    • By ahha
      Under program control is there an easy way to move a slider (thumb) to the top or bottom?
      I am aware of Melba23's GUIScrollbars_Ex UDF (https://www.autoitscript.com/forum/topic/113723-scrollbars-made-easy-bugfix-version-2-may-21/) but I believe it's overkill for my simple needs.
      In a listview with a vertical scrollbar when the window is active one can hit Ctrl+Home to move the scrollbar slider (thumb) to the top and Ctrl+End to the bottom.
      One can also right click the slider and choose Scroll Here, Top, Bottom, Page UP, Page Down, Scroll Up, and Scroll Down.
      I must be doing something basically wrong but am stuck.  Move the thumb to the middle before clicking the Top button to test the code below (Bottom is not coded).  I've commented out other trys.  try #3 is a strange fail.
      Any comments on what I'm missing greatly appreciated as I'm stuck
      #AutoIt3Wrapper_run_debug_mode=Y #include <Debug.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiScrollBars.au3> AutoItSetOption("MustDeclareVars", 1) ;v1b - cut out extraneous code Example() Exit Func Example() Local $i, $j, $x, $hGUI, $idListView, $bTop, $bBottom $hGUI = GUICreate("Scrollbar Question", 300, 400) ;get handle in case we need it later $idListView = GUICtrlCreateListView("Col 0", 10, 10, 280, 300) $bTop = GUICtrlCreateButton("Top", 10, 350, 60, 25) $bBottom = GUICtrlCreateButton("Bottom", 120, 350, 60, 25) ;Pause("$hGUI = '" & $hGUI &"'"& @CRLF & "$idListView = '" & $idListView &"'") For $i = 1 to 100 _GUICtrlListView_AddItem($idListView, $i) Next GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $bTop ;drag thumb to middle of scrollbar before clicking Top button ;try #1 - FAILS Opt("WinTitleMatchMode", 2) ;2 = Match any substring in the title $x = WinActivate("Scrollbar Question") ;not $idListview but main GUI $hGUI - neither working If $x <> $hGUI Then Pause("WinActivate FAILED") Send("^{HOME}") ;Ctrl+home ;try#2 - FAILS ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $hGUI Then Pause("WinActivate FAILED") ;~ Send("^{HOME}") ;Ctrl+home ;try#3 - strange FAILS ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;strange it works BUT if I comment out this line it fails ;~ ;Sleep(1000) ;it's not a time delay issue ;~ Send("^{HOME}") ;Ctrl+home ;try#4 - same strange fail as #3 ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ Send("{UP 100}") ;try#5 - what the heck is going on? same strange fail as #3 ;$x = WinActivate($idListview) ;try $idListview ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ MouseWheel($MOUSE_WHEEL_UP, 100) ;_GUIScrollBars_ScrollWindow($hGUI, 0, 100) ;NO - moves the ListView window in the $hGUI ;_GUIScrollBars_ScrollWindow($idListview, 0, 100) ;does not seem to work ;_GUIScrollBars_SetScrollInfoPos($hGUI, $SB_VERT, 30) ;does not work ;_GUIScrollBars_SetScrollInfoPos($idListview, $SB_VERT, 30) ;does not work ;I'm doing something very basic wrong. I need help. Pause("Scrollbar thumb should be at Top") Case $bBottom Pause("In: Case $bBottom") Pause("Scroll bar should be at BOttom") EndSwitch WEnd GUIDelete($idListView) EndFunc ;Func Example() Func Pause($text="") MsgBox(262144, "DEBUG", "Paused: " & $text) EndFunc  
×
×
  • Create New...