Jump to content
Fink89

Problem with GuiCtrlList

Recommended Posts

Fink89

Hi,

I have problem with GuiCtrlList. I use GUICtrlCreateList and GUICtrlSetData with 10 row. When I select 1 row and click button  , It will run func exp(). 

I want when I use keyboard up or down, It will run func exp() with that's row, without click button. 

Share this post


Link to post
Share on other sites
Fink89
#include <guiconstantsex.au3>;
#include <GUIConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
#include <_httprequest.au3>
#include <GuiListView.au3>
#include <Array.au3>
Global $aSorting[3]
 Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
 Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
 GUICreate ("Check Tokens Address Myetherwallet" ,800 ,600 ,150 ,50)
   $address=GUICtrlCreateLabel ("List Address:" , 10 , 20 , 100 , 20)
   $input=GUICtrlCreateButton ("Choose File" ,5,40 ,70 ,25)
   $run=GUICtrlCreateButton ("Check" ,405,40 ,70 ,25)
   GUICtrlSetState($run, $GUI_FOCUS)
   $mylist=GUICtrlCreateList ("" ,100 , 0 , 300 ,600)   
   $myview=GUICtrlCreateListView("Tokens Name|Tokens Balance|Tokens Symbol" ,480 , 0 , 300 ,600,-1,$iExWindowStyle)
   $cButton_0 = GUICtrlCreateButton("Sort Name", 405, 80, 70, 25)
   $cButton_1 = GUICtrlCreateButton("Sort Balance", 405, 120, 70, 25)
   $up = GUICtrlCreateButton("Up", 405, 160, 70, 25)
   $down = GUICtrlCreateButton("Down", 405, 200, 70, 25)
   _GUICtrlListView_SetColumnWidth($myview, 0, 100)
   _GUICtrlListView_SetColumnWidth($myview, 1, $LVSCW_AUTOSIZE_USEHEADER)
   _GUICtrlListView_SetExtendedListViewStyle($myview, $iExListViewStyle)
    Local $aAccelKeys[2][2] = [["{UP}", $run], ["{Down}", $run]]
    GUISetAccelerators($aAccelKeys)
   GUISetState(@SW_SHOW)


 While 1
   Switch GUIGetMsg()

   Case $GUI_EVENT_CLOSE
        ExitLoop

   Case $input
        $var = FileOpenDialog('Open File', @ScriptDir & "\", "Text (*.txt)", 1 + 4 )
        Global $line=_FileCountLines($var)
      For $x = 1 to _FileCountLines($var)
      $a = FileReadLine($var, $x)
    $mew=GUICtrlSetData ($mylist ,$a) 
      Next

   Case $run
   _GUICtrlListView_DeleteAllItems($myview)
   $b=GUICtrlRead($mylist, $GUI_READ_EXTENDED)
   $search = 'https://api.ethplorer.io/getAddressInfo/' & $b & '?apiKey=freekey'
   $rq1 = _HttpRequest(4, $search)
   $name=StringRegExp($rq1[1], 'name":"(.*?)"', 3)
    $row=ubound($name,1)-1
   $sym=StringRegExp($rq1[1], 'symbol":"(.*?)"', 3)
   $balance1=StringRegExp($rq1[1], 'balance":(.*?),', 3)
   $u=ubound($balance1,1)-1
   $decimal=StringRegExp($rq1[1], 'decimals":(.*?),', 3)
      Select
      Case $u = 0
      GUICtrlCreateListViewItem('No Tokens Balance', $myview)
      Case Else
      For $i=0 to $row
      $item=GUICtrlCreateListViewItem('name|balance|symbol', $myview)
         Select
         Case $decimal[$i]= '0'
         $balance= $balance1[$i+1]
         Case $decimal[$i]= '"1"'
         $balance= $balance1[$i+1] * 0.1
         Case $decimal[$i]= '"2"'
         $balance= $balance1[$i+1] * 0.01
         Case $decimal[$i]= '"3"'
         $balance= $balance1[$i+1] * 0.001
         Case $decimal[$i]= '3'
         $balance= $balance1[$i+1] * 0.001
         Case $decimal[$i]= '"4"'
         $balance= $balance1[$i+1] * 0.0001
         Case $decimal[$i]= '"5"'
         $balance= $balance1[$i+1] * 0.00001
         Case $decimal[$i]= '"6"'
         $balance= $balance1[$i+1] * 0.000001
         Case $decimal[$i]= '"7"'
         $balance= $balance1[$i+1] * 0.0000001
         Case $decimal[$i]= '"8"'
         $balance= $balance1[$i+1] * 0.00000001
         Case $decimal[$i]= '"9"'
         $balance= $balance1[$i+1] * 0.000000001
         Case $decimal[$i]= '"10"'
         $balance= $balance1[$i+1] * 0.0000000001
         Case $decimal[$i]= '"11"'
         $balance= $balance1[$i+1] * 0.00000000001
         Case $decimal[$i]= '"12"'
         $balance2=stringsplit($balance1[$i+1],'e+')
         $balance=$balance2[1] * 10^ ($balance2[3]-12)
         Case $decimal[$i]= '"16"'
         $balance2=stringsplit($balance1[$i+1],'e+')
         $balance=$balance2[1] * 10^ ($balance2[3]-16)
         Case $decimal[$i]= '"18"'
         $balance2=stringsplit($balance1[$i+1],'e+')
         $balance=$balance2[1] * 10^ ($balance2[3]-18)
         Case $decimal[$i]= '18'
         $balance2=stringsplit($balance1[$i+1],'e+')
         $balance=$balance2[1] * 10^ ($balance2[3]-18)
         Case Else
         MsgBox($MB_SYSTEMMODAL, "Error", "Name token error: " & " " & $name[$i])
         EndSelect
         GUICtrlSetData($item, $name[$i])
         GUICtrlSetData($item, '||' & $sym[$i])
         GUICtrlSetData($item, '|' & $balance)
      Next
   EndSelect
      Case $cButton_0
            _GUICtrlListView_SimpleSort($myview, $aSorting, 0)
      Case $cButton_1
            _GUICtrlListView_SimpleSort($myview, $aSorting, 1)
EndSwitch
   WEnd

I use GUISetAccelerators but It run func button , don't up or down row.

Share this post


Link to post
Share on other sites
Fink89

I want, If I select 1 row, It get text that's row and run func $run.

Share this post


Link to post
Share on other sites
Zedna
Posted (edited)

Here is your code changed to example how to achieve invoking of function when selection of ListView changes (set text in StatusBar):

You can accomodate this example also for another controls in GUI (List instead of ListView?)

Note: Keyboard shortcuts Up/Down works too when ListView has focus

#include <guiconstantsex.au3>;
#include <GUIConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
;~ #include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
;~ #include <_httprequest.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <Array.au3>

Global $disable_refresh_status = False
Global $aSorting[3]
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)

$Form1 = GUICreate("Check Tokens Address Myetherwallet", 800, 600, 150, 50)
$address = GUICtrlCreateLabel("List Address:", 10, 20, 100, 20)
$input = GUICtrlCreateButton("Choose File", 5, 40, 70, 25)
$run = GUICtrlCreateButton("Check", 405, 40, 70, 25)
GUICtrlSetState($run, $GUI_FOCUS)
$mylist = GUICtrlCreateList("", 100, 0, 300, 600)
$myview = GUICtrlCreateListView("Tokens Name|Tokens Balance|Tokens Symbol", 480, 0, 300, 600, -1, $iExWindowStyle)
$cButton_0 = GUICtrlCreateButton("Sort Name", 405, 80, 70, 25)
$cButton_1 = GUICtrlCreateButton("Sort Balance", 405, 120, 70, 25)
$up = GUICtrlCreateButton("Up", 405, 160, 70, 25)
$down = GUICtrlCreateButton("Down", 405, 200, 70, 25)
_GUICtrlListView_SetColumnWidth($myview, 0, 100)
_GUICtrlListView_SetColumnWidth($myview, 1, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetExtendedListViewStyle($myview, $iExListViewStyle)
;~ Local $aAccelKeys[2][2] = [["{UP}", $run],["{Down}", $run]]
;~ GUISetAccelerators($aAccelKeys)
$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

$disable_refresh_status = True
For $i = 0 To 10
    GUICtrlCreateListViewItem('name '&$i&'|balance '&$i&'|symbol '&$i&'', $myview)
Next
$disable_refresh_status = False

While 1
    Switch GUIGetMsg()

        Case $GUI_EVENT_CLOSE
            ExitLoop

        Case $cButton_0
            _GUICtrlListView_SimpleSort($myview, $aSorting, 0)
        Case $cButton_1
            _GUICtrlListView_SimpleSort($myview, $aSorting, 1)
    EndSwitch
WEnd

Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event

    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    $event = DllStructGetData($tagNMHDR, 3)

    ; when $disable_refresh_status = True don't invoke --> on mass changes in ListView
    ; to not it be slow and don't paint in statusbar change of each row in such situations
    If $hWndGUI = $Form1 And $wParam = $myview  And $disable_refresh_status = False Then
        If $event = $LVN_ITEMCHANGED Then
            $NMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
            If BitAND(DllStructGetData($NMLISTVIEW, "Changed"), $LVIF_STATE) = $LVIF_STATE And _
                DllStructGetData($NMLISTVIEW, "NewState") <> DllStructGetData($NMLISTVIEW, "OldState") Then RefreshStatusBar()
        EndIf
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc

; invoked everytime when selection changes
Func RefreshStatusBar()
    $i = _GUICtrlListView_GetNextItem($myview)
    $name = _GUICtrlListView_GetItemText($myview, $i)
    _GUICtrlStatusBar_SetText($StatusBar1, 'Selected item: index=' & $i & ' name=' & $name)
EndFunc

 

Edited by Zedna
  • Thanks 1

Share this post


Link to post
Share on other sites
Zedna
Posted (edited)

Here it's accomodated to ListBox, when selection changes function is invoked (here StatusBar text is refreshed):

Note: Keyboard shortcuts Up/Down works too when ListBox has focus

#include <guiconstantsex.au3>;
#include <GUIConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
;~ #include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
;~ #include <_httprequest.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <Array.au3>

Global $aSorting[3]
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)

$Form1 = GUICreate("Check Tokens Address Myetherwallet", 800, 600, 150, 50)
$address = GUICtrlCreateLabel("List Address:", 10, 20, 100, 20)
$input = GUICtrlCreateButton("Choose File", 5, 40, 70, 25)
$run = GUICtrlCreateButton("Check", 405, 40, 70, 25)
GUICtrlSetState($run, $GUI_FOCUS)
$mylist = GUICtrlCreateList("", 100, 0, 300, 580)
$hListBox = GUICtrlGetHandle($mylist)
$myview = GUICtrlCreateListView("Tokens Name|Tokens Balance|Tokens Symbol", 480, 0, 300, 600, -1, $iExWindowStyle)
$cButton_0 = GUICtrlCreateButton("Sort Name", 405, 80, 70, 25)
$cButton_1 = GUICtrlCreateButton("Sort Balance", 405, 120, 70, 25)
$up = GUICtrlCreateButton("Up", 405, 160, 70, 25)
$down = GUICtrlCreateButton("Down", 405, 200, 70, 25)
_GUICtrlListView_SetColumnWidth($myview, 0, 100)
_GUICtrlListView_SetColumnWidth($myview, 1, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetExtendedListViewStyle($myview, $iExListViewStyle)
;~ Local $aAccelKeys[2][2] = [["{UP}", $run],["{Down}", $run]]
;~ GUISetAccelerators($aAccelKeys)
$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

For $i = 0 To 10
    GUICtrlSetData($mylist, 'Item '&StringFormat('%02i', $i))
Next

While 1
    Switch GUIGetMsg()

        Case $GUI_EVENT_CLOSE
            ExitLoop

        Case $cButton_0
            _GUICtrlListView_SimpleSort($myview, $aSorting, 0)
        Case $cButton_1
            _GUICtrlListView_SimpleSort($myview, $aSorting, 1)
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $msg, $wparam, $lparam)
    #forceref $hWnd, $msg, $wparam, $lparam

    Local $i_command_code = BitAND($wparam, 0xFFFF)
    Local $i_command_notify = BitShift($wparam, 16)

    Switch $lparam
        Case $hListBox
            Switch $i_command_notify
                Case $LBN_SELCHANGE
                    RefreshStatusBar()
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

; invoked everytime when selection changes
Func RefreshStatusBar()
    $text = GUICtrlRead($mylist)
    _GUICtrlStatusBar_SetText($StatusBar1, 'ListBox, Selected item text: ' & $text)
EndFunc

 

Edited by Zedna
typo
  • Thanks 1

Share this post


Link to post
Share on other sites
Zedna

And here is funcionality of both previous scripts joined together to only one script

show catching of selection change in ListBox+ListView at the same time:

; https://www.autoitscript.com/forum/topic/193573-problem-with-guictrllist/

#include <guiconstantsex.au3>;
#include <GUIConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
;~ #include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>
;~ #include <_httprequest.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <Array.au3>

Global $disable_refresh_status = False
;~ Global $aSorting[3]
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)

$Form1 = GUICreate("Check Tokens Address Myetherwallet", 800, 600, 150, 50)
$address = GUICtrlCreateLabel("List Address:", 10, 20, 100, 20)
$input = GUICtrlCreateButton("Choose File", 5, 40, 70, 25)
$run = GUICtrlCreateButton("Check", 405, 40, 70, 25)
GUICtrlSetState($run, $GUI_FOCUS)
$mylist = GUICtrlCreateList("", 100, 0, 300, 580)
$hListBox = GUICtrlGetHandle($mylist)
$myview = GUICtrlCreateListView("Tokens Name|Tokens Balance|Tokens Symbol", 480, 0, 300, 580, -1, $iExWindowStyle)
$cButton_0 = GUICtrlCreateButton("Sort Name", 405, 80, 70, 25)
$cButton_1 = GUICtrlCreateButton("Sort Balance", 405, 120, 70, 25)
$up = GUICtrlCreateButton("Up", 405, 160, 70, 25)
$down = GUICtrlCreateButton("Down", 405, 200, 70, 25)
_GUICtrlListView_SetColumnWidth($myview, 0, 100)
_GUICtrlListView_SetColumnWidth($myview, 1, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetExtendedListViewStyle($myview, $iExListViewStyle)
$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

For $i = 0 To 10
    GUICtrlSetData($mylist, 'Item '&StringFormat('%02i', $i))
Next

$disable_refresh_status = True
For $i = 0 To 10
    GUICtrlCreateListViewItem('name '&$i&'|balance '&$i&'|symbol '&$i&'', $myview)
Next
$disable_refresh_status = False

While 1
    Switch GUIGetMsg()

        Case $GUI_EVENT_CLOSE
            ExitLoop

;~      Case $cButton_0
;~          _GUICtrlListView_SimpleSort($myview, $aSorting, 0)
;~      Case $cButton_1
;~          _GUICtrlListView_SimpleSort($myview, $aSorting, 1)
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $msg, $wparam, $lparam)
    #forceref $hWnd, $msg, $wparam, $lparam

    Local $i_command_code = BitAND($wparam, 0xFFFF)
    Local $i_command_notify = BitShift($wparam, 16)

    Switch $lparam
        Case $hListBox
            Switch $i_command_notify
                Case $LBN_SELCHANGE
                    RefreshStatusBar('LB')
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event

    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    $event = DllStructGetData($tagNMHDR, 3)

    ; when $disable_refresh_status = True don't invoke --> on mass changes in ListView
    ; to not it be slow and don't paint in statusbar change of each row in such situations
    If $hWndGUI = $Form1 And $wParam = $myview  And $disable_refresh_status = False Then
        If $event = $LVN_ITEMCHANGED Then
            $NMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
            If BitAND(DllStructGetData($NMLISTVIEW, "Changed"), $LVIF_STATE) = $LVIF_STATE And _
                DllStructGetData($NMLISTVIEW, "NewState") <> DllStructGetData($NMLISTVIEW, "OldState") Then RefreshStatusBar('LV')
        EndIf
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc

; invoked everytime when selection changes
Func RefreshStatusBar($what)
    If $what == 'LB' Then ; ListBox
        $text = GUICtrlRead($mylist)
        _GUICtrlStatusBar_SetText($StatusBar1, 'ListBox, Selected item text: ' & $text)
    EndIf

    If $what == 'LV' Then ; ListView
        $i = _GUICtrlListView_GetNextItem($myview)
        $name = _GUICtrlListView_GetItemText($myview, $i)
        _GUICtrlStatusBar_SetText($StatusBar1, 'ListView, Selected item: index=' & $i & ' name=' & $name)
    EndIf
EndFunc

 

  • Thanks 1

Share this post


Link to post
Share on other sites
Fink89

Thanks you very much, with your first code, I was run code perfect.

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

×