Subject |
Re: combobox / msgbox |
From |
Mervyn Bick <invalid@invalid.invalid> |
Date |
Fri, 16 Feb 2024 14:21:15 +0200 |
Newsgroups |
dbase.getting-started |
Attachment(s) |
wcombo1.wfm |
On 2024/02/16 10:31, Lee Grant wrote:
> Mervyn,
>
> Admittely, I'm not this advanced and especially in the use of Array and
> especially not ArrayRowsets, but looking at this code, he seems to be
> trying to use an Array, like an ArrayRowset, for a rowset.
>
> Correct me if I'm wrong, but I think he needs to check out the sample of
> the ArrayRowset if that is what he is trying to do with a regular Array.
A combobox has various options when it comes to assigning lists to its
datasource property. The most used option is to assign an array to the
property although one can assign a field from a rowset.
When a combobox opens the first value in the list, be it an array or a
field in a rowset, assigned to the combobox's datasource property is
displayed in the combobox's entryfield
Michel has opted to build an array from the data in the field because he
has more control. He has added a blank element at the start of the
array so that when the form opens nothing is displayed in the entryfield.
Michel, it's not written on tablets of stone, but I prefer not to add a
blank element to the array. Sooner or later the user is going to select
that blank element and is going to wonder why your program doesn't
react. I prefer to use the form's onOpen event handler to place a
message in each combobox so that the user has an idea of what the
combobox is for.
I've made some changes to your form which is attached.
I've added an entryfield to show what record is selected. The
entrifield's tabstop property is set false so as to keep it out of the
z-order.
Mervyn.
| clear
** END HEADER -- do not remove this line
//
// Generated on 2024-02-16
//
parameter bModal
local f
f = new wcombo1Form()
if (bModal)
f.mdi = false // ensure not MDI
f.readModal()
else
f.open()
endif
class wcombo1Form of FORM
set procedure to :wef1:\wcombo1\lgControls.cc additive
with (this)
onOpen = class::FORM_ONOPEN
onClose = class::FORM_ONCLOSE
open = class::FORM_OPEN
metric = 4 // Centimeters
height = 6.2442
left = 2.249
top = 2.9633
width = 17.78
endwith
this.VEND1 = new QUERY(this)
with (this.VEND1)
left = 30.0
top = 29.0
sql = 'select * from "VEND.DBF"'
active = true
endwith
this.MYCOMBOBOX1 = new MYCOMBOBOX(this)
with (this.MYCOMBOBOX1)
onChange = class::MYCOMBOBOX1_ONCHANGE
height = 0.8731
left = 0.8202
top = 1.1906
width = 7.5406
dropDownHeight = 5.0006
selectAll = true
endwith
this.MYENTRYFIELD1 = new MYENTRYFIELD(this)
with (this.MYENTRYFIELD1)
onGotFocus = class::MYENTRYFIELD1_ONGOTFOCUS
height = 0.8996
left = 10.2129
top = 1.4552
width = 5.8473
endwith
this.ENTRYFIELD1 = new ENTRYFIELD(this)
with (this.ENTRYFIELD1)
dataLink = form.vend1.rowset.fields["nom"]
height = 0.5821
left = 4.9477
top = 4.101
width = 4.5508
tabStop = false
endwith
this.TEXTLABEL1 = new TEXTLABEL(this)
with (this.TEXTLABEL1)
height = 0.5821
left = 2.5665
top = 4.0746
width = 2.2225
text = "Rowpointer at"
endwith
this.rowset = this.vend1.rowset
function MYCOMBOBOX1_onChange()
// mval = upper(this.value) //findkey() will find partial match
mval = upper(this.value)+space(18-len(this.value)) //findkey() needs exact match
if form.rowset.findkey(mval)
?"ok",mval
this.before.setfocus() //Move to next control
endif
if not form.rowset.findkey(mval)
?"go to msgbox",mval
msgbox(mVal+" not found", "Check", 0 + 16)
this.value = ' ' //delete invalid name
endif
return
function MYENTRYFIELD1_onGotFocus()
//Move focus back to combobox if user enters invalid name
if empty(form.mycombobox1.value)
form.mycombobox1.setfocus()
form.mycombobox1.keyboard('{home}')
inkey(.01) //Minimal delay otherwise next instruction is skipped
form.mycombobox1.keyboard('{ctrl+shift+end}') //select all
endif
return
function form_onClose()
cCuaenter = form.cuaenter
set cuaenter &cCuaenter
return
function form_onOpen()
form.cuaenter = set('cuaenter')
set cuaenter off
return
function form_open()
form.rowset.indexname = "NOMVEND"
form.mvendarray = new array()
form.rowset.first()
// form.mvendarray.add("")
do while not form.rowset.endofset
form.mvendarray.add(form.rowset.fields["nom"].value)
form.rowset.next()
enddo
form.myComboBox1.datasource = 'array form.mvendarray'
form.mYCombobox1.value := 'Enter a name or select from dropdown list'
return FORM::open()
endclass
|
|