Класс TStringList представляет собой полнофункциональный класс общего назначения и является прямым потомком класса TStrings. Помимо перекрытых абстрактных методов своего родителя, класс включает в себя дополнительные методы и свойства.

property Duplicates: TDuplicates;

Свойство управляет возможностью размещения в наборе двух и более идентичных строк.

property Sorted: Boolpan;

Признак необходимости сортировки строк в алфавитном порядке.

property OnChange: TNotifyEvent;

Определяет реакцию на изменение набора строк. Возникает после последнего изменения.

property OnChanging: TNotifyEvent;

Определяет реакцию на изменение набора строк. Возникает до очередного изменения.

function Find(const S: String;
var Index: Integer): Boolean;

Ищет в наборе строку S и в случае успеха в параметре Index возвращает ее индекс.

При Sorted = True строки набора автоматически сортируются в алфавитном порядке. При этом свойство Duplicates разрешает коллизию, связанную с добавлением в набор строки, идентичной одной из ранее вставленных. Если Duplicates = dulgnore, идентичная строка отвергается и программе ничего об этом не сообщается; если Duplicates = duError, возбуждается исключение EListError; значение Duplicates = duAccept разрешает вставлять в набор сколько угодно идентичных строк.

Следует заметить, что сортировка строк в 32-разрядных версиях Windows осуществляется не совсем так, как это происходит в MS-DOS или Windows 3.x. Чтобы убедиться в этом, советую прогнать следующий вариант учебной программы (проект $(S0URCE)\Ch04\TSringList\List.dpr). В ней обработчик события OnClick кнопки bbRun создает два списка строк - Listl и List2. Список Listl первоначально способен сортировать строки (в его свойство Sorted устанавливается значение True). Затем в цикле от 32 до 255 (0-31 - это коды служебных символов) происходит наполнение обоих списков: в Listl помещается строка, содержащая символ и его код, aBList2- наоборот, сначала код, а затем сам символ. Поскольку символьное представление кода дополняется до трех символов (в двузначных числах слева добавляется ведущий ноль), строки в списке Listl окажутся отсортированными по символу, а в списке List2 - по коду символа. Затем оба списка для наглядности объединяются и помещаются в многострочное поле mmOutput (рис. 4.1).

procedure TfmExample.bbRunClick(Sender: TObject); var
k: Byte;

Listl, List2: TStringList; S: String; begin // Создаем два списка

Listl := TStringList.Create;
Listl.Sorted := True;
List2 :== TStringList .Create;

// Цикл наполнения списков монотонно возрастающими кодами

for к := 32 to 255 do
begin
S :~ IntToStr(k); // Код символа if k<100 then
S := '0' + S;// Двузначное число дополняем ведущим нулем // Формируем строку Listl из символа + табуляция + код символа Listl.Add(Char(к) + #9 + S) ;
// Формируем строку List2 из кода + табуляция + символ List2.Add(S + #9 + Char(к));
end;

// Объединяем оба списка

Listl.Sorted := False; // Отключаем сортировку Listl for к := 0 to Listl.Count-1 do
Listl[к] := Listl[к] + #9 + List2[k];
// Переносим результат в mmOutput mmOutput.Lines.Assign(Listl); // Уничтожаем Listl и List2 Listl.Free;
List2.Free;
end;
4.3.2. Класс TStringList

Рис. 4.1. Окно прогона программы сравнения сортировки строк для 32-разрядных версий Windows и для Windows 3.x

Следует прокомментировать два момента. Во-первых, все строки Listl помещаются в свойство Liross многострочного поля mmOutput с помощью единственного оператора:

mmOutput.Lines.Assign(Listl);

Это возможно из-за того, что mmOutput. Lines и Listl имеют общего родителя TStrings, который умеет копировать родственные наборы строк с помощью своего метода Assign. Во-вторых, перед объединением строк мы отключили свойство Sorted списка Listl. Если этого не сделать, любое изменение строк в отсортированном списке привело бы к исключению EStringListError.

Как видим, строки в 32-разрядных версиях Windows сортируются не с учетом внутреннего кода символа, а с учетом «смысла»: в начале располагаются все знаки препинания и разного рода «мусор», затем идут цифры, буквы латинского алфавита и символы кириллицы. Буквы упорядочены парами - сначала прописная, за ней строчная, и не идут сплошным массивом. «Виновником» такой сортировки является API-функция AnsiCompareText, к которой обращается метод TStringList.Quicksort. Если вам понадобится отсортировать символы так, как это принято в MS-DOS или Windows 3.x, то есть по коду символа, проделайте следующее:

1. Разыщите в папке $(Delphi)\Source\Rtl\Common исходный файл CLASSES.PAS и скопируйте его в ваш рабочий каталог. Если вы не найдете этого файла, вы не сможете изменить сортировку, так как в классе TStringList метод Quicksort, отвечающий за сортировку, определен в секции private и, следовательно, недоступен наследникам.

2. В раздел Implementation этого модуля сразу после предложения Uses поместите такое описание функции AnsiCompareText:

function AnsiCompareText(SI, S2: String): Integer;
begin
if SI <
S2 then Result := -1 else if SI - S2 then Result 0 else Result := 1 f end;

3. С помощью команды Project ► Add To Project добавьте измененный модуль Classes к вашему проекту и сделайте новый прогон программы. После этого оба столбца будут идентичны.

4.3. Классы TStrings и TStringlist - наборы строк и объектов || Оглавление || 4.4. Графический инструментарий


Искусство создания компонентов Delphi



Новости за месяц

  • Декабрь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31