Шаг 23.
Класс TStringList

    На этом шаге мы рассмотрим свойства, методы и события класса TStringList.

    Этот класс объединяет в себе свойства TStrings и TList простейшим способом: указатель на объект и соответствующая строка объединяются в запись, указатель на которую хранится в списке. В классе переопределены многие виртуальные методы TStrings: Add, Clear, Delete, Exchange, IndexOf, Insert. Он является полностью функциональным: можно создавать экземпляры TStringList в своей программе для работы с наборами строк и объектов (помимо тех, которые уже есть в компонентах).

    Перечислим новые возможности этого класса:

    Кроме унаследованных от TStrings, определены дополнительно следующие полезные свойства.

  1. property Sorted: Boolean; - указывает, должны ли строки в списках автоматически сортироваться по алфавиту.
  2. property Duplicates: TDuplicates;
    TDuplicates = (dupIgnore, dupAccept, dupError);
    - свойство определяет, что происходит при попытке добавить в список дубликат уже имеющейся строки:
    1. dupIgnore - добавление игнорируется (отклоняется);
    2. dupError - добавление приводит к созданию исключительной ситуации EListEiror;
    3. dupAccept - одинаковые строки разрешены. В этом случае при поиске в не отсортированном списке не определено, которая из строк будет найдена первой.
  3. property OnChange: TNotifyEvent;
    property OnChanging: TNotifyEvent;
    - два свойства, предусмотренные для определения пользователем своей реакции на изменение данных. Событие OnChanging вызывается во многих рассмотренных выше методах до внесения первого изменения, OnChange - после последнего.

    Кроме унаследованных от TStrings, определены дополнительно полезные методы.

  1. function Find (const S: string; var Index; Integer): Boolean; - метод ищет в наборе строку S и в случае успеха возвращает результат True, а в параметре Index - ее индекс.
  2. procedure Sort; - метод осуществляет сортировку списка. Попытка добавить или вставить элемент в отсортированный список вызывает исключительную ситуацию EListError. В этом случае до выполнения добавления свойству Sorted нужно присвоить значение False.

    Приведем пример приложения, где используются компоненты класса TStringList. Внешний вид приложения показан на рисунке 1:


Рис.1. Внешний вид приложения

    На форме расположен компонент TMemo, который используется для отображения списка. Компонент TEdit предназначен для размещения строки, которая затем добавляется в список. Обратите внимание, что после сортировки списка, его необходимо снова отобразить в компоненте TMemo.

    Приведем тексты обработчиков событий:

Unit Un_23_1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  List: TStringList; //Указатель на список.

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  List:=TStringList.Create; //Создание списка.
end;

//Обработчик события добавления строки в список.
procedure TForm1.Button1Click(Sender: TObject);
begin
   List.Append(Edit1.Text); //Добавление строки в список.
   Edit1.Text:=''; //Очистка строки.
   Edit1.SetFocus; //Передача фокуса.
end;

//Обработчик события заполнения компонента TMemo.
procedure TForm1.Button2Click(Sender: TObject);
var
  k: Integer;
begin
   Memo1.Lines.Clear; //Очистка TMemo.
   for k:=0 to List.Count-1 do
     Memo1.Lines.Add(List.Strings[k]);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   Edit1.SetFocus; //Передача фокуса.
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   List.Free; //Уничтожение списка.
end;

//Поиск заданной строки в списке.
procedure TForm1.Button3Click(Sender: TObject);
var
  Index: Integer;
begin
  if List.Find(Edit1.Text, Index) Then //Есть такая строка.
     Label3.Caption:=' '+IntToStr(Index)
  else //Неуспешный поиск.
     Label3.Caption:=' Такой строки нет!!!';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
    List.Sort; //Сортировка списка.
end;

end.

    Текст этого примера можно взять здесь.

    На следующем шаге мы рассмотрим состав класса TStream.




Предыдущий шаг Содержание Следующий шаг