Jump to content
Melba23

GUIListViewEx - BugFix Version 15 Sep 20

Recommended Posts

robertocm,

The limited number of HotKey links in the code you posted above is perfectly acceptable, but if (as I suspect) you want to create many more HotKey links to look for every key on the keyboard then you run into exactly the same problem as before - scanning for ALL key presses is not permissible under the restrictions set by Jon (site owner and AutoIt author).

Personally I have some difficulty with the concept that "great proffesionals" (sic) would have difficulty understanding that you first select a cell and then use a defined HotKey to begin editing it - or that double-clicking a cell does the same.

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

Tersion,

I would change the colour of a single row like this:

#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include "GUIListViewEx.au3"

$hMainWindow = GUICreate("Main Form", 500, 400, 242, 137)
$cIDEditableListView = GUICtrlCreateListView("", 5, 5, 490, 390, $LVS_REPORT)
_GUIListViewEx_MsgRegister()
GUISetState(@SW_SHOW)

_GUICtrlListView_AddColumn($cIDEditableListView, "#", 30)
_GUICtrlListView_AddColumn($cIDEditableListView, "Name", 150)
_GUICtrlListView_AddColumn($cIDEditableListView, "Version", 100)

_GUICtrlListView_AddItem($cIDEditableListView, "1")
_GUICtrlListView_AddSubItem($cIDEditableListView, 0, "Campaign 1", 1)
_GUICtrlListView_AddSubItem($cIDEditableListView, 0, "1.0", 2)
_GUICtrlListView_AddItem($cIDEditableListView, "2")
_GUICtrlListView_AddSubItem($cIDEditableListView, 1, "Campaign 2", 1)
_GUICtrlListView_AddSubItem($cIDEditableListView, 1, "2.0", 2)

$aLV_Array = _GUIListViewEx_ReadToArray($cIDEditableListView)
$iLV_Index = _GUIListViewEx_Init($cIDEditableListView, $aLV_Array, 0, 0, False, 1 + 32)
_GUIListViewEx_SetEditStatus($iLV_Index, "1-2")

For $iCol = 0 To 2 ; For each column...
    _GUIListViewEx_SetColour($iLV_Index, "0xFF0000;0xFFFF00", 1, $iCol) ; ...in row 1
Next

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

Is that good enough?

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

robertocm,

If I understand correctly, concept in your script is to assign to even and odd rows different colors using loops and arrays to save and load color info to ListView using _GUIListViewEx_LoadColour(). Thanks for that idea! I would check.

Share this post


Link to post
Share on other sites

Melba23,

Similar idea like from robertocm! :) Use loop through necessary row. Nice to see that implementation on my example. It's a more clearer to see how it's could be done. It's good enough! Thanks! :D

Share this post


Link to post
Share on other sites

Dear Melba23,

Now i'm convinced, and completely abandoned the 'idea'

Many Thanks for all your kind explanations about the rules

 

@Tersion, also note that below (in the OnFilt function) the array is redimensioned if the new recordset have diferent number of rows

Share this post


Link to post
Share on other sites

This is different:

edit after selection change if the user is not active during a second

Global $iLimit = 1  ;idle limit in seconds

Global $iLV, $Row, $Col, $EditMode = 22

;...

      Case 9 ; This is returned after a selection change by the user, then listview is active
         $Row = $vRet[1]
         $Col = $vRet[2]
         If $Col = 3 Then   ;this is an editable column
            AdlibRegister("_CheckIdleTimeLV", 1000)
         EndIf

;...

;https://stackoverflow.com/questions/3867584/autoit-how-to-get-system-idle-time-or-if-screensaver-is-active
Func _CheckIdleTimeLV()
   ;Melba23 GUIListViewEx: if editing then abandon
   If $cGLVEx_EditID <> 9999 Then
      AdlibUnRegister("_CheckIdleTimeLV")
   Else
      If _Timer_GetIdleTime() > 1000 Then
         ;https://www.autoitscript.com/forum/topic/182492-guilistviewex-new-version-1-aug-18/?do=findComment&comment=1401433
         ;I would suggest unregistering the Adlib immediately before entering the edit function rather than after the edit
         ;you do not want the function firing more than once.
         AdlibUnRegister("_CheckIdleTimeLV")
         _GUIListViewEx_EditItem($iLV, $Row, $Col, $EditMode)
         GUICtrlSetState($cLV, $GUI_FOCUS)
      EndIf
   EndIf
EndFunc

Thanks!

Edited by robertocm
Changed position of unregistering & unregistering if the user has started edit mode (double click or hotkey)

Share this post


Link to post
Share on other sites

robertocm,

 I would suggest unregistering the Adlib immediately before entering the edit function rather than after the edit - you do not want the function firing more than once.

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

Melba23,

I encountered with a problem. When I start my test example from previous post, then just move around in list view with UP and DOWN arrow keys and press BACKSPACE to try edit selected row - next error occur in SciTE Output:

"D:\Projects\AutoIt\experiments\GUIListViewEx.au3" (3064) : ==> Variable subscript badly formatted.:
Switch $aEditable[0][$aLocation[1]]
Switch $aEditable[0][^ ERROR

And program is terminated!

BUT, if I click at first somewhere in list view, then move around with UP and DOWN arrow keys and press BACKSPACE - NO ERROR! Everything works smoothly!

I added two .gif's that you can see what happens in both cases.

Case 1 - Terminated with error:

Spoiler

guilistviewex_crash_report_01.gif.7f3d6930d8752d1aa24c66c77aa05a5b.gif

Case 2 - Everything works correctly:

Spoiler

guilistviewex_crash_report_02.gif.63842ba49f5c187a1524edaf5c441189.gif

 

Share this post


Link to post
Share on other sites

Tersion,

I see the problem - working on a solution.

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

Melba23,

I trying to debug what is going on in GUIListViewEx.au3, and found that in firs scenario (don't click anywhere on list view), $aLocation[1] store -1 and then this value uses in Switch $aEditable[0][$aLocation[1]] => Switch $aEditable[0][-1] which is incorrect!

If view second scenario (click anywhere on list view) - then $aLocation[1] store 0 value - Switch $aEditable[0][$aLocation[1]] => Switch $aEditable[0][0].

Maybe you must add condition to check what exactly store $aLocation[1] before it's use...

Sorry if I'm wrong, because I'm new to AutoIT, but I want to help you to clarify what is going on as far as I can.

Share this post


Link to post
Share on other sites

Tersion,

Quote

 I'm new to AutoIT

But your diagnosis of the problem is quite correct - so congratulations on your detective powers.

Now I am back from the airport run I will look at how to prevent the problem happening - your suggestion is one possibility, but I would prefer getting the UDF to recognise the arrow key movements and provide a correct location in all cases. I must say I had not expected to have to do this because I assumed people would use the mouse to select the cell to edit - just goes to show how users always come up with something the developers have not considered!

M23

Edited by Melba23
Typo

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

Tersion,

Try this Beta code - if the user has not selected a column using the mouse then the UDF will open the first editable column in the selected row: <snip>

Is that good enough?

M23

Edited by Melba23
Beta code removed

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

Melba23,

Yes! Now it's works as it should! Thanks for such a quick fix!

But I ran into another problem. After you exit from edit mode (by hitting ENTER) you can't move UP by arrow key. No matter how many times I press UP, it would not work. After press twice DOWN arrow key - it's started moves OK, as it should! The same behavior with not modded GUIEventViewEX.au3. Maybe I need change something when I initialize GUIEventViewEX?

I make another .gif for you to look. It's under the spoiler:

Spoiler

guilistviewex_strange_behaviour.gif.a18fa0287bb3c5aa7090ca48fd4718ea.gif

 

Share this post


Link to post
Share on other sites

Tersion,

I see the problem, but I have no idea yet why it happens. Why can you not use the mouse like normal people?

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

@Tersion

I'm using this after editing, and works ok
 

;...
Case 1 ; This is returned after an edit attempt
GUICtrlSetState($cLV, $GUI_FOCUS)
;or try this copied from the UDF
;Melba23, GUIListViewEx
;WinSetState($hGLVEx_Editing, "", @SW_ENABLE)

 

@Melba23

Could i have a subitem selected on loading?

I mean: in my example Col 0 is partially hidden (it has info from the database table ids)

I would prefer to start showing selected the cell in Col2 Row0

and then the user moves with the arrow keys

Many Thanks

 

Share this post


Link to post
Share on other sites

Melba23,

Ok, I will switch to mouse only, to feel what it's like to be normal... Just kidding! :D

I focused on keyboard just because a such great thing like in place edit with your UDF makes me think like I'm in spread sheet editor (Excel or something), where you can moves only with keyboard. But I understand that with any UDF (not only your) you can meet restrictions with which you must be considered.

So, I will be use your GUIListViewEX as it is. And will be write back if found some problem more critical for UDF usage.

Share this post


Link to post
Share on other sites
11 hours ago, robertocm said:

Could i have a subitem selected on loading?

I mean: in my example Col 0 is partially hidden (it has info from the database table ids)

I would prefer to start showing selected the cell in Col2 Row0

and then the user moves with the arrow keys

This is working:

ControlSend($hGui, "", $cLV, "{DOWN}{RIGHT}{RIGHT}")

 

Share this post


Link to post
Share on other sites

Dear Melba23,

I think here there is an issue:

_GUIListViewEx_EditItem function does not make _GUIListViewEx_EventMonitor to return @extended = 1

In the example below see the difference in editing from the button vs. double click or backspace:

#cs ----------------------------------------------------------------------------
Melba23
https://www.autoitscript.com/forum/topic/182492-guilistviewex-new-version-22-feb-18/?do=findComment&comment=1397949
#ce ----------------------------------------------------------------------------

#include <GuiConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include "GUIListViewEx.au3"

;Create GUI
$hGUI = GUICreate("LVEx Example GetLastSel", 640, 510)

Global $Row, $Col, $EditMode = 22
Local $vRet, $aLV, $iCheckState = True
Global $cLV, $iLV, $Row, $Col, $EditMode = 22

;Create ListView
Global $cLV = GUICtrlCreateListView("Tom|Dick|Harry", 10, 40, 300, 300, $LVS_SHOWSELALWAYS)
_GUICtrlListView_SetExtendedListViewStyle($cLV, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
_GUICtrlListView_SetColumnWidth($cLV, 0, 93)
_GUICtrlListView_SetColumnWidth($cLV, 1, 93)
_GUICtrlListView_SetColumnWidth($cLV, 2, 93)

; Create array and fill Left listview
Global $aLV_List[10]
For $i = 0 To UBound($aLV_List) - 1
    $aLV_List[$i] = "Tom " & $i & "|Dick " & $i & "|Harry " & $i
    GUICtrlCreateListViewItem($aLV_List[$i], $cLV)
Next

; Initiate LVEx
;Note that using the left/right keys only returns a "selection change" message if the ListView has been set up to allow single cell highlighting
Global $iLV = _GUIListViewEx_Init($cLV, $aLV_List)
_GUIListViewEx_SetEditStatus($iLV, "*")

$cEdit_Button = GUICtrlCreateButton("Edit Selected", 430, 390, 200, 110)

_GUIListViewEx_SetActive($iLV)

; Register for sorting, dragging and editing
_GUIListViewEx_MsgRegister()

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
         Case $cEdit_Button
            _Edit_from_Button()
    EndSwitch

    $vRet = _GUIListViewEx_EventMonitor($EditMode)
    If @error Then
        MsgBox($MB_SYSTEMMODAL, "Error", "Event error: " & @error)
    EndIf
    Switch @extended
        Case 1 ; This is returned after an edit attempt
            If $vRet = "" Then
                MsgBox($MB_SYSTEMMODAL, "Edit", "Edit aborted" & @CRLF)
            Else
                MsgBox($MB_SYSTEMMODAL, "Edit", "Successful edit" & @CRLF)
            EndIf
        Case 9 ; This is returned after a selection change
            ;MsgBox($MB_SYSTEMMODAL, "Selection changed", "New selection:" & @CRLF & "Row: " & $vRet[1] & @CRLF & "Col: " & $vRet[2])
            $Row = $vRet[1]
            $Col = $vRet[2]
    EndSwitch

WEnd

Func _Edit_from_Button()
   _GUIListViewEx_EditItem($iLV, $Row, $Col, $EditMode)
EndFunc

 

 

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

  • Recently Browsing   1 member

×
×
  • Create New...