I'm trying to sort a string grid filled with scores and strings like so:

[![enter image description here](https://i.stack.imgur.com/lHnQW.png)](https://i.stack.imgur.com/lHnQW.png)

via a sorted string list which is sorted by single columns from the grid called SUB 1, SUB 2, FINAL, TOTAL respectively (all these columns work except FINAL) and I'm not getting the results I need in the FINAL column.

I'm trying to get the column sorted like so, for example :

```
24
20
12
5
DNF
EXE
WE

```

but I'm getting this result instead (the result I do not want):

```
DNF
EXE
WE
24
20
12
5

```

In what way could I change my code to sort the grid as I want to sort it?

**My code:**

```
function Compare2(
    List   : TStringList;
    Index1 : Integer;
    Index2 : Integer) : Integer;
begin
  //comparer for custom sort used in SortLTSGrid
    if List[Index1] = List[Index2] then
        Result := 0
    else if List[Index1] < List[Index2] then
        Result := 1
    else
        Result := -1;
end;

procedure TfrmPuntehou.SortLTSGrid(var grid: TStringGrid; columntotal: Integer);
var
    TheList : TStringList;
    i,l,iCount,m:integer;
    const
    separator = ',';
const
    arrCodes:array[1..10] of string = ('DNF','DNS','WD','WE','DNA','OD','RD','EXR','EXE','PP');
begin
  //sorts grid largest to smallest according to one column

    //get grid row amount
    iCount:=grid.RowCount - 1;
    //create and fill the string list
    TheList := TStringList.Create;
      //fill the list
      for i := 1 to (iCount) do
      begin
        for l := 1 to Length(arrCodes) do
        begin
          if grid.Rows[i].Strings[columntotal] = arrCodes[l] then
          begin
          TheList.Add('0'+separator+grid.Rows[i].Text);
          end;
        end;
        TheList.Add(grid.Rows[i].Strings[columntotal]+separator+grid.Rows[i].Text);
      end;

    //try block to sort and write all strings in the list to the grid correctly
    try

       TheList.CustomSort(Compare2);

      for i:= 1 to (iCount) do
      begin
      grid.Rows[i].Text := TheList.Strings[(i-1)] ;
      end;

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

    finally
        TheList.Free;
    end;
end;

```