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.