结合几个delphi例子,自己写的array结构体排序,用了一天的时间才写好

unit Unit3;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,types;

type
TForm3 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

{$R *.dfm}
uses
System.Generics.Collections, System.Generics.Defaults;
var
Values: array[0..3] of string =( 'Carol' ,'Bob', 'Alice', 'Dave'); //为什么不能把这句放在button.click里面
S: string;

//记录用于示例代码。

type
TMyRecord = record
I: Integer;
S: string;
end;
//按TMYRECORD的I字段递增顺序排序的示例
//比较类,以降序对TMyRecord的I字段进行排序

type
TMyRecordComparer1 = class(TComparer)
public
function Compare(const Left, Right: TMyRecord): Integer; override;
end;

function TMyRecordComparer1.Compare(const Left, Right: TMyRecord): Integer;
begin
Result := (Left.I - Right.I ); //Left.I,Right.I交换位置,排序的结果也就不一样
end;
//样例程序

var
Valuesye: array of TMyRecord ;
R: TMyRecord;
rye:TMyRecord;

type //这里不能少了ytpe
TArr = record //record
class procedure ArrayAdd(var Arr: TArray; const item: T); static; //结构中的 class 方法必须是 static 的
end; //可能这个是type的结束号
{ TArr }

class procedure TArr.ArrayAdd(var Arr: TArray; const item: T);
begin
SetLength(Arr, Length(Arr)+1);
Arr[High(Arr)] := item;
end;

procedure TForm3.Button1Click(Sender: TObject);

begin
TArray.Sort(Values);
for S in Values do
Memo1.Lines.Add(S);
end;

procedure TForm3.Button2Click(Sender: TObject);
var
chen:TArr;
begin
rye.I:=0;
rye.S:='叶会严';
//TArr.ArrayAdd(Valuesye,rye);
FillChar(Valuesye,sizeof(Valuesye),0); //这里清空缓存数据,生成 p.ScoreList=()
setlength(Valuesye,2); //设置数组的长度

//这种方法得到:p.ScoreList=((course='数学';score=78.5),(course='语文';score=70)) 采用截断模式
Valuesye[0].s:='语文';
Valuesye[0].i:=3;

Valuesye[1].s:='数学';
Valuesye[1].i:=2;
SetLength(Valuesye, Length(Valuesye)+1);
Valuesye[High(Valuesye)] := rye;
TArray.Sort(Valuesye, TMyRecordComparer1.Create); //之前这里出错了,是因为我把 网上的Values改成了Valuesye
for R in Valuesye do //之前这里出错了,是因为我把网上的 Values改成了Valuesye
Memo1.Lines.Add(Format('%d:%s', [R.I, R.S]));
ShowMessageFmt('%d,%s', [Valuesye[0].i, Valuesye[0].s]); //abc,123
end;

procedure TForm3.Button3Click(Sender: TObject);
begin
FillChar(Valuesye,sizeof(Valuesye),0); //这里清空缓存数据,生成 p.ScoreList=()
setlength(Valuesye,2);

//这种方法得到:p.ScoreList=((course='数学';score=78.5),(course='语文';score=70)) 采用截断模式
Valuesye[0].s:='语文';
Valuesye[0].i:=3;

Valuesye[1].s:='数学';
Valuesye[1].i:=2;
end;

end.