2013-10-25 2 views
2

Мне нужно сделать рекорды для моей школы в Delphi 6. Есть ли способ сортировать MemoLines по номерам или алфавиту?Сортировка памятки в Delphi

Я использую 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 сортировать высокий балл каждой игры?

+0

Я думаю, вы должны посмотреть на создание объекта данных и сортировку объектов данных. Затем вы должны напечатать объекты данных (которые уже отсортированы) в списке String. Вы попадаете в «строго типизированную» плохую практику использования только встроенных типов данных (особенно строк), где вам следует подумать о создании собственных записей или классов. –

ответ

2

Вот пример кода, который позволит вам экспериментировать с сортировкой. Он использует текстовое значение и число в каждой строке, разделенное символом табуляции (#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; 
+0

Thx для ответа –

3

Я думаю, что самый простой способ будет что-то вдоль этих линий:

  1. Передача содержимого из записки к TStringList инстанции.
  2. Позвоните по номеру CustomSort на номер TStringList, пройдя соответствующую функцию сравнения сортировки.
  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; 

где MyCompareStrings это функция, которая сравнивает две строки в соответствии с вашими правилами. Возвращаемое значение этой функции следует обычному соглашению для функции сравнения. Отрицательный означает меньше, чем положительное значение больше и равно нулю.

Конечно, вы можете написать логику непосредственно в строке MySortCompare, если хотите.

+0

Большое спасибо за ваш отличный ответ, но я не понимаю, где я должен поставить коды шага 1-3 в свой проект. –

+0

Ну, это ваш код не мой. Вы вряд ли можете ожидать, что мы скажем вам, что именно писать и где писать, учитывая, что только вы можете видеть свой код.Вы спросили, как сортировать заметку в соответствии с каким-то заказным заказом. В точке кода, где вам нужно это сделать, сплайсируйте шаги 1-3. То, на что вы должны сосредоточиться, - это понимание. –

+1

Я ожидал [slicker way] (http://stackoverflow.com/questions/11122197/why-does-memo-lines-use-tstrings-instead-of-tstringlist/11122492#comment14576040_11122492) от вас Дэвид ...; -) Btw +1 – NGLN

Смежные вопросы