2

我必须在 Delphi 6 中为我的学校制作高分备忘录。有没有办法按数字或字母对 MemoLines 进行排序?

我使用 4 个 Tedits 和 1 个 TMemo。如果游戏结束,我的代码会检查谁得分最高。这是检查 Player1 是否比 player2 得分更高的方法:

if in1>p2in1 then begin
  highscore.naammemo.Lines.Add(Speler1.Caption);
  highscore.saldomemo.Lines.Add(Saldo1.Text);
end;

如何为 TMemo 创建代码以对每场比赛的最高分进行排序?

4

2 回答 2

4

我认为最简单的方法是这样的:

  1. 将内容从备忘录传输到TStringList实例。
  2. 调用实例,传递适当的排序比较函数CustomSortTStringList
  3. 将内容传输回备忘录。

步骤 1 和 3 是对Assign. 所以第1步是:

StringList.Assign(Memo.Lines);

第 3 步将是:

Memo.Lines.Assign(StringList);

第2步是棘手的​​一点。您必须提供这种类型的比较功能:

TStringListSortCompare = function(List: TStringList; 
  Index1, Index2: Integer): Integer;

您的函数将如下所示:

function MySortCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := MyCompareStrings(List[Index1], List[Index2]);
end;

whereMyCompareStrings是一个根据您的规则比较两个字符串的函数。该函数的返回值遵循比较函数的通常约定。负数表示小于,正数表示大于,零表示相等。

当然,MySortCompare如果您愿意,您可以直接内联编写逻辑。

于 2013-10-25T14:20:34.140 回答
3

下面是一些示例代码,可让您尝试排序。它在每一行使用一个文本值和一个数字,由制表符 ( #9) 分隔。每个按钮单击处理程序的开头都有代码,将文本重置为相同的起始值,因此您可以看到效果。第一个按钮 ( btnNameSort) 使用标准按文本值排序,TStringList.Sort第二个按钮 ( ) 使用自定义排序函数btnScoreSort按数值排序。TListSortCompare

// Simply uses TStringList.Sort to sort in the default (alpha) order
procedure TForm1.btnNameSortClick(Sender: TObject);
var
  SL: TStringList;
begin
  InitMemoLines;
  SL := TStringList.Create;
  try
    Memo1.Lines.BeginUpdate;
    try
      SL.Assign(Memo1.Lines);
      SL.Sort;
      Memo1.Lines.Assign(SL);
    finally
      Memo1.Lines.EndUpdate;
    end;
  finally
    SL.Free;
  end;
end;

// Sorts by extracting the text after the tab character on the lines
// being compared, converting to numbers, and comparing the numbers.
// Called by using SL.CustomSort in the btnScoreSortClick event
// below.
//
// NOTE: Will obviously fail if the lines don't contain a tab, or
// if the content after the tab can't be converted to a numeric.
// Neither of those cases is handled here for brevity. 
function NumberedListSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  Line1, Line2: string;
  Num1, Num2: Integer;
begin
  Line1 := List[Index1];
  Line2 := List[Index2];
  Num1 := StrToInt(Copy(Line1, Pos(#9, Line1) + 1, 255));
  Num2 := StrToInt(Copy(Line2, Pos(#9, Line2) + 1, 255));
  Result := Num1 - Num2;
end;

// Calls NumberedListSort to sort by the numbers on the right end 
// of each line in the memo
procedure TForm1.btnScoreSortClick(Sender: TObject);
var
  SL: TStringList;
begin
  InitMemoLines;
  SL := TStringList.Create;
  try
    Memo1.Lines.BeginUpdate;
    try
      SL.Assign(Memo1.Lines);
      SL.CustomSort(NumberedListSort);
      Memo1.Lines.Assign(SL);
    finally
      Memo1.Lines.EndUpdate;
    end;
  finally
    SL.Free;
  end;
end;

// Calls InitMemoLines to set the starting content of the memo
procedure TForm1.FormCreate(Sender: TObject);
begin
  InitMemoLines;
end;

// Generates content of memo
procedure TForm1.InitMemoLines;
var
  i: Integer;
begin
  Memo1.Lines.Clear;
  for i := 1 to 10 do
    Memo1.Lines.Append(Format('Line ' + Chr(90 - i) + #9 + ' %d', [i]));
end;
于 2013-10-25T14:44:06.363 回答