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
; 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
I recommend moving this chunk of code inside the MSG_INIT, so that it only gets executed with the dialog first loads.
; 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
Good catch Deana ... I was cutting and pasting while on the phone and creating the example, I'll correct it.
It works!
Thanks RichardH
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
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...
#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
It's nice to have clear comments on what the code suppose to do. The UDF function seems more convenient to use.
Thanks RichardH
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
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
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!