Determine Control Type - while in the script

Started by galaara98, August 15, 2014, 11:05:40 AM

Previous topic - Next topic

galaara98

I have some code in which during a DialogProcedure I have a section of code that I want to act on several Controls. 

In the list of controls I want to change, there are several different types, and sometimes the process will error because that type of control cannot do what I want.  I have setup an ever growing list of ifs/cases to handle the situation. 

I would like to know if I can Query the Dialog, referencing a control's name (or number if the dialog is legacy) and get back what type of control it is ...
Editbox, PushButton, Picture, Spinner, StaticText, etc.  It is important to me in THIS case that I can distinguish between PUSHBUTTON and PICTUREBUTTON, but I am sure I could use this knowledge under other circumstances also.

Aaron

td

There is no way to obtain a control's type via one of the DialogControl* functions or the DialogProcOptions.   
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

galaara98

:) so the obvious follow up question is....... 
      how do you feel about
          DialogControlGet(Handle,"ControlName",1000) or
          DialogControlState(Handle,"ControlName",7,0)

returning that information

you know.. for fun  :o

Aaron

JTaylor

I recommend a naming convention but would probably find such a feature useful as well.  I know from the Name what type all my control are.  For example an editbox with a variable name of first_name and a dialog variable of Customer would have a "Name" of  eb_Cus_first_name.   I'm sure everyone is tired of me mentioning WBRAD but this creates all the names for me so is very easy.

Jim

galaara98

ok.. that is doable... still wouldn't mind a way to interrogate this information.. but I can search and replace these names fairly easily and safely...

Aaron

kdmoyers

I use the control name trick like JTaylor.
-K
The mind is everything; What you think, you become.

JTaylor

Another of my crazy ideas...guessing you want that info for the same reasons I do...that is to know whether you can perform a certain action on a control.   I wonder if a "compatibility" option would be more useful?  Something like:
Code  winbatch Select
DCSTATE_COMPATIBLE =  7 For x = 1 to DlgNumControls   If DialogControlGet(DlgHandle, DialogProcOptions(DlgHandle,dpo_getname,x,), dcstate_compatible ,dc_textcolor)  Then DialogControlSet(DlgHandle,DialogProcOptions(DlgHandle,dpo_getname,x,),dc_textcolor,"255|0|0") Next


Jim

JTaylor

Wasn't thinking the other day...will this do what you need?

Jim

Code  winbatch Select
    dname = "YOUR DIALOG VARIABLE"     For x = 1 to %dname%NumControls       x = StrFixLeft(x,"0",3)       ctype = ItemExtract(5,%dname%%x%,",")       Message(x,ctype)     Next

JTaylor

On the off-chance someone finds this useful...hopefully I've covered all the bases.  Didn't test every single possibility so let me know if you find a problem.

Jim

Code  winbatch Select
#DefineSubRoutine DC_Compatible(dvar,cnum,const,dfunc)   ;###########################################################   ;dvar = Dialog Variable   ;cnum = Control Number   ;const = Dialog Constant.  List can be obtained from the right-click menu in WinBatch Studio under Code-Blocks.   ;dfunc = "style" or "set" or "get".    ;Leave no spaces in your lists   ;Example:    ;          IsCompat = DC_Compatible("COMPAT_TEST",DialogProcOptions(Dlg_Handle,dpo_getnumber,DCID),dcstyle_invisible,"style")   ;###########################################################   Init_Dialog_Constants()   If !IsDefined(style_list_1) Then GoSub Init_Lists   cnum = StrFixLeft(cnum,"0",3)   ctype = ItemExtract(5,%dvar%%cnum%,",")   IsCompat = 0   If StrLower(dfunc) == "style" Then     If const == DCSTYLE_INVISIBLE Then Return 1     If ItemLocate(ctype,style_list_%const%,",") > 0 Then Return 1   EndIf   If StrLower(dfunc) == "get" || StrLower(dfunc) == "set" Then     If const == DC_POSITION && (ctype == "MENUBAR" || ctype == "MENUITEM") Then Return 0     If const == DC_POSITION Then Return 1     If const == DC_RADIOCONTROL  && StrLower(dfunc) == "set" Then Return 0     If const == DC_MULTITABSTOPS && StrLower(dfunc) == "get" Then Return 0     If ItemLocate(ctype,setget_list_%const%,",") > 0 Then Return 1   EndIf   Return 0   :INIT_LISTS     style_list_1         = "All"     style_list_2         = "PUSHBUTTON,RADIOBUTTON,CHECKBOX,PICTUREBUTTON,EDITBOX,MULTILINEBOX,ITEMBOX,FILELISTBOX,CALENDAR,DROPLISTBOX,REPORTVIEW,SPINNER,GROUPBOX,VARYTEXT,STATICTEXT,MENUITEM"     style_list_4         = ""     style_list_8         = "EDITBOX,MULTILINEBOX,SPINNER"     style_list_16        = "EDITBOX"     style_list_32        = "PUSHBUTTON,PICTUREBUTTON"     style_list_64        = "EDITBOX,MULTILINEBOX"     style_list_128       = "PUSHBUTTON,PICTUREBUTTON"     style_list_256       = ""     style_list_512       = "VARYTEXT,STATICTEXT"     style_list_1024      = "VARYTEXT,STATICTEXT"     style_list_2048      = "EDITBOX,MULTILINEBOX"     style_list_4096      = "EDITBOX,MULTILINEBOX"     style_list_8192      = "PUSHBUTTON,PICTUREBUTTON"     style_list_32768     = "MENUITEM"     style_list_65536     = "MENUITEM"     style_list_131072    = "MENUITEM"     style_list_262144    = "MENUITEM"     style_list_524288    = "REPORTVIEW"     style_list_1048576   = "REPORTVIEW"     style_list_2097152   = "REPORTVIEW"     style_list_4194304   = "REPORTVIEW"     style_list_8388608   = "REPORTVIEW"     style_list_16777216  = "REPORTVIEW"     style_list_33554432  = "REPORTVIEW"     style_list_67108864  = "REPORTVIEW"     style_list_134217728 = "REPORTVIEW"     setget_list_1  = "CHECKBOX,REPORTVIEW"     setget_list_2  = "RADIOBUTTON"     setget_list_3  = "EDITBOX"     setget_list_4  = "PICTURE,RADIOBUTTON,CHECKBOX,PICTUREBUTTON,VARYTEXT,STATICTEXT,GROUPBOX,PUSHBUTTON,MENUITEM"     setget_list_5  = "ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW"     setget_list_6  = "ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW"     setget_list_7  = "CALENDAR"     setget_list_8  = "SPINNER"     setget_list_9  = "MULTILINEBOX"     setget_list_10 = "ITEMBOX,FILELISTBOX,MULTILINEBOX,REPORTVIEW"     setget_list_11 = "RADIOBUTTON,CHECKBOX,VARYTEXT,STATICTEXT,GROUPBOX,PUSHBUTTON,ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW,SPINNER,EDITBOX,MULTILINEBOX"     setget_list_12 = "PICTURE,PICTUREBUTTON"     setget_list_13 = "RADIOBUTTON,CHECKBOX,VARYTEXT,STATICTEXT,GROUPBOX,PUSHBUTTON,ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW,SPINNER,EDITBOX,MULTILINEBOX"     setget_list_14 = "ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW"     setget_list_15 = "ITEMBOX,FILELISTBOX,DROPLISTBOX,REPORTVIEW"     setget_list_16 = "RADIOBUTTON"   ; Valid for DialogControlGet only.     setget_list_17 = "ALL CONTROLS"  ; (Except MENUBAR and MENUITEM)"     setget_list_20 = "REPORTVIEW"     setget_list_21 = "REPORTVIEW"     setget_list_22 = "REPORTVIEW"     setget_list_23 = "REPORTVIEW"     setget_list_25 = "REPORTVIEW"     setget_list_27 = "REPORTVIEW"         Return          #EndSubRoutine #DefineSubRoutine Init_Dialog_Constants()    MSG_INIT               = 0    ; The one-time initilization    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   ; Get double-click message on an ItemBox    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 item text    MSG_RVHEADER           = 22   ; Reportview header clicked    DPO_DISABLESTATE       = 1000 ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog    DPO_CHANGEBACKGROUND   = 1001 ; -1=GetSetting 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 ; -1=Get Current otherise new title    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 the number associated with a control's name.    ;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_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 a 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_HEIGHT         = 256    ; Turns off automatic height adjustment on ItemBoxes and FileListBoxes    DCSTYLE_CENTER         = 512    ; Center Text in VARYTEXT and STATICTEXT Controls    DCSTYLE_RIGHT          = 1024   ; Right Justify Text in VARYTEXT and STATICTEXT Controls    DCSTYLE_NOSELCURLEFT   = 2048   ; No selection, cursor left EDITBOX MULTILINEBOX    DCSTYLE_NOSELCURRIGHT  = 4096   ; No selection, cursor right 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 ; Causes a separator bar graphic to display instead of text at the menu item's location in the menu MENUITEM    DCSTYLE_MENUBREAK      = 262144 ; Cause a column break to occur at the specific item when used with drop-down, context, or submenus.  Causes a line break (new row) with menu items hosted directly by the MENUBAR MENUITEM    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    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    DC_RADIOCONTROL        = 16   ; RADIOBUTTON    DC_POSITION            = 17   ; RADIOBUTTON    DC_MENUNAMES           = 18   ; ALL CONTROLS    DC_HANDLE              = 19   ; ALL CONTROLS (Except MENUBAR and MENUITEM)    DC_RVCOLHEAD           = 20   ; REPORTVIEW    DC_RVCOLWIDTH          = 21   ; REPORTVIEW    DC_RVCOLMATCH          = 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_REMOVEEVENT  = 2    ; Stop calling dialog callback when an event previously requested with     DLGOBJECT_GETOBJECT    = 3    ; Return an object references to the specified control    DLGOBJECT_GETPICOBJECT = 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 #EndSubRoutine    

galaara98

Ingenious :) ... though I didn't take your exact code.. you DID solve my problem! 
By reminding me that there is data that correlates the Dialog Control's name to its Type.. and that is the Dialog Defining variables themselves.  So long as I know the relationship between the Dialog "handle" in the UDF custom handler and the Dialog variable prefix, I can determine any controls type...(at a cost of a lot of string processing)

of course there is a good habit that could speed up the concept: name your Controls with text that indicates it's type,
however with your ideas I can deduce the control's type regardless of naming.

Aaron