用Delphi整理备忘录

用Delphi整理备忘录,delphi,delphi-6,memo,Delphi,Delphi 6,Memo,我必须在德尔福6为我的学校写一份高分备忘录。 有没有办法按数字或字母对备忘录行进行排序 我使用4个TEDIT和1个TMemo。 如果游戏结束,我的代码将检查谁得分最高。 这是如何检查Player1是否比player2得分更高: if in1>p2in1 then begin highscore.naammemo.Lines.Add(Speler1.Caption); highscore.saldomemo.Lines.Add(Saldo1.Text); end; 我如何为TMem

我必须在德尔福6为我的学校写一份高分备忘录。 有没有办法按数字或字母对备忘录行进行排序

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

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

我如何为TMemo创建一个代码来对每场比赛的最高分数进行排序?

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

  • 将备忘录中的内容传输到
    TStringList
    实例
  • TStringList
    实例上调用
    CustomSort
    ,传递适当的排序比较函数
  • 将内容转移回备忘录
  • 步骤1和3是对
    Assign
    的简单调用。因此,第一步是:

    StringList.Assign(Memo.Lines);
    
    Memo.Lines.Assign(StringList);
    
    第三步是:

    StringList.Assign(Memo.Lines);
    
    Memo.Lines.Assign(StringList);
    
    第二步是棘手的一点。您必须提供这种类型的比较函数:

    TStringListSortCompare = function(List: TStringList; 
      Index1, Index2: Integer): Integer;
    
    您的函数将如下所示:

    function MySortCompare(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := MyCompareStrings(List[Index1], List[Index2]);
    end;
    
    其中,
    MyCompareStrings
    是一个根据规则比较两个字符串的函数。该函数的返回值遵循比较函数的常规约定。负表示小于,正表示大于,零表示等于


    当然,如果愿意,您可以将逻辑直接内联到
    myortcompare

    下面是一些示例代码,可以让您尝试排序。它在每行上使用一个文本值和一个数字,由制表符(
    #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;
    

    非常感谢你的精彩回答,但我不明白在我的项目中我必须把步骤1-3的代码放在哪里。好吧,这是你的代码,不是我的。鉴于只有您才能看到自己的代码,您很难期望我们确切地告诉您要编写什么以及在哪里编写。您询问如何根据一些定制订单对备忘录进行排序。在代码中需要这样做的地方,在步骤1-3中拼接。你应该关注的是理解。我期待你给我一个惊喜,大卫…;-)顺便说一句+1@NGLN看来我对更圆滑的方式的期望是不切实际的!!;-)你有大象的记忆。我必须小心我在这里说的话,它会回来咬我的!!:-)我认为您应该考虑创建一个数据对象并对数据对象进行排序。然后,您应该将数据对象(已经排序)打印到字符串列表中。您陷入了只使用内置数据类型(特别是字符串)的“严格类型化”坏习惯,您应该考虑创建自己的记录或类。