| Subject |
Re: autodrop in combobox |
| From |
Mustansir Ghor <mustan31@hotmail.com> |
| Date |
Sun, 15 Jan 2023 16:12:08 -0500 |
| Newsgroups |
dbase.getting-started |
Dear Mervyn Sir
The syntax given here has helped me a lot. Yet I came across a situation where the combobox becomes the 1st item of the form. In such case I could not simulate the autodrop feature.
I wonder if there is anything that can be done. Meanwhile I added a push button to make it work.
Best Regards
Mustansir
Mervyn Bick Wrote:
> On 2022/06/05 15:09, Mustansir Ghor wrote:
> > Dear All
> >
> > I have set autodrop to true in a combobox. When I press Tab key and the combobox gets focus then popup of items comes up. But when I use combobox.setfocus() to get its focus the autodrop feature does not work.
> >
> > Can anybody assists me on this how to go about.
>
> A little example form is attached. To ensure that Windows places the
> cursor over the combobox button prior to simulating a left mouse click
> the form metric needs to be Pixels.
>
> Most of the Windows API functions needed are contained in
> rmMouseEvents.cc in the dUFLP.
>
> When getting or setting a cursor's position or simulating a mouse event
> Windows uses the position on the screen rather than the position on the
> form.
>
> rmMouseEvents.cc uses a form's onMouseMove event handler to establish
> the relationship between a point on a form and the corresponding point
> on the screen. Instead of creating an onMouseMove event handler I've
> used the ClientToScreen() function from the Windows API to do the
> conversion.
>
> Mervyn.
>
>
> ** END HEADER -- do not remove this line
> //
> // Generated on 2022-06-06
> //
> parameter bModal
> local f
> f = new force_combox_dropForm()
> if (bModal)
> f.mdi = false // ensure not MDI
> f.readModal()
> else
> f.open()
> endif
>
> class force_combox_dropForm of FORM
> with (this)
> onOpen = class::FORM_ONOPEN
> metric = 6 // Pixels
> height = 352.0
> left = 514.0
> top = 0.0
> width = 280.0
> text = ""
> endwith
>
> this.ENTRYFIELD1 = new ENTRYFIELD(this)
> with (this.ENTRYFIELD1)
> height = 22.0
> left = 94.0
> top = 81.0
> width = 84.0
> value = "Entryfield1"
> endwith
>
> this.COMBOBOX1 = new COMBOBOX(this)
> with (this.COMBOBOX1)
> height = 22.0
> left = 94.0
> top = 132.0
> width = 84.0
> dataSource = 'array {"a","b","c","d"}'
> style = 1 // DropDown
> dropDownHeight = 132.0
> autoDrop = true
> endwith
>
> this.ENTRYFIELD2 = new ENTRYFIELD(this)
> with (this.ENTRYFIELD2)
> height = 22.0
> left = 94.0
> top = 183.0
> width = 84.0
> value = "Entryfield2"
> endwith
>
> this.PUSHBUTTON1 = new PUSHBUTTON(this)
> with (this.PUSHBUTTON1)
> onClick = class::PUSHBUTTON1_ONCLICK
> height = 43.0
> left = 85.0
> top = 260.0
> width = 107.0
> text = "Set focus to combobox"
> endwith
>
> this.TEXT1 = new TEXT(this)
> with (this.TEXT1)
> height = 33.0
> left = 11.0
> top = 7.0
> width = 241.0
> text = "Form metric must be Pixels otherwise Windows can't place the cursor correctly."
> endwith
>
>
> function PUSHBUTTON1_onClick()
> form.combobox1.setfocus() // Not really neccessary.
> //The programmed click on the combobox button will set focus anyway.
> form.drop_list()
> return
>
>
> function drop_list
> //Place form coordinates that will show the cursor over the combobox button into form.point
> //This conversion to screen coordinates needs to be done each time the function is executed
> //in case the user has moved the form on the screen
> form.point.setx(form.combobox1.left+form.combobox1.width-10) //make sure cursor is in button
> form.point.sety(form.combobox1.top+10)
> //Convert point values to position on screen.
> clienttoscreen(form.hwnd,form.point)
> //Get x and y coordinates for drop button on combobox
> form.x_combo = form.point.getx(form.point,0)
> form.y_combo = form.point.gety(form.point,4)
> form.rmMouse.screenLeftClick(form.x_combo,form.y_combo )
> return
>
> function form_onOpen()
> if type("ClientToScreen") # "FP"
> extern clogical ClientToScreen(chandle,cptr) user32
> endif
> set procedure to :duflp:rmMouseEvents.cc
> form.rmMouse = new rmMouseevents(form)
> form.point = new point() // point is a structure to hold the cursor's x and y coordinates
> return
>
> endclass
>
|
|