RE: Grid Control: how disable checkbox(s)?

new topic     » topic index » view thread      » older message » newer message

Dan,

You can set an entire column of checkboxes to be disabled by setting the 
column property of EGW_COL_EDITABLE to False.  Disabling individual 
cells is a bit harder as this property is not (yet!) supported for 
individual cells - eventually I intend that you will be able to set most 
column properties for an individual cell but I this is dependent on some 
other changes first.  

I have come up with a workaround which is a little clunky but seems to 
work. See below...

Regards,

Phil

Dan Moyer wrote:
> Phil,
> 
> How could I cause checkbox(s) in a grid to become disabled?
> 
> Dan Moyer
> 

Code follows:

-- code generated by Win32Lib IDE v0.14.2

include Win32lib.ew
without warning



----
-- Window Window1
constant Window1 = createEx( Window, "Grid Control with CheckBoxes", 0,
Default, Default, 600, 300, 0, 0 )
constant PushButton2 = createEx( PushButton, "Select File", Window1,
484,
20, 88, 28, 0, 0 )
constant PushButton3 = createEx( PushButton, "Process Data", Window1,
484,
72, 88, 28, 0, 0 )


----
include eugrid.ew
atom void

integer aGrid, colFileName, colCB1, colCB2, colFileDir

-- Save state of last checkbox clicked
object last_checkbox_state

-- Create grid, create parms=(parent, x, y, width, height, show_window)
aGrid = EGW_CreateGrid( Window1, 10, 15, 450, 200, True )

-- no row header
void = EGW_SetGridProperty( aGrid, EGW_ROW_HEADER_WIDTH, 0)

--***Phil: Make grid look a bit more like a list view
void = EGW_SetGridProperty( aGrid, EGW_NULL_GRID_COLOR, BrightWhite)
void = EGW_SetGridProperty( aGrid, EGW_LINE_COLOR, BrightWhite)
void = EGW_SetGridProperty( aGrid, EGW_CELL_BORDER, False)

-- Filename column
-- ***Phil: Make this a protected edit field to get highlighting
--colFileName = EGW_AddColumn( aGrid, "FileName", 200, 
EGW_LAST,EGW_STATIC,1 )
colFileName = EGW_AddColumn( aGrid, "FileName", 100, EGW_LAST, 
EGW_EDIT,1 )
--void = EGW_SetColumnProperty(aGrid, colFileName, 
EGW_COL_ALIGN,EGW_CENTER)
void = EGW_SetColumnProperty(aGrid, colFileName, EGW_COL_EDITABLE, 
False)
--void = EGW_SetColumnProperty( aGrid, colFileName, EGW_COL_WIDTH, 75 )

-- checkbox columns:
colCB1 = EGW_AddColumn(aGrid, "Action1 - row 1 disabled", 120, EGW_LAST, 
EGW_CHECKBOX, 2 )
void = EGW_SetColumnProperty(aGrid, colCB1, EGW_COL_ALIGN, EGW_CENTER)
colCB2 = EGW_AddColumn(aGrid, "Action2 - all disabled", 120, EGW_LAST, 
EGW_CHECKBOX, 3 )
void = EGW_SetColumnProperty(aGrid, colCB2, EGW_COL_ALIGN, EGW_CENTER)
void = EGW_SetColumnProperty(aGrid, colCB2, EGW_COL_EDITABLE, False)

-- file directory column:
colFileDir = EGW_AddColumn( aGrid, "FileDirectory", 226, EGW_LAST,
EGW_STATIC, 4 )
--void = EGW_SetColumnProperty(aGrid, colFileDir, 
EGW_COL_ALIGN,EGW_CENTER)


----
procedure PushButton2_onClick (integer self, integer event, sequence
params)--params is ()
seq fName, dirName, fullPathName, temp
seq newRow
int row, posBS -- posBS is position of back-slash in file name

temp = {}

-- get a file name
fName = getOpenFileName( Window1, current_dir() & "\\", "" )
-- entered a file name?
if length( fName ) = 0 then
return
end if

-- separate filename from dirName:
if find('\\',fName) then -- found back-slash
-- work from end, remove chars after last back-slash:
for n = length(fName) to 1 by -1do
if not equal('\\',fName[n]) then
temp = prepend(temp,fName[n])
else
posBS = n
exit
end if
end for

fullPathName = fName
dirName = fName[1..posBS -1]
fName = temp
else
dirName = ""
end if

newRow = {fName,1,1,dirName }

-- example relating to adding new row:
--global constant EmptyGridRow = {"", 2, "", "", 0, True}

-- Add new row to grid:
row = EGW_AddDataRow(aGrid, newRow, EGW_LAST)

--***Phil: Not necessary unless you are doing database manipulation ***
--void = EGW_SetDataRowFlag(aGrid, row, EGW_ROW_NEW, True)

-- Go to it?
--***Phil: You can't use EGW_LAST here - use row number from 
EGW_AddDataRowinstead
-- void = EGW_ScrollToCell(aGrid, EGW_LAST, colFileName)
--repaintWindow(Window1)

--***Phil Start
-- Repaint window to make sure new row is displayed
repaintWindow(aGrid)
-- Scroll to first column of new row
void = EGW_ScrollToCell( aGrid, row, colFileName )
--***Phil End
end procedure
setHandler( PushButton2, w32HClick, routine_id("PushButton2_onClick"))


----
procedure PushButton3_onClick (integer self, integer event, sequence
params)--params is ()
object result
atom numOfRows

numOfRows = EGW_GetRowCount ( aGrid )

for n = 1 to numOfRows do
result = EGW_GetDataCellValue ( aGrid, n, 2 )
puts(1, sprint(result))
result = EGW_GetDataCellValue ( aGrid, n, 3 )
puts(1, sprint(result))
puts(1, "\n")
end for

end procedure
setHandler( PushButton3, w32HClick, routine_id("PushButton3_onClick"))
procedure onGridEvent (atom self, atom event, sequence parms)
atom msg, wParam, lParam
sequence cell
object cbState

msg = parms[1]
wParam = parms[2]
lParam = parms[3]

cell = EGW_GetCurrentCell( aGrid )

-- If checkbox clicked then save state
if msg = EGW_LEFTBUTTONDOWN then

	-- Save checkbox state on mouse down
	if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) then -- is a 
checkbox column
		last_checkbox_state = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] )
	end if

-- If checkbox armed by pressing space bar then save state
elsif msg = EGW_CELLEDIT then

	-- Save checkbox state on spacebar down
	if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) -- is a 
checkbox column
	and wParam = VK_SPACE then
		last_checkbox_state = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] )
	end if

-- User has clicked on a cell
elsif msg = EGW_LEFTBUTTONUP then

   -- Process checkbox change of state
   if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) then -- is a 
checkbox column

   		-- get state of clicked checkbox:
   		cbState = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] )

   		-- Simulate protected checkbox for e.g. cb1 on first row only
		if cell[1] = 1 and cell[2] = colCB1 then
			void  = EGW_SetDataCellValue( aGrid, cell[1], cell[2], 
last_checkbox_state )
		end if

		-- Display checkbox state in window title
		setText( Window1, "Clicked on row number: " & sprint(cell[1])
        	              & ", column id: " & sprint(cell[2])
            	          & " , state: " & sprint(cbState) )
   end if




end if

end procedure
setHandler( aGrid, w32HEvent, routine_id("onGridEvent"))

WinMain( Window1,Normal )

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu