PrimeBeat
PrimeBeat

Reputation: 484

Delphi - descending sort of string grid rows, sorting by 1 column

I've run into a bit of a wall with my sorting, I managed to sort the rows of my string grid from smallest to largest but now I'm not sure how to sort it in descending order. I've tried using the code I used from the other sort and I only changed the 2nd last loop in the code to see if I can read from the bottom of the TStringList, but it hasn't worked and only takes one row from the list and duplicates it into the rest of the rows. Is there perhaps a way to reverse read a TStringList after sorting?

Code I used for the other sort I have and tried to implement for this sort (only changed the 2nd last loop):

procedure TfrmPuntehou.SortLTSGrid(var grid: TStringGrid; columntotal: Integer);
const
separator = ',';
var
iCount,i,j,k,iPos:integer;
TheList:TStringList;
sString,sTempString:string;
  m: Integer;
  o: Integer;
begin
  //procedure to sort from large to small values

  //get row amount
  iCount:=grid.RowCount-1;

  //create list
  TheList:=TStringList.Create;
  TheList.Sorted:=False;

  //start of try..finally block
    try
    begin

      //fill the list
      for i := 1 to (iCount - 1) do
      begin
        TheList.Add(grid.Rows[i].Strings[columntotal]+separator+grid.Rows[i].Text);
      end;

      //sort the list
      TheList.Sort;

      for k := 1 to TheList.Count do
      begin
      //take the line of the list and put it in a string var
      sString:= TheList.Strings[(k-1)];
      //get separator pos in that string
      iPos:=AnsiPos(separator,sString);
      sTempString:='';
      //remove separator and the column text at the front of the string
      sTempString:=Copy(sString,(iPos+1),Length(sString));
      TheList.Strings[(k-1)]:= '';
      TheList.Strings[(k-1)]:= sTempString;
      end;

      //fill the grid
      for j:= (iCount - 1) downto 1 do
      begin
        for o := 1 to (iCount - 1) do
          begin
            grid.Rows[j].Text := TheList.Strings[(o-1)] ;
          end;
      end;

      //fill the row numbers
      for m := 1 to iCount do
      begin
      grid.Cells[0,m]:= IntToStr(m);
      end;

    end;
    finally
    TheList.Free;
    end;
  //end of try..finally block
end;

Thanks in advance for the help!
Kind Regards
PrimeBeat

Upvotes: 1

Views: 1370

Answers (1)

fpiette
fpiette

Reputation: 12292

Use TStringList.CustomSort to sort the list using a specific method for comparison.

The specification for the comparer is given here.

Example:

function Compare1(           // Normal alphanum sort
    List   : TStringList;
    Index1 : Integer;
    Index2 : Integer) : Integer;
begin
    if List[Index1] = List[Index2] then
        Result := 0
    else if List[Index1] < List[Index2] then
        Result := -1
    else
        Result := 1;
end;

function Compare2(           // Reverse alphanum sort
    List   : TStringList;
    Index1 : Integer;
    Index2 : Integer) : Integer;
begin
    if List[Index1] = List[Index2] then
        Result := 0
    else if List[Index1] < List[Index2] then
        Result := 1
    else
        Result := -1;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
    SList : TStringList;
    S     : String;
begin
    SList := TStringList.Create;
    try
        SList.Add('Pierre');
        SList.Add('Albert');
        SList.Add('Paul');
        SList.Add('Jean');
        SList.Add('Simon');


        Memo1.Lines.Add('=== Compare1 ===');
        SList.CustomSort(Compare1);
        for S in SList do
            Memo1.Lines.Add(S);

        Memo1.Lines.Add('=== Compare2 ===');
        SList.CustomSort(Compare2);
        for S in SList do
            Memo1.Lines.Add(S);
    finally
        SList.Free;
    end;

end;

Upvotes: 2

Related Questions