Linked Vertical Scroll Bars?

Started by jerwah, November 01, 2013, 06:57:18 AM

Previous topic - Next topic

jerwah

So I have a dialog with 2 multi line edit boxes.  You put values into the left window, press a button, function is run, new values show up in the right window. (Right window is read-only).

Wondering if there is a way to detect scrolling in the left window up/down and move the right window the same amount so that the initial value and the value from the function in the right window stay aligned.


Deana

No way to reference the actual scroll position in x y coordinates. However DialogControlGet option 10 looks interesting. It can return the one based index of the first currently visible item in the list. You could then use DialogControlSet option 10 to specify the one based index of the list item to be scrolled to the top of the control's viewing area.
Deana F.
Technical Support
Wilson WindowWare Inc.

jerwah

Thanks!.. It's a bit clunky but it works. I have the advantage of being 100% certain the two lists will always be the same length so I don't have to deal with that.  Here's a sample I whipped up in case you can think of a way to be more efficient.

#DefineSubroutine InitDialogConstants()
		   ;DialogprocOptions Constants
		   MSG_INIT=0                ; The one-time initialization
		   MSG_TIMER=1               ; Timer event
		   MSG_BUTTONPUSHED=2        ; Pushbutton or Picturebutton
		   MSG_RADIOPUSHED=3         ; Radiobutton clicked
		   MSG_CHECKBOX=4            ; Checkbox clicked
		   MSG_EDITBOX=5             ; Editbox or Multilinebox
		   MSG_FILESELECT=6          ; Filelistbox
		   MSG_ITEMSELECT=7          ; Itembox
		   MSG_COMBOCHANGE=8         ; Combobox/Droplistbox
		   MSG_CALENDAR=9            ; Calendar date change
		   MSG_SPINNER=10            ; Spinner number change
		   MSG_CLOSEVIA49=11         ; Close clicked (Enabled via Intcontrol 49)
		   MSG_FILEBOXDOUBLECLICK=12 ; Get double-click message on a FileListBox
		   MSG_ITEMBOXDOUBLECLICK=13 ; Get double-click message on an ItemBox
		   MSG_COMEVENT=14           ; COMCONTROL Event notification from DialogObject (NOT DialogProcOptions)
		
		   DPO_DISABLESTATE=1000     ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog
		   DPO_CHANGEBACKGROUND=1001 ; -1=Get Current otherise bitmap or color string
		   DPO_CHANGESYSMENU=1002    ; -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max
		   DPO_CHANGETITLE=1003      ; Set/Get Dialog Title - (-1 to get)
		
		   ;DialogControlState Constants
		   DCSTATE_SETFOCUS=1        ; Give Control Focus
		   DCSTATE_QUERYSTYLE=2      ; Query control's style
		   DCSTATE_ADDSTYLE=3        ; Add control style
		   DCSTATE_REMOVESTYLE=4     ; Remove control style
		   DCSTATE_GETFOCUS=5        ; Get control that has focus
		
		   DCSTYLE_INVISIBLE=1       ; Set Control Invisible
		   DCSTYLE_DISABLED=2        ; Set Control Disabled
		   DCSTYLE_NOUSERDATA=4      ; Note: Setable via DialogControlState function ONLY SPINNER control only
		   DCSTYLE_READONLY=8        ; Sets control to read-only (user cannot type in data) EDITBOX MULTILINEBOX SPINNER
		   DCSTYLE_PASSWORD=16       ; Sets 'password mode' where only *'s are displayed EDITBOX
		   DCSTYLE_DEFAULTBUTTON=32  ; Sets a button as the default button PUSHBUTTON PICTUREBUTTON
		   DCSTYLE_DIGITSONLY=64     ; Set edit box to accept digits only EDITMOX MULTILINEBOX
		   DCSTYLE_FLAT=128          ; Makes a 'flat' hyperlink-looking button PUSHBUTTON PICTUREBUTTON
		   DCSTYLE_NOADJUST=256      ; Turns off auto-height adjustment  ITEMBOX FILELISTBOX
		   DCSTYLE_TEXTCENTER=512    ; Center text in control VARYTEXT STATICTEXT
		   DCSTYLE_TEXTRIGHT=1024    ; Flush-Right text in control VARYTEXT STATICTEXT
		   DCSTYLE_NOSELCURLEFT=2048 ; No selection, cursor left EDITBOX MULTILINEBOX
		   DCSTYLE_NOSELCURRIGHT=4096; No selection, cursor right EDITBOX MULTILINEBOX
		
		   ;DialogControlSet / DialogControlGet Constants
		   DC_CHECKBOX=1             ; CHECKBOX
		   DC_RADIOBUTTON=2          ; RADIOBUTTON
		   DC_EDITBOX=3              ; EDITBOX MULTILINEBOX
		   DC_TITLE=4                ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON
		   DC_ITEMBOXCONTENTS=5      ; ITEMBOX FILELISTBOX DROPLISTBOX
		   DC_ITEMBOXSELECT=6        ; ITEMBOX FILELISTBOX DROPLISTBOX
		   DC_CALENDAR=7             ; CALENDAR
		   DC_SPINNER=8              ; SPINNER
		   DC_MULTITABSTOPS=9        ; MULTILINEBOX
		   DC_ITEMSCROLLPOS=10       ; ITEMBOX FILELISTBOX
		   DC_BACKGROUNDCOLOR=11     ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
		   DC_PICTUREBITMAP=12       ; PICTURE PICTUREBUTTON
		   DC_TEXTCOLOR=13           ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FIELLISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
		   DC_ITEMBOXADD=14          ; ITEMBOX FILELISTBOX DROPLISTBOX
		   DC_ITEMBOXREMOVE=15       ; ITEMBOX FILELISTBOX DROPLISTBOX
		
		
		   ;DialogObject constants
		   DLGOBJECT_ADDEVENT=1      ; Call dialog callback when the specified event occurs
		   DLGOBJECT_STOPEVENT=2     ; Stop calling dialog callback when an event previously requested with
		   DLGOBJECT_GETOBJECT=3     ; Return an object references to the specified control
		   DLGOBJECT_GETPICTURE=4    ; Create and return an object reference to a picture object
		
		   ;Return code constants
		   RET_DO_CANCEL=0           ; Cancels dialog
		   RET_DO_DEFAULT= -1        ; Continue with default processing for control
		   RET_DO_NOT_EXIT= -2       ; Do not exit the dialog
		
			;Edit Control Constants
			; WS (General Window Styles constants)
			WS_SIZEBOX       = 262144   ; Use if you want to be able to resize a window with the mouse after it is created
			WS_CAPTION       = 12582912 ; Use if you want the Window to have a Caption (this could be used as a drag handle and/or to display text)
			WS_HSCROLL       = 1048576  ; Use if you want to give the window a Horizontal Scroll Control
			WS_VSCROLL       = 2097152  ; Use if you want to give the window a Vertical Scroll Control
			; ES (Edit Control Style Constants)
			ES_MULTILINE     = 4        ; Defines the Edit Control as having more than one line.
			ES_AUTOVSCROLL   = 64       ; Automatically scrolls the text vertically into view based on the current cursor position
			ES_AUTOHSCROLL   = 128      ; Automatically scrolls the text horizontally into view based on the current cursor position
			ES_READONLY      = 2048     ; Use this style if you don't want people to be able to edit the displayed text (this style can also be toggled later by an explicit Message function)
			ES_WANTRETURN    = 4096     ; Edit control expects a 'Return' or 'Enter' at the end of each line and so it does not treat the return key as an 'OK' signal.
		
		   Return
		#EndSubroutine	
		

#DefineSubroutine Process(dlgCode, eventCode, ctrlNum, resv1, resv2)
				switch( eventCode )
					case MSG_INIT	; Initializing
					   DialogProcOptions(dlgCode, MSG_TIMER       , 500 )    		; Timer - Every 1 second callback
						return (RET_DO_DEFAULT)
					case MSG_TIMER
						POS1 = DialogControlGet(dlgCode, "ItemBox_1", DC_ITEMSCROLLPOS ) 
						DialogControlSet(dlgCode,"ItemBox_2", DC_ITEMSCROLLPOS, POS1 )
						Return (RET_DO_DEFAULT)
				end switch
#EndSubRoutine

InitDialogConstants()
ibVariable1=""
ibVariable2=""

FOR i = 1 to 20
	ibVariable1=ItemInsert( strCat("ITEM#",i),i,ibVariable1,@TAB)
	ibVariable2=ItemInsert( strCat("ANSW#",i),i,ibVariable2,@TAB)
Next i


MyDialogFormat=`WWWDLGED,6.2`

MyDialogCaption=`WIL Dialog 1`
MyDialogX=081
MyDialogY=138
MyDialogWidth=400
MyDialogHeight=139
MyDialogNumControls=004
MyDialogProcedure=`Process`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`109,119,036,012,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,10,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`255,119,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`015,015,136,074,ITEMBOX,"ItemBox_1",ibVariable1,DEFAULT,DEFAULT,30,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog004=`185,015,136,074,ITEMBOX,"ItemBox_2",ibVariable2,DEFAULT,DEFAULT,40,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

ButtonPushed=Dialog("MyDialog")

Deana

Another option is to turn the Callback into #DefineSubroutine. This will make the itembox list variable global. Then use this code for the item box event:

Code  winbatch Select
    
case MSG_ITEMSELECT
        if MyDialog_Name == "ItemBox_1"                    ; ibVariable1
               POS1 = DialogControlGet(MyDialog_Handle, "ItemBox_1", MSG_FILESELECT )
               intPos = itemlocate( POS1, ibvariable1, @tab )
               DialogControlSet(MyDialog_Handle,"ItemBox_2", DC_ITEMSCROLLPOS, intPos )
              return(RET_DO_NOT_EXIT)
Deana F.
Technical Support
Wilson WindowWare Inc.

jerwah

Right I thought of that, but I believe that only works if the user actually picks an item in the list.  If they simply start scrolling, without selecting then that event won't fire.. Unless I misunderstood.

Deana

Quote from: jerwah on November 04, 2013, 08:08:30 AM
Right I thought of that, but I believe that only works if the user actually picks an item in the list.  If they simply start scrolling, without selecting then that event won't fire.. Unless I misunderstood.

You are correct. This method requires the user to select an item to scroll.
Deana F.
Technical Support
Wilson WindowWare Inc.