gpt4 book ai didi

delphi - 按行及其整数值对 TStringGrid 进行排序

转载 作者:行者123 更新时间:2023-12-03 15:22:08 26 4
gpt4 key购买 nike

我的 StringGrid 有 2 列:PlayerScores。我必须根据玩家的得分对该表进行排序。

enter image description here

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

我必须对整数值进行排序,而不是字符串值。另外,我的问题是我也必须将玩家的名字与数字一起移动(如上图所示)。

我该怎么做?

最佳答案

如果两个比较值都是数字,您可能会编写一个尝试按数字排序的比较器。通过将 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], Grid.Cols[ColOrder[C].col][Row2],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,MyArray,true);
end;

end.

enter image description here enter image description here

关于delphi - 按行及其整数值对 TStringGrid 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23366062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com