MadBoy Posted April 9, 2006 Posted April 9, 2006 Hey, how to make that ListBox to go down to last added entry. I am writting a program that will add info to that list box while it finishes some parts of program. The lines added will exceed number of lines visible in ListBox and scrolling down will be needed. It doesn't happen thou by default when new things are added so user can't realy see whats happening. I would like to add autoscrolling but couldn't find one for ListBox. Lemme know how i can make it happen. $LogBox = GuiCtrlCreateList("", 5, 220, 440, 150,BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOTIFY,$LBS_DISABLENOSCROLL)) GuiCtrlSetData($LogBox,"Starting program.|") GUICtrlSetData($LogBox,"Detecting number of unknown devices in system.|") GuiCtrlSetData($LogBox,"Detecting number of all devices in system.|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") GUICtrlSetData($LogBox,"You clicked button No1|") My little company: Evotec (PL version: Evotec)
jackyyll Posted April 9, 2006 Posted April 9, 2006 #Include <GuiList.au3> _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)) Should work
MadBoy Posted April 9, 2006 Author Posted April 9, 2006 Well it's not quite what i wanted since to work i would have to add that line everytime i add something to ListBox. Also i had to use _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1), otherwise it wasn't working. I would prefer some way that you set it like $autoscrolltolastline. So if anything is added to listbox it's shown right away. My little company: Evotec (PL version: Evotec)
jackyyll Posted April 9, 2006 Posted April 9, 2006 You could just make a function that adds the stuff to the listbox and then scrolls to the bottom with _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1)
MadBoy Posted April 9, 2006 Author Posted April 9, 2006 You could just make a function that adds the stuff to the listbox and then scrolls to the bottom with _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1)Good idea Lets try it My little company: Evotec (PL version: Evotec)
Moderators SmOke_N Posted April 9, 2006 Moderators Posted April 9, 2006 Well it's not quite what i wanted since to work i would have to add that line everytime i add something to ListBox. Also i had to use _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1), otherwise it wasn't working. I would prefer some way that you set it like $autoscrolltolastline. So if anything is added to listbox it's shown right away.Well, I guess you could cheat until someone comes up with a different idea:#include <guiconstants.au3> $Main = GUICreate('', 600) $LogBox = GuiCtrlCreateList("", 5, 220, 440, 150,BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOTIFY, $LBS_DISABLENOSCROLL)) GuiCtrlSetData($LogBox,"Starting program.|") GUICtrlSetData($LogBox,"Detecting number of unknown devices in system.|") GuiCtrlSetData($LogBox,"Detecting number of all devices in system.|") For $i = 1 To 14 _CtrlSetDataAndPos($Main, $LogBox, "You clicked button No1|") Next GUISetState() While 1 If GUIGetMsg() = - 3 Then Exit WEnd Func _CtrlSetDataAndPos($i_Win, $i_Ctrl, $v_Data, $i_Pos = 1) GUICtrlSetData($i_Ctrl, $v_Data) If $i_Pos = 1 Then ControlSend($i_Win, '', $i_Ctrl, '{END}') EndFunc Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
MadBoy Posted April 9, 2006 Author Posted April 9, 2006 Func _AddLineBox($Text) GuiCtrlSetData($LogBox,"["& _NowTime(5) & "] - " & $Text & "|") _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1) EndFunc Works great!! Tnx My little company: Evotec (PL version: Evotec)
jackyyll Posted April 9, 2006 Posted April 9, 2006 Func _AddLineBox($Text) GuiCtrlSetData($LogBox,"["& _NowTime(5) & "] - " & $Text & "|") _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1) EndFunc Works great!! Tnx No problem
MadBoy Posted April 9, 2006 Author Posted April 9, 2006 @Smoke_N: hehe Tnx, already solved. jackyyll idea seems to be simpler My little company: Evotec (PL version: Evotec)
Moderators SmOke_N Posted April 9, 2006 Moderators Posted April 9, 2006 (edited) @Smoke_N: hehe Tnx, already solved. jackyyll idea seems to be simpler No problem, I was looking at it when I guess ya'll were talking about it, I decided to just make it like it was the thing making the data... I've never had a need for it, but I think this would work for most control options. Only difference between the 2 I think, Is that your calling 2 other functions within a function, I don't know how large your scripts are going to be or how much data you will be setting at one time, but that may cause an issue, as with the solution I was thinking of, was the quickest method I could think of. But I'm glad you have your issue worked out. Edit: After looking at the 2, I have to agree, that I think the DLLCall is more efficient here, and less likely to cause problems (like if you have a hotkey set for 'end' lol)... But I don't understand the "simpler" part: The code your suggesting:expandcollapse popup#include <guiconstants.au3> #include <date.au3> Global Const $LB_SETCURSEL = 0x186 Global Const $LB_GETCOUNT = 0x18B $Main = GUICreate('', 600) $LogBox = GuiCtrlCreateList("", 5, 220, 440, 150,BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOTIFY, $LBS_DISABLENOSCROLL)) GuiCtrlSetData($LogBox,"Starting program.|") GUICtrlSetData($LogBox,"Detecting number of unknown devices in system.|") GuiCtrlSetData($LogBox,"Detecting number of all devices in system.|") For $i = 1 To 14 _AddLineBox("You clicked button No1|") Next GUISetState() While 1 If GUIGetMsg() = - 3 Then Exit WEnd Func _AddLineBox($Text) GuiCtrlSetData($LogBox,"["& _NowTime(5) & "] - " & $Text & "|") _GUICtrlListSelectIndex($LogBox, _GUICtrlListCount($LogBox)-1) EndFunc Func _GUICtrlListSelectIndex($h_listbox, $i_index) If IsHWnd($h_listbox) Then Local $a_ret = DllCall("user32.dll", "int", "SendMessage", "hwnd", $h_listbox, "int", $LB_SETCURSEL, "int", $i_index, "int", 0) Return $a_ret[0] Else Return GUICtrlSendMsg($h_listbox, $LB_SETCURSEL, $i_index, 0) EndIf EndFunc;==>_GUICtrlListSelectIndex Func _GUICtrlListCount($h_listbox) If IsHWnd($h_listbox) Then Local $a_ret = DllCall("user32.dll", "int", "SendMessage", "hwnd", $h_listbox, "int", $LB_GETCOUNT, "int", 0, "int", 0) Return $a_ret[0] Else Return GUICtrlSendMsg($h_listbox, $LB_GETCOUNT, 0, 0) EndIf EndFunc ;==>_GUICtrlListCount The code I was:#include <guiconstants.au3> #include <date.au3> $Main = GUICreate('', 600) $LogBox = GuiCtrlCreateList("", 5, 220, 440, 150,BitOR($WS_BORDER, $WS_VSCROLL, $LBS_NOTIFY, $LBS_DISABLENOSCROLL)) GuiCtrlSetData($LogBox,"Starting program.|") GUICtrlSetData($LogBox,"Detecting number of unknown devices in system.|") GuiCtrlSetData($LogBox,"Detecting number of all devices in system.|") For $i = 1 To 14 _CtrlSetDataAndPos($Main, $LogBox, "["& _NowTime(5) & "] - " & "You clicked button No1|") Next GUISetState() While 1 If GUIGetMsg() = - 3 Then Exit WEnd Func _CtrlSetDataAndPos($i_Win, $i_Ctrl, $v_Data, $i_Pos = 1) GUICtrlSetData($i_Ctrl, $v_Data) If $i_Pos = 1 Then ControlSend($i_Win, '', $i_Ctrl, '{END}') EndFuncIronically, I actually think the 1st is faster, but I didn't do much testing... So as stated before, glad you found a viable solution. After thinking about this, I wonder why none of us used GUICtrlSendMsg() Edited April 9, 2006 by SmOke_N Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
GaryFrost Posted April 9, 2006 Posted April 9, 2006 you could of used _GUICtrlListSetTopIndex also. SciTE for AutoItDirections for Submitting Standard UDFs Don't argue with an idiot; people watching may not be able to tell the difference.
jackyyll Posted April 9, 2006 Posted April 9, 2006 Oh.. always thought that had soemething to do with the top item in the list But either way it does the same thing
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now