WinBatch® Technical Support Forum

All Things WinBatch => WinBatch => Topic started by: richardh on June 02, 2014, 10:44:14 AM

Title: ReportView Help & Example
Post by: richardh on June 02, 2014, 10:44:14 AM
I spent a bit of time figuring out how to handle ReportView yesterday, so I thought I'd share this for anyone else that may need a little help understanding how DialogControlSet works and setting column widths and justifying data in a report...  I included it in the help instead of the script exchange because it is meant to help.

Enjoy, Richard


Code (winbatch) Select
; Pass Array with udf dialog call! ; assumes at least 2 dimensions row [0] being headers | row 1,2,3, etc.. containing data

udfDialogTesting(Your_Array)


#DefineSubRoutine MyDialogCallbackProc(MyDialog_Handle,MyDialog_Message,MyDialog_Name,MyDialog_EventInfo,MyDialog_ChangeInfo)
udf_InitDialogConstants()
   ON_EQUAL = @TRUE                                         ; Initialize variable ON_EQUAL
   switch MyDialog_Message                                  ; Switch based on Dialog Message type
      case MSG_INIT
          ; Set report column width to header or data width, whichever is larger
          y = ArrInfo(Your_Array, 2)
          DlgCtrlParmWidth = ''
          DlgCtrlParmJustify = ''
          For x = 1 To y
            v1 = '-1' ; Set default to '-1' = data width | '-2' = header width
            v2 = 0 ; Set default to 0 = left justify | 1 = center | 2 = right justify)
            i1 = Your_Array[0,x-1] ; get header row values
            i2 = Your_Array[1,x-1] ; ; get data row values
            l1 = strlen(i1) ; char length of header value
            l2 = strlen(i2) ; char length of data value
            if l1 > l2 
              v1 = '-2'
              v2 = 1 ; header is wider than data value so set width to header and center data value
           endif
           DlgCtrlParmWidth = ItemInsert(v1, -1, DlgCtrlParmWidth, " ")
           DlgCtrlParmJustify = ItemInsert(v2, -1, DlgCtrlParmJustify, " ")
         next

;         DialogProcOptions(MyDialog_Handle,MSG_TIMER,1000)
;         DialogProcOptions(MyDialog_Handle,MSG_BUTTONPUSHED,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_RVITEMSELROW,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_RVDBLCLICKROW,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_RVCHECKEDITEM,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_RVITEMTEXT,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_RVHEADER,@TRUE)
         DialogControlSet( MyDialog_Handle, "ReportView_1", DC_RVCOLWIDTH, DlgCtrlParmWidth) ; DC_RVCOLWIDTH = 21
         DialogControlSet( MyDialog_Handle, "ReportView_1", DC_RVJUSTIFY, DlgCtrlParmJustify) ; DC_RVCOLWIDTH = 27

         return(RET_DO_DEFAULT)

;     case MSG_BUTTONPUSHED                                 ; ID "PushButton_Close"  Close
;        return(RET_DO_DEFAULT)

;     case MSG_RVITEMSELROW                                 ; ID "ReportView_1"  Your_Array
;        return(RET_DO_DEFAULT)
   endswitch                                                ; MyDialog_Message
   return(RET_DO_DEFAULT)
Drop(x,y,v1,v2,l1,l1,DlgCtrlParmWidth,DlgCtrlParmJustify)
#EndSubRoutine                                                ; End of Dialog Callback MyDialogCallbackProc


#DefineFunction udfDialogTesting(Your_Array)
MyDialogFormat=`WWWDLGED,6.2`
MyDialogCaption=`WIL Dialog 2`
MyDialogX=002
MyDialogY=059
MyDialogWidth=594
MyDialogHeight=119
MyDialogNumControls=002
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,154|203|252`
MyDialogConfig=0
MyDialog001=`551,099,026,012,PUSHBUTTON,"PushButton_Close",DEFAULT,"Close",1,10,160,DEFAULT,DEFAULT,"255|255|255"`
MyDialog002=`013,013,564,082,REPORTVIEW,"ReportView_1",Your_Array,DEFAULT,DEFAULT,20,3145728,"Microsoft Sans Serif|5632|40|34",DEFAULT,"255|255|255"`
ButtonPushed=Dialog("MyDialog")
#EndFunction

#DefineSubRoutine udf_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 DialogProcOptions 1002
   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)
   MSG_MENUITEM=15               ; MenuItem selected
   MSG_MENUITEMINIT=16           ; MenuItem initialized
   MSG_RESIZE=17                 ; Dialog resized
   MSG_RVITEMSELROW=18           ; Reportview item select row
   MSG_RVDBLCLICKROW=19          ; Reportview double-click row
   MSG_RVCHECKEDITEM=20          ; Reportview checked/unchecked Item
   MSG_RVITEMTEXT=21             ; Reportview changed text of first column
   MSG_RVHEADER=22               ; Reportview header clicked

   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)
   DPO_GETNAME=1004              ; Returns the name associated with a control's number.
   DPO_GETNUMBER=1005            ; Returns the number associated with a control's name.
   DPO_GETCLIENTAREA=1007        ; Returns a space delimited list of the width and height of the client area.

   ;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
   DCSTATE_MOVEMOUSEOVER=6       ; Move the mouse over the control

   DCSTYLE_DEFAULT=0             ; Set Default Style
   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
   DCSTYLE_SHIELD=8192           ; Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON
   DCSTYLE_MENUCHECK=32768       ; Adds a check mark to the left of a menu item MENUITEM
   DCSTYLE_MENURADIO=65536       ; Adds a radio button like dot graphic to the left of a menu item MENUITEM
   DCSTYLE_MENUSEP=131072        ; Separator bar graphic MENUITEM
   DCSTYLE_MENUBREAK=262144      ; Column break MENUBAR
   DCSTYLE_NOHEADER=524288       ; No header bar REPORTVIEW
   DCSTYLE_COLHEADER=1048576     ; First row column header REPORTVIEW
   DCSTYLE_GRIDLINES=2097152     ; Grid lines REPORTVIEW
   DCSTYLE_SELONEROW=4194304     ; Only one row can be selected at a time REPORTVIEW
   DCSTYLE_SELALLROW = 8388608   ; Highlight complete row REPORTVIEW
   DCSTYLE_SORTASC=16777216      ; Ascending sort REPORTVIEW
   DCSTYLE_SORTDESC=33554432     ; Descending sort REPORTVIEW
   DCSTYLE_EDITCOL=67108864      ; Edit first columns text REPORTVIEW
   DCSTYLE_COLCHECKBOX=134217728 ; Add checkbox to first column REPORTVIEW
   DCSTYLE_INSHEADER=268435456   ; Include column header text REPORTVIEW

   ;DialogControlSet / DialogControlGet Constants
   DC_CHECKBOX=1             ; CHECKBOX REPORTVIEW
   DC_RADIOBUTTON=2          ; RADIOBUTTON
   DC_EDITBOX=3              ; EDITBOX MULTILINEBOX
   DC_TITLE=4                ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM
   DC_ITEMBOXCONTENTS=5      ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_ITEMBOXSELECT=6        ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   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 REPORTVIEW
   DC_PICTUREBITMAP=12       ; PICTURE PICTUREBUTTON
   DC_TEXTCOLOR=13           ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX REPORTVIEW
   DC_ITEMBOXADD=14          ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_ITEMBOXREMOVE=15       ; ITEMBOX FILELISTBOX DROPLISTBOX REPORTVIEW
   DC_RADIOVALUE=16          ; RADIOBUTTON
   DC_POSITION=17            ; ALL CONTROLS (Except MENUBAR and MENUITEM)
   DC_MENUNAMES=18           ; ALL CONTROLS
   DC_HANDLE=19              ; ALL CONTROLS (Except MENUBAR and MENUITEM)
   DC_RVCOLHEAD=20           ; REPORTVIEW
   DC_RVCOLWIDTH=21          ; REPORTVIEW
   DC_RVADDCOL=22            ; REPORTVIEW
   DC_RVREMOVECOL=23         ; REPORTVIEW
   DC_RVMATCHCOL=24          ; REPORTVIEW
   DC_RVCANCELEDIT=25        ; REPORTVIEW
   DC_RVCHECKEDROWS=26       ; REPORTVIEW
   DC_RVJUSTIFY=27           ; REPORTVIEW


   ;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
   return
#EndSubroutine
Title: Re: ReportView Help & Example
Post by: Deana on June 02, 2014, 10:55:46 AM
I recommend moving this chunk of code inside the MSG_INIT, so that it only gets executed with the dialog first loads.
Code (winbatch) Select

            ; Set report column width to header or data width, whichever is larger
            DlgCtrlParmWidth = ''
            DlgCtrlParmJustify = ''
            y = ArrInfo(Your_Array, 2)
            For x = 1 To y
                v1 = '-1' ; Set default to '-1' = data width | '-2' = header width
                v2 = 0 ; Set default to 0 = left justify | 1 = center | 2 = right justify)
                i1 = Your_Array[0,x-1] ; get header row values
                i2 = Your_Array[1,x-1] ; ; get data row values
                l1 = strlen(i1) ; char length of header value
                l2 = strlen(i2) ; char length of data value
                if l1 > l2 
                 v1 = '-2'
                 v2 = 1 ; header is wider than data value so set width to header and center data value
                endif
                DlgCtrlParmWidth = ItemInsert(v1, -1, DlgCtrlParmWidth, " ")
                DlgCtrlParmJustify = ItemInsert(v2, -1, DlgCtrlParmJustify, " ")
            next
Title: Re: ReportView Help & Example
Post by: richardh on June 02, 2014, 11:21:18 AM
Good catch Deana ... I was cutting and pasting while on the phone and creating the example, I'll correct it.



Title: Re: ReportView Help & Example
Post by: lionking on June 02, 2014, 02:12:31 PM
It works!
Thanks RichardH
Title: Re: ReportView Help & Example
Post by: richardh on June 02, 2014, 02:23:06 PM
Glad it helped out...

I'm also going to auto size the dialog to the size of array to a max of 50 or 60% of screen height dialog units.

Real world example... you don't want a huge dialog if the array only contains 1 or 2 rows but in my case the array may contain 1 to several hundred rows of data.

I'll post an example of code when I'm done if anyone is interested.

Richard
Title: Size Dialog to ReportView Control Example
Post by: richardh on June 02, 2014, 02:58:33 PM
Only added function since other relevant code is above.

I tried to make variable names descriptive.... I'm generally pretty cryptic with my own variable names.

Enjoy...

Code (winbatch) Select
#DefineFunction udf_ViewReport(Your_Arr)
; dialog sizing code
MaxScrnWidth = WinMetrics(0)/WinMetrics(-6) * .75  ; *.75 to set to  3/4 of screen width in dialog units
MaxScrnHeight = WinMetrics(1)/WinMetrics(-5) * .75 ; * .75 to set to 3/4 of screen height in dialog units

row_depth = 7 ; row depth ; set this to the font size used in reportview control ; you may have to tweak it a point or 2
MaxScrnHeight = int(MaxScrnHeight) ; In case I end up with decimals

y = ArrInfo(Your_Arr,1) ; count rows in array

if y * row_depth > MaxScrnHeight then row_depth = MaxScrnHeight ; rows exceed screen display so set to max height from above
else row_depth=(row_depth*y)+15 ; add 15 for scroll bar at bottom

row_depth = StrFixLeft(row_depth,0,3) ; pad value for control
dialog_height = row_depth+40 ; + 40 to add padding for dialog around reportview control
button_depth = row_depth+20 ; + 20 to place button below reportview control

MyDialogFormat=`WWWDLGED,6.2`
MyDialogCaption=`Processing Report`
MyDialogX=-1
MyDialogY=-1
MyDialogWidth= 700
MyDialogHeight= dialog_height ; set to row * size up to the max allowed by MaxScrnHeight
MyDialogNumControls=002
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,154|203|252`
MyDialogConfig=0
MyDialog001=`013,015,665,%row_depth%,REPORTVIEW,"ReportView_1",Your_Arr,DEFAULT,DEFAULT,20,3145728,"Microsoft Sans Serif|5632|40|34",DEFAULT,"255|255|255"` ; Use variable in control coordinates
MyDialog002=`652,%button_depth%,026,012,PUSHBUTTON,"PushButton_Close",DEFAULT,"Close",1,10,160,DEFAULT,DEFAULT,"255|255|255"` ; Use variable in control coordinates
ButtonPushed=Dialog("MyDialog")
#EndFunction
Title: Re: ReportView Help & Example
Post by: lionking on June 02, 2014, 11:53:59 PM
It's nice to have clear comments on what the code suppose to do. The UDF function seems more convenient to use.

Thanks RichardH
Title: Re: ReportView Help & Example
Post by: Deana on June 03, 2014, 07:52:33 AM
RichardH,

Thanks again for sharing your code samples! They have been placed in the tech database for the next user.

http://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/tsleft.web+WinBatch/Dialog~Editor/Dialog~Editor~version~6.2+Reportview~Set~Column~Width.txt

http://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/tsleft.web+WinBatch/Dialog~Editor/Dialog~Editor~version~6.2+ReportView~Size~Based~on~Row~Count.txt
Title: Re: ReportView Help & Example
Post by: richardh on June 03, 2014, 09:16:57 AM
Deana,

Glad I could contribute, I've been using WinBatch and the TS forum since the mid 90's and support has always been awesome when I need help.
Great product and great people  :)

Richard
Title: Re: ReportView Help & Example
Post by: Deana on June 03, 2014, 09:22:38 AM
Quote from: richardh on June 03, 2014, 09:16:57 AM
Deana,

Glad I could contribute, I've been using WinBatch and the TS forum since the mid 90's and support has always been awesome when I need help.
Great product and great people  :)

Richard

Thanks Richard, that is nice to hear. We are grateful to have such a long-term committed user of WinBatch!