Sorting the Contents of a ClientDataSet

From Introducing Kylix with Cary Jensen


I promised (HADP) a code segment that sorted the contents of a ClientDataSet in
response to clicking the column headers of a DBGrid. Here it is...

-Cary

//By Cary Jensen
//For demonstration purposes only. By using this code you
//agree to hold its author free from any claim arising out
//of its use or misuse.

//Use the TypeInf unit
uses TypInfo;

//TCustomClientDataSet is not available in Delphi 5. Changed to
TClientDataSet
function SortCustomClientDataSet(DataSet: TClientDataSet;
const FieldName: String): Boolean;
var
i: Integer;
IndexDefs: TIndexDefs;
IndexName: String;
IndexOptions: TIndexOptions;
begin
Result := False;
if IsPublishedProp(DataSet, 'IndexDefs') then
IndexDefs := GetObjectProp(DataSet, 'IndexDefs') as TIndexDefs
else
Exit;
if IsPublishedProp(DataSet, 'IndexName') then
IndexName := GetStrProp(DataSet, 'IndexName')
else
Exit;
IndexDefs.Update;
if DataSet.Fields.FindField(FieldName) = nil then Exit;
if IndexName = FieldName + '__IdxA'
then
begin
IndexName := FieldName + '__IdxD';
IndexOptions := [ixDescending];
end
else
begin
IndexName := FieldName + '__IdxA';
IndexOptions := [];
end;
for i := 0 to Pred(IndexDefs.Count) do
begin
if IndexDefs[i].Name = IndexName then
begin
Result := True;
Break
end; //if
end; // for
if not Result then
begin
DataSet.AddIndex(IndexName, FieldName,IndexOptions);
Result := True;
end; // if not
SetStrProp(DataSet, 'IndexName', IndexName);
end;

//Call SortCustomClientDataSet from a DBGrid's OnTitleClick event handler
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
SortCustomClientDataset(ClientDataSet1,Column.FieldName);
end;