if file('test_multiselect.dbf') // drop table test_multiselect endif if not file('test_multiselect.dbf') create table test_multiselect (id autoinc,data character(10)) use test_multiselect generate 10 use endif ** END HEADER -- do not remove this line // // Generated on 2018-09-20 // parameter bModal local f f = new test_multigridselect1Form() if (bModal) f.mdi = false // ensure not MDI f.readModal() else f.open() endif class test_multigridselect1Form of FORM with (this) onOpen = class::FORM_ONOPEN onClose = class::FORM_ONCLOSE height = 30.3636 left = 68.4286 top = 1.5909 width = 45.5714 text = "" endwith this.CHILDTEST1 = new QUERY() this.CHILDTEST1.parent = this with (this.CHILDTEST1) width = 8.0 height = 1.0 sql = 'select * from "test_multiselect.DBF"' active = true endwith this.GRID1 = new GRID(this) with (this.GRID1) onOpen = class::GRID1_ONOPEN onMouseOver = class::GRID1_ONMOUSEOVER onMouseOut = class::GRID1_ONMOUSEOUT dataLink = form.childtest1.rowset multiSelect = true height = 10.6364 left = 3.0 top = 5.5 width = 36.5714 endwith this.PUSHBUTTON1 = new PUSHBUTTON(this) with (this.PUSHBUTTON1) onClick = class::PUSHBUTTON1_ONCLICK height = 1.7727 left = 14.0 top = 17.5 width = 18.0 text = "Clear selection" endwith this.RADIOBUTTON1 = new RADIOBUTTON(this) with (this.RADIOBUTTON1) height = 1.0909 left = 2.0 top = 1.5 width = 42.0 text = "Use Ctrl-key to select multiple records" group = true value = true endwith this.RADIOBUTTON2 = new RADIOBUTTON(this) with (this.RADIOBUTTON2) height = 1.0909 left = 2.0 top = 3.0 width = 42.0 text = "Select multiple records without using Ctrl-key" endwith this.RADIOBUTTON3 = new RADIOBUTTON(this) with (this.RADIOBUTTON3) height = 1.0909 left = 2.0 top = 20.5 width = 42.0 text = "Clear selection after processng" group = true value = true endwith this.RADIOBUTTON4 = new RADIOBUTTON(this) with (this.RADIOBUTTON4) height = 1.0909 left = 2.0 top = 22.5 width = 42.0 text = "Retain selection after processing" endwith this.PUSHBUTTON2 = new PUSHBUTTON(this) with (this.PUSHBUTTON2) onClick = class::PUSHBUTTON2_ONCLICK height = 1.7727 left = 14.0 top = 26.0 width = 18.0 text = "Process selection" endwith this.rowset = this.childtest1.rowset function GRID1_onMouseOut(flags, col, row) if form.radiobutton2.value == true class::setcontrolkey(0,1) //release control key endif form.grid_selected = this.selected() return function GRID1_onMouseOver(flags, col, row) if form.radiobutton2.value =true class::setcontrolkey(1,0) //hold down contol key endif return function GRID1_onOpen class::deselectEntry() return function PUSHBUTTON1_onClick class::clear_selection() return function clear_selection local aGrid aGrid = form.grid1.selected() for n = 1 to aGrid.size form.rowset.goto(aGrid[n]) class::deselectEntry() next form.rowset.first() class::deselectEntry() return function form_onClose class::setcontrolkey(0,1) //make quite sure control key is released return function form_onOpen clear #include winuser.h if type("SendMessage") # "FP" extern clong SendMessage(chandle,cuint,clong,clong) user32 ; from "SendMessageA" endif if type("GetKeyboardState") # "FP" extern CVOID GetKeyboardState(CPTR) User32 endif if type("SetKeyboardState") # "FP" extern CVOID SetKeyboardState(CPTR) User32 endif return function setcontrolkey(onoff,nstate) local keybuffer,state keybuffer = Space(256) GetKeyboardState(keybuffer) state=keybuffer.getbyte(vk_control) If onoff # 0 nstate=bitor(128,state) endif keybuffer.setbyte(vk_control,nstate) SetKeyboardState(keybuffer) return state function PUSHBUTTON2_onClick() class::process_selection() return function process_selection clear if type('form.grid_selected') = 'U' or form.grid_selected.size = 0 ? 'No records selected' return endif if form.radiobutton4.value = true form.childtest1.rowset.notifycontrols = false endif for n = 1 to form.grid_selected.size form.childtest1.rowset.goto(form.grid_selected[n]) // This is where code to process the record needs to be placed ? 'Processed record '+form.childtest1.rowset.fields['id'].value next if form.radiobutton4.value = true form.childtest1.rowset.notifycontrols = true else class::clear_selection() endif return function deselectEntry local point class::setcontrolkey(1,0) sendmessage(form.grid1.hwnd,wm_lbuttondown,9,0x220018) sendmessage(form.grid1.hwnd,wm_lbuttonup,9,0x220018) class::setcontrolkey(0,1) return endclass