Содержание материала

 

Класс TStrings

 

Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков TObject). TStrings — абстрактный класс; он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других. Так что вам чаще всего придется иметь дело с TStrings как со свойством одного из компонентов. В дальнейшем экземпляры этого класса и порожденных от него классов мы-будем называть наборами строк. Для создания собственных наборов строк вне компонентов предназначен потомок TStrings — TStringList, который будет рассмотрен ниже.

 

К строкам и объектам соответственно можно получить доступ через свойства:

 

property Strings[Index: Integer]: string;

 

property Objects[Index: Integer]: TObject;

 

Первое из них является векторным свойством, принимаемым по умолчанию. Общее количество пар в списке равно значению свойства:

 

property Count: Integer;

 

Класс TStrings также предназначен для хранения пар вида 'параметр=значение', например, в файлах инициализации (.INI). Эту возможность реализует следующее свойство:

 

property Values[const Name: string]: string;

 

При обращении к этому свойству для чтения ищется строка, содержащая подстроку (параметр) Name и символ '='. Если она найдена, возвращается то, что находится в этой строке после '='. Если нет, ValuesfName] равно пустой строке. При записи: если строка, содержащая параметр Name, найдена — ее значение после '=' заменяется новым значением, если нет — строка добавляется. Если существующему параметру присваивается пустая строка (Valu-es[Name] := ";), то он удаляется из набора строк.

 

Методы класса

 

procedure BeginUpdate; procedure EndUpdate;        Пара процедур, которые устанавливают и сбрасывают флаг обновления набора. Между ними, для ускорения работы, нужно заключать все операции по копированию, удалению и т. д. большого количества элементов.        

 

procedure Clear;        Осуществляет полную очистку набора.        

 

procedure Insert(Index: Integer; const S: string);        Вставляет строку S под индексом Index.        

 

procedure Delete(Index: Integer);        Удаляет строку с индексом Index.        

 

function IndexOf(const S: string): Integer;        Возвращает индекс (номер в наборе) строки S. Если она не найдена, функция возвращает -1.        

 

function IndexOfObject(AObject: TObject): Integer;        Возвращает индекс объекта в наборе. В случае неудачи возвращает -1.        

 

function Equals(Strings: TStrings): Boolean;        Сравнивает строки вызвавшего его объекта со строками объекта Strings и возвращает True в случае равенства (сравниваются число строк и все строки попарно).        

 

function Add(const S: string): Integer-        Добавляет строку S в конец набора и в случае успеха возвращает присвоенный ей индекс (он должен быть равен значению Count до добавления строки).        

 

function AddObject(const S: string; AObject: TObject): Integer;        Добавляет строку в паре с объектом. Возвращает то же, что и метод Add.        

 

procedure Exchange(Indexl, Index2: Integer);        Меняет местами пары строка+объект с индексами Indexl и Index2.        

 

procedure Move(Curlndex, Newlndex: Integer);        Перемещает пару строка+объект с позиции Curlndex в позицию Newlndex.        

 

procedure InsertObject(Index: Integer; const S: string; AObject: TObject);        Вставляет объект AObject и соответствующую ему строку S в набор под индексом Index.        

 

Шесть методов предназначены для экспорта/импорта наборов строк:

 

а) в поток:

procedure LoadFromStream(Stream: TStream);

procedure SaveToStream(Stream: TStream);

 

б) в файл (создавая поток и вызывая два предыдущих метода):

procedure LoadFrornFile (const FileName: strings-procedure SaveToFile(const FileName: string);

 

в) в данные в формате текстового редактора (подряд расположенные строки, оканчивающиеся парой символов CR/LF (16-ричные коды SOD/SOA)).

 

procedure AddScrings(Strings: TStrings);        Добавляет в конец набора другой набор Strings.        

procedure Assign(Source: TPersistent);        Уничтожает прежнее содержимое набора и подставляет вместо него Source, если источник имеет тип TStrings. В противном случае возникает исключительная ситуация EConvertError.        

 

При этом метод

function GetText: PChar;

выгружает строки в единый массив, где они разделены парами символов CR/LF; в конце такого массива ставится нулевой байт. Размер массива не может превышать 65520 байт; поэтому строки выгружаются до тех пор, пока их суммарная длина не превосходит этого значения.

 

Метод

procedure SetText(Text: PChar);

читает строки из массива Text. Строки в массиве должны быть отделены друг от друга парой символов CR/LF; допускается и один символ LF (16-ричный код $ОА). Символы с кодами 0, $lA(<Ctrl>+<Z>) воспринимаются как конец текста. При этом прежнее содержимое набора уничтожается.

 


Класс TStringlist

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

 

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

 

function Find(const S: string; var Index: Integer): Boolean;        Метод ищет в наборе строку S и в случае успеха возвращает результат True, а в параметре Index — ее индекс.        

 

property Sorted: Boolean;        Свойство — признак отсортированности элементов (сортировка осуществляется через посимвольное сравнение строк). Установка Sort := True вызывает процедуру сортировки, которую можно вызвать и явно при помощи метода:        

 

procedure Sort;        Попытка добавить или вставить элемент в отсортированный список вызывает исключительную ситуацию EListError; в этом случае до выполнения действия свойству Sorted нужно присвоить значение False.        

 

property Duplicates: TDuplicates; TDuplicates = (duplgnore, dupAccept, dupError);        Свойство определяет, что происходит при попытке добавить в список дубликат уже имеющейся строки: duplgnore — добавление игнорируется (отклоняется); dupError — добавление приводит к созданию исключительной ситуации EListError; dupAccept — одинаковые строки разрешены. В этом случае при поиске в неотсортированном списке не определено, которая из строк будет найдена первой.        

 

property OnChange: TNotifyEvent; property OnChanging: TNotifyEvent;        Два свойства, предусмотренные для определения пользователем своей реакции на изменение данных. Событие OnChanging вызывается во многих рассмотренных выше методах до внесения первого изменения, OnChange — после последнего.        

 

 


Как самому определить метод сортировки TStringList

 

Code:

{

Suppose you have a TListBox containing some date values.

If you want to sort the dates by setting the "Sorted"

property to "True" you will see that the dates are not sorted correctly:

 

12.03.2003

13.03.2003

29.01.2003

30.03.2003

 

Now what you can do is to is create a TStringlist, Assign the listbox.Items

property to it, sort the stringlist using CustomSort,

then Assign it back to listbox.items.

}

 

 

function CompareDates(List: TStringList; Index1, Index2: Integer): Integer;

var

  d1, d2: TDateTime;

begin

  d1 := StrToDate(List[Index1]);

  d2 := StrToDate(List[Index2]);

  if d1 < d2 then

    Result := -1

  else if d1 > d2 then Result := 1

  else

    Result := 0;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  sl: TStringList;

begin

  sl := TStringList.Create;

  try

    // listbox1.Sorted := False !

   sl.Assign(listbox1.Items);

    sl.CustomSort(CompareDates);

    listbox1.Items.Assign(sl);

  finally

    sl.Free

  end;

end;

 

end.

 

 

{********************************************************************}

{ To sort Integer values:}

 

function CompareInt(List: TStringList; Index1, Index2: Integer): Integer;

var

  d1, d2: Integer;

  r1, r2: Boolean;

 

  function IsInt(AString : string; var AInteger : Integer): Boolean;

  var

    Code: Integer;

  begin

    Val(AString, AInteger, Code);

    Result := (Code = 0);

  end;

 

begin

  r1 :=  IsInt(List[Index1], d1);

  r2 :=  IsInt(List[Index2], d2);

  Result := ord(r1 or r2);

  if Result <> 0 then

  begin

    if d1 < d2 then

      Result := -1

    else if d1 > d2 then

      Result := 1

    else

     Result := 0;

  end else

   Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2]));

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  sl: TStringList;

begin

  sl := TStringList.Create;

  try

    // listbox1.Sorted := False;

   sl.Assign(listbox1.Items);

    sl.CustomSort(CompareInt);

    listbox1.Items.Assign(sl);

  finally

    sl.Free;

  end;

end;

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить