[Home] [Puzzles & Projects] [Delphi Techniques] [Math topics] [Library] [Utilities]
|
|
Here's a small program that will get you started on sorting a string grid (TStringGrid) by the data in a selected column. I wanted to make the top grid row a fixed row and preserve it during the sort (i.e. keep it as the top row, regardless of it's values). It turns out that neither OnClick nor OnCellSelect event exits are triggered by clicks on a cell in a fixed row or column. So I used an OnMouseUp exit to trigger the call to the SortGrid procedure. The stringgrid name and column to sort are passed as parameters. The sort itself is almost trivial. For each scrollable row, i, examine the selected column values for all higher row numbers. If a smaller value is found, swap it with row i. The slightly tricky part was how to to exchange two rows when necessary. TCustomGrid is TStringGrid's ancestor and contains a MoveRow method. But TStringGrid doesn't declare it so we can't use it. We could define a new class or component that does include MoveRow, but that lessens it's generality. So I just implemented my own code using a temporary TStringList and the Assign method to exchange 2 rows when necessary. The sort could be made more flexible by passing SortGrid a "Column type" field to identify string, integer, floating point, or date value types. SortGrid would then convert and compare grid string values based on the column type. For now, I just format the numeric columns with leading blanks to preserve alphabetic sort order and treat everything as strings. Addendum August 8, 2006: A small change today in the OnMouseUp routine allows variable width columns to be recognized correctly. I should also mention that there is now a GridQuickSort demo program which allows data type as suggested above and use the Quick sort algorithm for much faster sorting of large grids. Click here to download the sample GridSort program.
|
[Feedback] [Newsletters (subscribe/view)] [About me]Copyright © 2000-2018, Gary Darby All rights reserved. |