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

 

Класс 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 : stringvar 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;

 

 

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

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

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

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


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