[Lazarus] Having more than 32 elements in a set (TGridOptions of TCustomGrid)
Werner Pamler
werner.pamler at freenet.de
Wed Nov 5 15:52:15 CET 2014
For fpspreadsheet I would like to implement the feature of Excel or
Libre/OpenOffice that multiple cell ranges can be selected. The grid
component in this package, TsSpreadsheetGrid, currently can select only
a single range (if goRangeSelect is in the grid's Options) due to its
inheritance from TCustomGrid.
My idea is to add a new "goMultiSelect" option to TCustomGrid directly
since this might be an interesting feature for other applications as
well, and then to write additional code to store multiple range
rectangles. It shouldn't be too difficult, but I am failing already at
the very first step: adding the new option to the type TGridOption. This
is the new declaration:
type
TGridOption = (
goFixedVertLine, // Ya
goFixedHorzLine, // Ya
goVertLine, // Ya
goHorzLine, // Ya
goRangeSelect, // Ya
goDrawFocusSelected, // Ya
goRowSizing, // Ya
goColSizing, // Ya
goRowMoving, // Ya
goColMoving, // Ya
goEditing, // Ya
goAutoAddRows, // JuMa
goTabs, // Ya
goRowSelect, // Ya
goAlwaysShowEditor, // Ya
goThumbTracking, // ya
// Additional Options
goColSpanning, // Enable cellextent calcs
goRelaxedRowSelect, // User can see focused cell on goRowSelect
goDblClickAutoSize, // dblclicking columns borders (on hdrs)
resize col.
goSmoothScroll, // Switch scrolling mode (pixel scroll is by
default)
goFixedRowNumbering, // Ya
goScrollKeepVisible, // keeps focused cell visible while scrolling
goHeaderHotTracking, // Header cells change look when mouse is
over them
goHeaderPushedLook, // Header cells looks pushed when clicked
goSelectionActive, // Setting grid.Selection moves also cell cursor
goFixedColSizing, // Allow to resize fixed columns
goDontScrollPartCell, // clicking partially visible cells will not
scroll
goCellHints, // show individual cell hints
goTruncCellHints, // show cell hints if cell text is too long
goCellEllipsis, // show "..." if cell text is too long
goAutoAddRowsSkipContentCheck,//BB Also add a row (if AutoAddRows
in Options) if last row is empty
goRowHighlight, // Highlight the current Row
goMultiSelect // Enable selection of multiple ranges <<<< NEW
);
TGridOptions = set of TGridOption;
Recompiling the package LCLBase fails with the error: "Property can't
have a default value". I think this message is misleading and confusing
because the true issue seems to me that the set of TGridOptions now
contains 33 elements. In my understanding, the elements of a set
correspond to the bits of an integer. In a 32-bit OS, therefore, a set
can only contain 32 elements - there is one too many now...
Is this interpretation correct?
OK, here I could circumvent this issue by introducing a new boolean
property "MultiSelect" which is evaluated when goRangeSelect is active.
Maybe this is even better than the goMultiSelect option because it
bypasses the conflict with goRangeSelect.
But what if I would not have this possibility? Is there a way to extend
the set to more than 32 elements? If not, split the Options into groups
of options like VirtualTreeView does? I fear the options of the grid
components will require a major redsign soon.
More information about the Lazarus
mailing list