Pre-selecting multiple values in a multiselect list
Moderators: Dorian (MJT support), JRL
Pre-selecting multiple values in a multiselect list
I have a multiselect list in a dialog that I want to preselect different values depending on what a user selects in a previous dialog. If I make the list not multiselect, then I can pre-select a single value based on the procedure using the itemindex statement mentioned in the manual. Once I make the list multiselect, however, I can no longer pre-select even a single value. This makes me think that my code is okay, except that I am not correctly stating how to pre-select from a multiselect list box. Thanks for any help that anyone may be able to offer on how to preselect mutliple values in a multiselect list.
Wow... not a typical "Beginners" question.
I went searching and found a library function. Hope this makes sense:
I went searching and found a library function. Hope this makes sense:
Code: Select all
Dialog>Dialog1
Caption=Multiselect Test
Width=215
Height=356
Top=100
Left=CENTER
ListBox=msListBox1,44,27,121,238,item1%CRLF%item2%CRLF%item3%CRLF%item4%CRLF%item5%CRLF%item6%CRLF%item7%CRLF%item8%CRLF%item9%CRLF%item10%CRLF%item11%CRLF%item12%CRLF%item13%CRLF%item14,true
Button=OK,70,283,75,25,3
EndDialog>Dialog1
show>dialog1
Let>LB_SETSEL=389
//Run the following for each pre-chosen 0 based item selection
//The last number is the one to change 0 = the first item,
//3 = the fourth item, 5 = the sixth item, etc.
LibFunc>user32,SendMessageA,SMres,dialog1.msListBox1.handle,LB_SETSEL,1,0
LibFunc>user32,SendMessageA,SMres,dialog1.msListBox1.handle,LB_SETSEL,1,3
LibFunc>user32,SendMessageA,SMres,dialog1.msListBox1.handle,LB_SETSEL,1,5
LibFunc>user32,SendMessageA,SMres,dialog1.msListBox1.handle,LB_SETSEL,1,11
LibFunc>user32,SendMessageA,SMres,dialog1.msListBox1.handle,LB_SETSEL,1,12
Label>Loop
GetDialogAction>dialog1,res1
If>res1=2
Exit>0
EndIf
If>res1=3
GoSub>Process
EndIf
Wait>0.01
Goto>Loop
SRT>Process
MDL>dialog1.msListBox1
ResetDialogAction>Dialog1
END>Process
Is this right?
JRL,
Thanks for the help. I am afraid that I was not able to follow all that you wrote. I tried taking a snippet of it and applying it to my specific case. I have a dialog (Picker) and a multiselect list (lab). I tried inserting this:
Let>LB_SETSEL=389
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,0
But it did not seem to have an effect. I have xp pro x64, so I tried substituting 64 for 32 under the user32 part of the statement, but to no avail. I appreciate your help and your quick response to my earlier post.
Thanks,
---Josh
Thanks for the help. I am afraid that I was not able to follow all that you wrote. I tried taking a snippet of it and applying it to my specific case. I have a dialog (Picker) and a multiselect list (lab). I tried inserting this:
Let>LB_SETSEL=389
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,0
But it did not seem to have an effect. I have xp pro x64, so I tried substituting 64 for 32 under the user32 part of the statement, but to no avail. I appreciate your help and your quick response to my earlier post.
Thanks,
---Josh
Need to load library
Hi,
I think Dick forgot to include the LibLoad and LibFree commands which he probably executes elsewhere.
I am assuming user32 is not automatically loaded, I don't see any documentation saying it is but I see lots of LibFunc code examples without the LibLoad/LibFree commands shown.
If my suggestion does not work, double-check your syntax, you made all the corresponding name changes, no embedded or trailing spaces exist, all of the % are there.
Gale
I think Dick forgot to include the LibLoad and LibFree commands which he probably executes elsewhere.
Code: Select all
//Load the library before doing and LibFuncs
LibLoad>user32,handle
//Do your LibFuncs
//Unload the library when done
LibFree>handle
I am assuming user32 is not automatically loaded, I don't see any documentation saying it is but I see lots of LibFunc code examples without the LibLoad/LibFree commands shown.
If my suggestion does not work, double-check your syntax, you made all the corresponding name changes, no embedded or trailing spaces exist, all of the % are there.
Gale
Thanks for the help. Unfortunately, it is still not working. Using that method, I could pre-select if I made the listbox single selection, but it still did not provide a result if I made it multiselect. Here is the flawed code that I have:
Month>the_month
Day>the_day
Year>the_year
Hour>the_hour
Min>the_min
' Set the variables that are the same for all
Let>mytimetxt=%the_month%/%the_day%/%the_year% %the_hour%%the_min%
'Define the Picker dialog
Dialog>Picker
Caption=Select the items for a brief RME note
Width=800
Height=600
Top=106
Left=16
Edit=mytime,72,24,121,mytimetxt
ListBox=multistatement,8,64,225,87,Vital signs reviewed%CRLF%Patient examined%CRLF%No acute distress%CRLF%Minimal immediate risk of catastrophe%CRLF%Patient informed of RME process%CRLF%Patient will notify if condition change,true
Memo=HPI,8,184,226,177,
ListBox=EKG,112,376,121,76,Normal Sinus Rhythm%CRLF%Sinus tach%CRLF%Sinus brady%CRLF%Atrial fibrillation%CRLF%No STEMI,true
ListBox=lab,256,48,118,191,ABG%CRLF%CBC%CRLF%Chem 7%CRLF%Magnesium%CRLF%lipase%CRLF%LFTs%CRLF%PT/PTT%CRLF%AMI panel%CRLF%BNP%CRLF%D-dimer%CRLF%beta-HCG%CRLF%blood cultures%CRLF%UA%CRLF%urine cultures,true
ListBox=imaging,256,272,116,184,Xray chest%CRLF%Xray for fracture%CRLF%Xray foreign body%CRLF%CT head%CRLF%CT abd/pelvis%CRLF%CT PE%CRLF%CT aorta%CRLF%MRI head%CRLF%MRI back%CRLF%Ultrasound abdomen%CRLF%Ultrasound appendix%CRLF%Ultrasound pelvis%CRLF%Ultrasound DVT,true
ListBox=RMEmeds,400,48,121,97,RMEmedtxt,true
ListBox=meds,400,184,121,157,medstxt,true
Label=Contact time,8,24,true
ListBox=diffdx,536,56,121,189,diffdxtxt,true
Label=General,8,48,true
RadioGroup=radiodispo,Area to be roomed,544,248,107,57,ED 1%CRLF%ED 2%CRLF%ED 3,-1
RadioGroup=radiocourse,Likely ED course,536,320,185,94,coursetxt,-1
Button=&Preview Note,544,424,75,25,2
Button=&Cancel,624,424,75,25,3
Label=Labs ordered,256,32,true
ListBox=nursing,400,360,121,97,IV%CRLF%supplemental oxygen%CRLF%cardiac monitor%CRLF%pulse oxymetry%CRLF%EKG%CRLF%breathing treatment%CRLF%LET to wound,true
Label=Nursing orders,408,344,true
Label=Imaging,256,256,true
Label=Brief HPI,8,168,true
Label=Meds to be given in RME,392,32,true
Label=Meds when roomed,400,160,true
Label=Most likely diagnoses,544,32,true
Label=Brief EKG review:,16,376,true
EndDialog>Picker
' Close the template dialog
CloseDialog>template
//Load the library before doing and LibFuncs
LibLoad>user32,handle
//determine which values to preselect and which lists to generate based
//on previous dialog (template) and field (complaint)
if>template.complaint=general
Let>LB_SETSEL=389
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,1
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,3
Let>RMEmedtxt=Vicodin%CRLF%Zofran ODT%CRLF%Aspirin 162mg PO x1%CRLF%LET to wound%CRLF%EMLA for IV/LP%CRLF%Tetanus%CRLF%Azithromycin 500mg po
Let>medstxt=NS 500mL IV%CRLF%NS 1L IV%CRLF%NS 2L IV%CRLF%NS 20ml/KG IV x 2%CRLF%Morphine 4mg IV%CRLF%Dilaudid 1mg IV%CRLF%Zofran 4mg IV%CRLF%Reglan 10mg IV%CRLF%Ceftriaxone 1g IV
Let>diffdxtxt=[enter likely diagnosis on preview page]
Let>coursetxt=Admit after workup%CRLF%Admit now%CRLF%Discharge after workup%CRLF%Discharge after workup/pain control
endif
'Show the Picker dialog
Show>Picker,p
//Unload the library when done
LibFree>handle
Month>the_month
Day>the_day
Year>the_year
Hour>the_hour
Min>the_min
' Set the variables that are the same for all
Let>mytimetxt=%the_month%/%the_day%/%the_year% %the_hour%%the_min%
'Define the Picker dialog
Dialog>Picker
Caption=Select the items for a brief RME note
Width=800
Height=600
Top=106
Left=16
Edit=mytime,72,24,121,mytimetxt
ListBox=multistatement,8,64,225,87,Vital signs reviewed%CRLF%Patient examined%CRLF%No acute distress%CRLF%Minimal immediate risk of catastrophe%CRLF%Patient informed of RME process%CRLF%Patient will notify if condition change,true
Memo=HPI,8,184,226,177,
ListBox=EKG,112,376,121,76,Normal Sinus Rhythm%CRLF%Sinus tach%CRLF%Sinus brady%CRLF%Atrial fibrillation%CRLF%No STEMI,true
ListBox=lab,256,48,118,191,ABG%CRLF%CBC%CRLF%Chem 7%CRLF%Magnesium%CRLF%lipase%CRLF%LFTs%CRLF%PT/PTT%CRLF%AMI panel%CRLF%BNP%CRLF%D-dimer%CRLF%beta-HCG%CRLF%blood cultures%CRLF%UA%CRLF%urine cultures,true
ListBox=imaging,256,272,116,184,Xray chest%CRLF%Xray for fracture%CRLF%Xray foreign body%CRLF%CT head%CRLF%CT abd/pelvis%CRLF%CT PE%CRLF%CT aorta%CRLF%MRI head%CRLF%MRI back%CRLF%Ultrasound abdomen%CRLF%Ultrasound appendix%CRLF%Ultrasound pelvis%CRLF%Ultrasound DVT,true
ListBox=RMEmeds,400,48,121,97,RMEmedtxt,true
ListBox=meds,400,184,121,157,medstxt,true
Label=Contact time,8,24,true
ListBox=diffdx,536,56,121,189,diffdxtxt,true
Label=General,8,48,true
RadioGroup=radiodispo,Area to be roomed,544,248,107,57,ED 1%CRLF%ED 2%CRLF%ED 3,-1
RadioGroup=radiocourse,Likely ED course,536,320,185,94,coursetxt,-1
Button=&Preview Note,544,424,75,25,2
Button=&Cancel,624,424,75,25,3
Label=Labs ordered,256,32,true
ListBox=nursing,400,360,121,97,IV%CRLF%supplemental oxygen%CRLF%cardiac monitor%CRLF%pulse oxymetry%CRLF%EKG%CRLF%breathing treatment%CRLF%LET to wound,true
Label=Nursing orders,408,344,true
Label=Imaging,256,256,true
Label=Brief HPI,8,168,true
Label=Meds to be given in RME,392,32,true
Label=Meds when roomed,400,160,true
Label=Most likely diagnoses,544,32,true
Label=Brief EKG review:,16,376,true
EndDialog>Picker
' Close the template dialog
CloseDialog>template
//Load the library before doing and LibFuncs
LibLoad>user32,handle
//determine which values to preselect and which lists to generate based
//on previous dialog (template) and field (complaint)
if>template.complaint=general
Let>LB_SETSEL=389
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,1
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,3
Let>RMEmedtxt=Vicodin%CRLF%Zofran ODT%CRLF%Aspirin 162mg PO x1%CRLF%LET to wound%CRLF%EMLA for IV/LP%CRLF%Tetanus%CRLF%Azithromycin 500mg po
Let>medstxt=NS 500mL IV%CRLF%NS 1L IV%CRLF%NS 2L IV%CRLF%NS 20ml/KG IV x 2%CRLF%Morphine 4mg IV%CRLF%Dilaudid 1mg IV%CRLF%Zofran 4mg IV%CRLF%Reglan 10mg IV%CRLF%Ceftriaxone 1g IV
Let>diffdxtxt=[enter likely diagnosis on preview page]
Let>coursetxt=Admit after workup%CRLF%Admit now%CRLF%Discharge after workup%CRLF%Discharge after workup/pain control
endif
'Show the Picker dialog
Show>Picker,p
//Unload the library when done
LibFree>handle
Josh,
There's a couple of related items.
1) The libfunc calls have to occur while the dialog is open.
2) That means you have to use a non-modal dialog rather than what you have which is a modal dialog.
A modal dialog stops the script until the user makes a selection, a non-modal dialog allows the script to continue running and performing actions while the user makes or doesn't make selections. The primary difference in the creation of a modal dialog or a non-modal dialog is whether or not the dialog result variable is placed on the Show>dialog line. See "dialog" help for more information.
I've rewritten your snippet. The changes I made are:
- moved the Show>Picker line to be ahead of the libfunc>
- removed the "p" variable from the Show>Picker line.
- added the "ActionLoop" to handle the non-modal dialog results.
- also remarked out the if>template.complaint=general test line just because it was easier than making the statement resolve to true. Be sure to unremark that line and the associated "Endif" line when you put this back into you main script.
Gale,
I've never used anything but the libfunc on any of the standard windows library files. I think any dll that would show up when you run "tasklist /m" is already loaded. In any case, LibLoad and Libfree don't seem to hurt anything but I'm certain they're not necessary for user32, kernel32 or GDI32. Those are about the only ones I ever use. No... I also use Marcus' GetClient.dll successfully without a libload. Makes me wonder what circumstance actually requires libload/libfree.
There's a couple of related items.
1) The libfunc calls have to occur while the dialog is open.
2) That means you have to use a non-modal dialog rather than what you have which is a modal dialog.
A modal dialog stops the script until the user makes a selection, a non-modal dialog allows the script to continue running and performing actions while the user makes or doesn't make selections. The primary difference in the creation of a modal dialog or a non-modal dialog is whether or not the dialog result variable is placed on the Show>dialog line. See "dialog" help for more information.
I've rewritten your snippet. The changes I made are:
- moved the Show>Picker line to be ahead of the libfunc>
- removed the "p" variable from the Show>Picker line.
- added the "ActionLoop" to handle the non-modal dialog results.
- also remarked out the if>template.complaint=general test line just because it was easier than making the statement resolve to true. Be sure to unremark that line and the associated "Endif" line when you put this back into you main script.
Gale,
I've never used anything but the libfunc on any of the standard windows library files. I think any dll that would show up when you run "tasklist /m" is already loaded. In any case, LibLoad and Libfree don't seem to hurt anything but I'm certain they're not necessary for user32, kernel32 or GDI32. Those are about the only ones I ever use. No... I also use Marcus' GetClient.dll successfully without a libload. Makes me wonder what circumstance actually requires libload/libfree.
Code: Select all
Month>the_month
Day>the_day
Year>the_year
Hour>the_hour
Min>the_min
' Set the variables that are the same for all
Let>mytimetxt=%the_month%/%the_day%/%the_year% %the_hour%%the_min%
'Define the Picker dialog
Dialog>Picker
Caption=Select the items for a brief RME note
Width=800
Height=600
Top=106
Left=16
Edit=mytime,72,24,121,mytimetxt
ListBox=multistatement,8,64,225,87,Vital signs reviewed%CRLF%Patient examined%CRLF%No acute distress%CRLF%Minimal immediate risk of catastrophe%CRLF%Patient informed of RME process%CRLF%Patient will notify if condition change,true
Memo=HPI,8,184,226,177,
ListBox=EKG,112,376,121,76,Normal Sinus Rhythm%CRLF%Sinus tach%CRLF%Sinus brady%CRLF%Atrial fibrillation%CRLF%No STEMI,true
ListBox=lab,256,48,118,191,ABG%CRLF%CBC%CRLF%Chem 7%CRLF%Magnesium%CRLF%lipase%CRLF%LFTs%CRLF%PT/PTT%CRLF%AMI panel%CRLF%BNP%CRLF%D-dimer%CRLF%beta-HCG%CRLF%blood cultures%CRLF%UA%CRLF%urine cultures,true
ListBox=imaging,256,272,116,184,Xray chest%CRLF%Xray for fracture%CRLF%Xray foreign body%CRLF%CT head%CRLF%CT abd/pelvis%CRLF%CT PE%CRLF%CT aorta%CRLF%MRI head%CRLF%MRI back%CRLF%Ultrasound abdomen%CRLF%Ultrasound appendix%CRLF%Ultrasound pelvis%CRLF%Ultrasound DVT,true
ListBox=RMEmeds,400,48,121,97,RMEmedtxt,true
ListBox=meds,400,184,121,157,medstxt,true
Label=Contact time,8,24,true
ListBox=diffdx,536,56,121,189,diffdxtxt,true
Label=General,8,48,true
RadioGroup=radiodispo,Area to be roomed,544,248,107,57,ED 1%CRLF%ED 2%CRLF%ED 3,-1
RadioGroup=radiocourse,Likely ED course,536,320,185,94,coursetxt,-1
Button=&Preview Note,544,424,75,25,2
Button=&Cancel,624,424,75,25,3
Label=Labs ordered,256,32,true
ListBox=nursing,400,360,121,97,IV%CRLF%supplemental oxygen%CRLF%cardiac monitor%CRLF%pulse oxymetry%CRLF%EKG%CRLF%breathing treatment%CRLF%LET to wound,true
Label=Nursing orders,408,344,true
Label=Imaging,256,256,true
Label=Brief HPI,8,168,true
Label=Meds to be given in RME,392,32,true
Label=Meds when roomed,400,160,true
Label=Most likely diagnoses,544,32,true
Label=Brief EKG review:,16,376,true
EndDialog>Picker
' Close the template dialog
CloseDialog>template
//Load the library before doing and LibFuncs
LibLoad>user32,handle
'Show the Picker dialog
Show>Picker
//determine which values to preselect and which lists to generate based
//on previous dialog (template) and field (complaint)
//if>template.complaint=general
Let>LB_SETSEL=389
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,1
LibFunc>user32,SendMessageA,SMres,Picker.lab.handle,LB_SETSEL,1,3
Let>RMEmedtxt=Vicodin%CRLF%Zofran ODT%CRLF%Aspirin 162mg PO x1%CRLF%LET to wound%CRLF%EMLA for IV/LP%CRLF%Tetanus%CRLF%Azithromycin 500mg po
Let>medstxt=NS 500mL IV%CRLF%NS 1L IV%CRLF%NS 2L IV%CRLF%NS 20ml/KG IV x 2%CRLF%Morphine 4mg IV%CRLF%Dilaudid 1mg IV%CRLF%Zofran 4mg IV%CRLF%Reglan 10mg IV%CRLF%Ceftriaxone 1g IV
Let>diffdxtxt=[enter likely diagnosis on preview page]
Let>coursetxt=Admit after workup%CRLF%Admit now%CRLF%Discharge after workup%CRLF%Discharge after workup/pain control
//endif
Label>ActionLoop
GetDialogAction>Picker,p
If>p=2
Exit>0
EndIf
If>p<>0,Continue
Goto>ActionLoop
Label>Continue
ResetDialogAction>Picker
//Unload the library when done
LibFree>handle
When libload/libfree are needed.
JRL wrote
So they are not needed in Josh's script since he is not using the handle. Sorry about the false suggestion.
Gale
I checked the manual. LibLoad/LibFree are not required unless you want to refer to the handle for subsequent LibFunc calls. This way Macro Scheduler would not need to re-load the library for each call. Maybe faster.Makes me wonder what circumstance actually requires libload/libfree.
So they are not needed in Josh's script since he is not using the handle. Sorry about the false suggestion.
Gale
Gale,
Thanks for looking that up and posting the clarification. Perhaps, if it is faster, this would be a good place to use libload/libfree. If the listbox is long with lots of pre-selected items there could be many lines of nearly the exact libfunc> call. This might be the ideal application to use the handle instead.
Thanks for looking that up and posting the clarification. Perhaps, if it is faster, this would be a good place to use libload/libfree. If the listbox is long with lots of pre-selected items there could be many lines of nearly the exact libfunc> call. This might be the ideal application to use the handle instead.