加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 按行排序TStringGrid及其整数值

发布时间:2020-12-15 09:34:53 所属栏目:大数据 来源:网络整理
导读:我有2列StringGrid:播放器和分数.我必须对这张桌子进行排序,看看球员的得分. 情况就是这样.我尝试过使用StringGrid3.SortColRow(true,1);但它只对字符串值进行排序.如果我有像[1,4,12,3]这样的数字,则排序的StringGrid变为[a,3,4]. 我必须对Integer值进行排
我有2列StringGrid:播放器和分数.我必须对这张桌子进行排序,看看球员的得分.

情况就是这样.我尝试过使用StringGrid3.SortColRow(true,1);但它只对字符串值进行排序.如果我有像[1,4,12,3]这样的数字,则排序的StringGrid变为[a,3,4].

我必须对Integer值进行排序,而不是字符串1.另外,我的问题是我必须用数字移动玩家的名字(如上图所示).

我怎么能这样做?

解决方法

如果两个比较值都是数字,您可能会编写一个试图按Numbers排序的比较器.通过将Stringgrid转换为其祖先TCustomgrid,您可以使用MoveRow过程来交换行.显示对许多列进行排序的示例可能如下所示:

unit StringGridSortEnh;
interface
uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,Grids,StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  TMoveSG = class(TCustomGrid);
  TSortInfo = Record
    col: Integer;
    asc: Boolean;
  End;

function CompareNumber(i1,i2: Double): Integer;
// Result: -1 if i1 < i2,1 if i1 > i2,0 if i1 = i2
begin
  if i1 < i2 then
    Result := -1
  else if i1 > i2 then
    Result := 1
  else
    Result := 0;
end;

// Compare Strings if possible try to interpret as numbers
function CompareValues(const S1,S2 : String;asc:Boolean): Integer;
var
  V1,V2 : Double;
  C1,C2 : Integer;
begin
  Val(S1,V1,C1);
  Val(S2,V2,C2);
  if (C1 = 0) and (C2 = 0) then  // both as numbers
     Result := CompareNumber(V1,V2)
  else  // not both as nubers
     Result := AnsiCompareStr(S1,S2);
  if not Asc then Result := Result * -1;

end;

procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of TSortInfo; Fixed: Boolean);
var
  I,J,FirstRow: Integer;
  Sorted: Boolean;

  function Sort(Row1,Row2: Integer): Integer;
  var
    C: Integer;
  begin
    C := 0;
    Result := CompareValues(Grid.Cols[ColOrder[C].col][Row1],Grid.Cols[ColOrder[C].col][Row2],ColOrder[C].asc);
    if Result = 0 then
    begin
      Inc(C);
      while (C <= High(ColOrder)) and (Result = 0) do
      begin
        Result := CompareValues(Grid.Cols[ColOrder[C].col][Row1],ColOrder[C].asc);
        Inc(C);
      end;
    end;
  end;

begin
  for I := 0 to High(ColOrder) do
    if (ColOrder[I].col < 0) or (ColOrder[I].col >= Grid.ColCount) then
      Exit;

  if Fixed then
    FirstRow := 0
  else
    FirstRow := Grid.FixedRows;

  J := FirstRow;
  Sorted := True;
  repeat
    Inc(J);
    for I := FirstRow to Grid.RowCount - 2 do
      if Sort(I,I + 1) > 0 then
      begin
        TMoveSG(Grid).MoveRow(i + 1,i);
        Sorted := False;
      end;
  until Sorted or (J >= Grid.RowCount + 1000);
  Grid.Repaint;
end;

procedure TForm1.Button1Click(Sender: TObject);
const // we want to use only 4 columns
  MyArray: array[0..3] of TSortInfo =
    ((col: 1; asc: true),(col: 2; asc: true),(col: 3; asc: true),(col: 4; asc: false)
     );
begin
  SortGridByCols(StringGrid1,MyArray,true);
end;

procedure TForm1.Button2Click(Sender: TObject);
const  // we want to use only one column
  MyArray: array[0..0] of TSortInfo = ((col: 1; asc: true));
begin
  SortGridByCols(StringGrid1,true);
end;

end.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读