用Delphi整理备忘录
我必须在德尔福6为我的学校写一份高分备忘录。 有没有办法按数字或字母对备忘录行进行排序 我使用4个TEDIT和1个TMemo。 如果游戏结束,我的代码将检查谁得分最高。 这是如何检查Player1是否比player2得分更高:用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
if in1>p2in1 then begin
highscore.naammemo.Lines.Add(Speler1.Caption);
highscore.saldomemo.Lines.Add(Saldo1.Text);
end;
我如何为TMemo创建一个代码来对每场比赛的最高分数进行排序?我认为最简单的方法应该是这样的:
TStringList
实例TStringList
实例上调用CustomSort
,传递适当的排序比较函数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看来我对更圆滑的方式的期望是不切实际的!!;-)你有大象的记忆。我必须小心我在这里说的话,它会回来咬我的!!:-)我认为您应该考虑创建一个数据对象并对数据对象进行排序。然后,您应该将数据对象(已经排序)打印到字符串列表中。您陷入了只使用内置数据类型(特别是字符串)的“严格类型化”坏习惯,您应该考虑创建自己的记录或类。