Неалфавитный вид в Дельфах - PullRequest
5 голосов
/ 19 августа 2011

Я пытаюсь отсортировать TStringList в определенном порядке.

Вместо A, B, C .. Я пытаюсь заказать это в B, C, A.

Я объявил константный массив с нужным мне порядком.

Я пробовал использовать CustomSorte, но не могу понять, как написать функцию.

Сейчас я пытаюсь использовать циклы for, но это очень сложно и запутанно!

Я не эксперт по Delphi ...

Заранее спасибо, ребята!

1 Ответ

11 голосов
/ 19 августа 2011

Из справки о типе функции TStringListSortCompare:

Index1 и Index2 - это индексы элементов в списке для сравнения. Обратный вызов возвращает:

  • значение меньше 0, если строка, идентифицированная Index1, предшествует строке, идентифицированной Index2
  • 0, если две строки эквивалентны
  • значение больше 0, если строка с Index1 идет после строки, идентифицированной Index2.

Так что, если вы вычтете свой заказ второго предмета из заказа первого, то элементы будут отсортированы так, как вы хотите.

const
  Order: array[0..6] of String = ('B', 'C', 'A', 'D', 'G', 'F', 'E');

function GetStringOrder(const S: String; CaseSensitive: Boolean): Integer;
begin
  for Result := 0 to Length(Order) - 1 do
    if (CaseSensitive and (CompareStr(Order[Result], S) = 0)) or
        (not CaseSensitive and (CompareText(Order[Result], S) = 0)) then
      Exit;
  Result := Length(Order);
end;

function MyCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := GetStringOrder(List[Index1], List.CaseSensitive) -
    GetStringOrder(List[Index2], List.CaseSensitive);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.CommaText := 'A,G,a,C,B,b,F,a,B,C,c,D,d,E,D,F,G,C,A,G,d,e,f,g';
    List.CaseSensitive := True;
    List.CustomSort(MyCompareStrings);
    ListBox1.Items.Assign(List);
  finally
    List.Free;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...