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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |