Jump to content
pixelsearch

CSV file editor

Recommended Posts

21 hours ago, pixelsearch said:

... selecting any item or subitem by using the 4 direction keys

Just an info :
Currently I am sitting on my old notebook (Win7, AutoIt 3.3.14.0). When I run the script, the Up, Down and Enter keys are working as expected, but Left and Right keys do not.

However, I strongly suspect that this has nothing to do with your great script, but is rather due to my laziness to update the notebook to AutoIt 3.3.14.5. :lol:

EDIT : Thanks to @mikell as well !

Edited by Musashi

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

Thanks Musashi :)
Sorry to hear that left & right keys didn't react correctly on your notebook, though I'm not sure it has something to do with AutoIt version.

Meanwhile, this is what we are going to do : I'm gonna modify temporarily the script above, so when you will run the script from Scite, it will write in the console the numerical code that appears when you press any key during the script. Please note what value appears when you press the left, then the right key on your notebook, while wandering through the listview

Normally here is what appears in the console when you press the 4 direction codes : up (38), down (40), left (37), right (39) . Do you get the same numbers in your console when you run the amended script ?

$LVN_KEYDOWN    >$iCounter: 1
-->VKey: 38
 $LVN_KEYDOWN   >$iCounter: 2
-->VKey: 40
 $LVN_KEYDOWN   >$iCounter: 3
-->VKey: 37
 $LVN_KEYDOWN   >$iCounter: 4
-->VKey: 39
>Exit code: 0    Time: 44.77

 

Edited by pixelsearch

Share this post


Link to post
Share on other sites
1 hour ago, pixelsearch said:

Normally here is what appears in the console when you press the 4 direction codes : up (38), down (40), left (37), right (39) . Do you get the same numbers in your console when you run the amended script ?

-> I have marked element [Row5/Col2] with the mouse (element is colored)

-> ENTER shows  Row 5 / Col 2 ==> ok

Now I used the keys UP, DOWN, LEFT and RIGHT - this is the result :

$LVN_KEYDOWN    >$iCounter: 1
-->VKey: 38
 $LVN_KEYDOWN   >$iCounter: 2
-->VKey: 40
 $LVN_KEYDOWN   >$iCounter: 3
-->VKey: 37
 $LVN_KEYDOWN   >$iCounter: 4
-->VKey: 39

(identical to yours)

By the way : If this is not a general problem, please don't put too much effort into this ;).

Edited by Musashi

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

Ok, let's wait and see if another member of the Forum will have the same problem as yours.
If I understood correctly, when you press the right or left key, nothing happens (does it mean the same cell stays selected ?) though the console indicates the good values for both keys, that would be really strange...

In case I misunderstood, please be kind enough to explain exactly what you meant by "Left and Right keys do not work as expected", does it mean the selection changes to the right cell (if you pressed the right key) or to the left cell (if you pressed the left key), without being coloured ?

Edited by pixelsearch

Share this post


Link to post
Share on other sites
11 minutes ago, pixelsearch said:

If I understood correctly, when you press the right or left key, nothing happens (the same cell stays selected, right ?)

Yes ! That's exactly the kind of behavior I meant by "Left and Right keys do not work as expected".

 


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

Ok I added more debug in the script : if I start the way you did,  marking cell row 5 / col 2 with the mouse, then key left twice, this is the new debug in the console :

$LVN_KEYDOWN    >$iCounter: 1
-->VKey: 37
+++Item:    5
+++SubItem: 1
 $LVN_KEYDOWN   >$iCounter: 2
-->VKey: 37
+++Item:    5
+++SubItem: 0

It means the 1st left key (37) moved the selection to row 5 / column 1
Then the 2nd left key (37) moved the selection to row 5 / column 0

53417736_forum1.png.74ed48f548208aaa1a4135d5c852bd20.png

As seen in the pic, on my screen, the selection is really on column 0, but you're saying that on your screen, it is still on column 2, even after you typed 2 left keys.

Could you please run the amended script, and share the console results ?
Thanks

 

Edited by pixelsearch

Share this post


Link to post
Share on other sites
10 minutes ago, pixelsearch said:

if I start the way you did, marking cell row 5/ col 2 with the mouse, then key left twice, this is the new debug :

This is mine (exactly like yours again) :

$LVN_KEYDOWN    >$iCounter: 1
-->VKey: 37
+++Item:    5
+++SubItem: 1
 $LVN_KEYDOWN   >$iCounter: 2
-->VKey: 37
+++Item:    5
+++SubItem: 0

 

15 minutes ago, pixelsearch said:

As seen in the pic, on my screen, the selection is really on column 0, but you're saying that on your screen, it is still on column 2, even after you typed 2 left keys.

Yes, Col 2 , although the values look correct - strange.

I suggest we wait and see if other members have the same problem.

If the problem lies in the outdated AutoIt version (3.3.14.0), then that's the way it is. Of course, it would be nice if a script is downward compatible (at least within 3.3.14.x) but absolute not mandatory.

Thank you for your helpfulness, i think it's time for me to go to bed now :lol:.

Musashi


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

It's soo late and I'm really sleepy too
Look, in case it didn't solve your issue, here is a last test : I forced the row to redraw itself after each keystroke with this line of code :

_GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)

Though speed will slow down a bit because of double redraws, let's see if it solves your issue, ok ?
Please try the script again, maybe this last test will be the good one, fingers crossed.

And if it doesn't solve it... tomorrow will be another day :)

Share this post


Link to post
Share on other sites
6 hours ago, pixelsearch said:

... here is a last test : I forced the row to redraw itself after each keystroke with :

_GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)

 

[...]
                    _DebugPrint("$LVN_KEYDOWN" & @TAB & ">$iCounter: " & $iCounter & @CRLF & _
                        "-->VKey: " & $iVK & @CRLF & _
                        "+++Item:" & @TAB & $g_iItem & @CRLF & _
                        "+++SubItem:" & @TAB & $g_iSubItem & @CRLF)
                    _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)
                    [...]

That solved the problem !

The VKey values in the console output and the graphical representation now match :thumbsup:.


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

Very happy to hear that Musashi. This is what I just did :
* Reverted to the original script in 1st post.
* Then added 2 optional lines, changing this :

Case $VK_RIGHT
        If $g_iSubItem < $g_iColumnCount Then
            $g_iSubItem += 1
        EndIf
    Case $VK_LEFT
        If $g_iSubItem > 0 Then
            $g_iSubItem -= 1
        EndIf

to that :

Case $VK_RIGHT
        If $g_iSubItem < $g_iColumnCount Then
            $g_iSubItem += 1
            ; _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)
        EndIf
    Case $VK_LEFT
        If $g_iSubItem > 0 Then
            $g_iSubItem -= 1
            ; _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)
        EndIf

As we'll probably never know why this issue appeared at your place (maybe because you're using an old AutoIt version but I'm not sure), so please redownload the original script and uncomment both lines.

There's no need to use the debug version, which redraws a whole row no matter what key is pressed, it will slow down the script in case of quick scrolling

For the rest of us (until now), as it works with both lines commented, we'll keep them commented.

And if tomorrow another user gets the same issue as yours, we'll let him know which lines to uncomment : in my original code they both got this comment :)

; Musashi needs it for right & left key only

 

Edited by pixelsearch

Share this post


Link to post
Share on other sites
4 hours ago, pixelsearch said:

... it will slow down the script in case of quick scrolling.

For the rest of us (until now), as it works with both lines commented, we'll keep them commented.

That would also be my proposal to solve this particular problem. Now everyone knows how to deal with this issue if it occurs.

4 hours ago, pixelsearch said:

in my original code they both got this comment :)

; Musashi needs it for right & left key only

🤣

Thanks again, and mission accomplished.

Musashi


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

Thanks for the script pixelsearch.

This same issue happens to me, but I'm on Windows 7 x64 Pro with latest AutoIt.

When pressing left or right arrow keys, nothing happens... until I press up or down. When pressing up or down I notice that my previous left/right press is now actioned on. The edits you made have solved it.

On 11/11/2019 at 10:41 PM, pixelsearch said:

We'll discuss about the edit code in a future post.

Subbed 😛

Share this post


Link to post
Share on other sites

Thanks Inpho
That's nice to report what happened :)

Could you please be kind enough and confirm this : when you use any of the 6 vertical scrolling keys, is the selection correct ?
Those 6 keys are : Up key, Down key , Page Up, Page Down, Home (1st row), End (last row)

Meanwhile, I'm gonna modify (today done) the original script to take care of this horizontal scrolling issue, depending on the OS of the user. It seems that the structures used in NM_CUSTOMDRAW or LV_ITEM change a bit with the OS, depending on the version of comctl32.dll found in the computer. That's just a guess but Microsoft pages describe this kind of behavior.

I wish I knew how to send a CCM_SETVERSION message from AutoIt but I don't know how to do this.

Edited by pixelsearch

Share this post


Link to post
Share on other sites
21 minutes ago, pixelsearch said:

when you use any of the 6 vertical scrolling keys, is the selection correct ?

An additional feedback from me (start in [Row5/Col2] again) :

Up -> Down -> Page Up -> Page Down -> Home -> End -> and another Up to show the last value.

$LVN_KEYDOWN    >$iCounter: 1
-->VKey: 38
+++Item:    5
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 2
-->VKey: 40
+++Item:    4
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 3
-->VKey: 33
+++Item:    5
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 4
-->VKey: 34
+++Item:    0
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 5
-->VKey: 36
+++Item:    15
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 6
-->VKey: 35
+++Item:    0
+++SubItem: 2
 $LVN_KEYDOWN   >$iCounter: 7
-->VKey: 38
+++Item:    99
+++SubItem: 2
+>11:13:50 AutoIt3.exe ended.rc:0

Everything works as expected.


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

All 6 keys work correctly; the expected row is selected.

Also doesn't suffer from slowdown when holding arrow key; tested on 10,000 x 4 LV.

Share this post


Link to post
Share on other sites

Thanks to both of you for the tests :thumbsup:
I just made a permanent change in the original script, it should work correctly on any OS, fingers crossed.

@Inpho : your sentence "Also doesn't suffer from slowdown when holding arrow key (10,000 rows)"
That's the exact reason why I avoid to Redraw if any key is pressed (mikell, if you read this...)
It doesn't suffer slowdown because there is no Redraw on any of the 6 vertical keys, only on the 2 horizontal ones (left/right)

Edited by pixelsearch

Share this post


Link to post
Share on other sites
7 minutes ago, pixelsearch said:

... it should work correctly on any OS, fingers crossed.

I jumped wildly through the whole list without any problems :thumbsup:.
Oh, and you can remove this comment :

; Musashi needs it for right & left key only

from your original code now 😛.


Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Share this post


Link to post
Share on other sites

I seem to have forgotten how to use virtual listviews...

Tried implementing this into a 3 x 10,000 listview (yes, 3 rows, 10k columns) but I seem to have suffered a brainfart.

 

Could you help with an example of using this in a virtual listview please?

My attempt:

#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <WinAPIvkeysConstants.au3>

Global $sHeaders = ""
Global $aArrayLog[50][10]

For $i = 0 To UBound($aArrayLog) - 1
    For $ii = 0 To UBound($aArrayLog, 2) - 1
        $aArrayLog[$i][$ii] = "kfjdskfsdhfkjsdhfkdshkj"
    Next
Next

_ArrayDisplay($aArrayLog)
For $i = 0 To UBound($aArrayLog, 2) - 1
    $sHeaders &= $i & "|"
Next
$sHeaders = StringTrimRight($sHeaders, 1)

Global $hGUI = GUICreate("Wandering through ListView (901f)", 460, 500, -1, -1,BitOr($WS_SIZEBOX,$WS_MAXIMIZEBOX,$WS_MINIMIZEBOX) -1)
Global $idListView = GUICtrlCreateListView($sHeaders, 15, 60, 430, 400, $LVS_OWNERDATA, BitOr($LVS_EX_FULLROWSELECT,$LVS_EX_DOUBLEBUFFER,$WS_EX_CLIENTEDGE))
Global $hListView = GuiCtrlGetHandle($idListView)

Global $g_iColumnCount = _GUICtrlListView_GetColumnCount($idListView) -1
Global $g_iItem = -1, $g_iSubItem = -1 ; item/subitem selected in ListView control

Global $idDummy_Dbl_Click = GUICtrlCreateDummy()
Global $idDummy_Enter = GUICtrlCreateDummy()

Global $aAccelKeys[1][2] = [["{ENTER}", $idDummy_Enter]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$iRows =  UBound($aArrayLog)
GUICtrlSendMsg( $hListView, $LVM_SETITEMCOUNT, $iRows, 0 )

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            Exit

        Case $idDummy_Dbl_Click
            MsgBox($MB_TOPMOST, "Double-click activated cell", _
                "Row " & $g_iItem & " / Col " & $g_iSubItem)

        Case $idDummy_Enter
            If _WinAPI_GetFocus() = $hListView And $g_iItem > -1 Then
                MsgBox($MB_TOPMOST, "Enter activated cell", _
                    "Row " & $g_iItem & " / Col " & $g_iSubItem)
            EndIf
    EndSwitch
WEnd

;============================================
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam

    Local Static $tText = DllStructCreate( "wchar[100]" )
    Local Static $pText = DllStructGetPtr( $tText )

    Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Local $tNMHDR2 = DllStructCreate($tagNMLISTVIEW, $lParam)
    Local $hWndFrom2 = DllStructGetData($tNMHDR2, "hWndFrom")
    Local $iCode2 = DllStructGetData($tNMHDR2, "Code")

    Static $bMouseDown = False

    Switch $hWndFrom
        Case $hListView

            Switch $iCode2

                Case $LVN_GETDISPINFOW

                    Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam )
                    If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
                        Local $sItem = $aArrayLog[DllStructGetData($tNMLVDISPINFO,"Item")][DllStructGetData($tNMLVDISPINFO,"SubItem")]
                        DllStructSetData( $tText, 1, $sItem )
                        DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
                        DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )

                    EndIf

            EndSwitch

            Switch $iCode



                Case $NM_CUSTOMDRAW
                    Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                    Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                    Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                    Local $iColor = 0xFF000000 ; this is $CLR_DEFAULT in ColorConstants.au3
                    If $iItem = $g_iItem And $iSubItem = $g_iSubItem Then
                        $iColor = 0xFFFFC0 ; light blue for 1 subitem (BGR)
                    EndIf
                    DllStructSetData($tCustDraw, "clrTextBk", $iColor)
                    Return $CDRF_NEWFONT

                Case $LVN_KEYDOWN
                    If $bMouseDown Or $g_iItem = -1 Then Return 1 ; don't process
                    Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $lParam)
                    Local $iVK = DllStructGetData($tInfo, "VKey")
                    Switch $iVK
                        Case $VK_RIGHT
                            If $g_iSubItem < $g_iColumnCount Then
                                $g_iSubItem += 1
                                 _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)
                            EndIf
                        Case $VK_LEFT
                            If $g_iSubItem > 0 Then
                                $g_iSubItem -= 1
                                 _GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)
                            EndIf
                        Case $VK_SPACE ; spacebar would select the whole row
                            Return 1
                    EndSwitch

                Case $NM_RELEASEDCAPTURE
                    $bMouseDown = True
                    Local $iItemSave = $g_iItem
                    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
                    $g_iItem = $aHit[0]
                    $g_iSubItem = $aHit[1]
                    If $g_iItem = -1 And $iItemSave > -1 Then
                        _GUICtrlListView_RedrawItems($hListview, $iItemSave, $iItemSave)
                    EndIf

                Case $LVN_ITEMCHANGED
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
                    Local $iNewState = DllStructGetData($tInfo, "NewState")
                    Switch $iNewState
                        Case BitOr($LVIS_FOCUSED, $LVIS_SELECTED)
                            $g_iItem = DllStructGetData($tInfo, "Item")
                            _GUICtrlListView_SetItemSelected($hListview, $g_iItem, False)
                    EndSwitch
                    ;_GUICtrlListView_RedrawItems($hListview, $g_iItem, $g_iItem)

                Case $NM_CLICK, $NM_RCLICK
                    $bMouseDown = False

                Case $NM_DBLCLK
                    $bMouseDown = False
                    If $g_iItem > -1 Then GUICtrlSendToDummy($idDummy_Dbl_Click)

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

 

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

×
×
  • Create New...