Классы TStrings и TStringList
КлассTStrings происходит от классаTPersistent. TStrings = class(TPersistent)
КлассTStrings является абстрактным, он инкапсулирует поля и методы для работы с наборами строк. От него порождены многочисленные специализированные потомки, обслуживающие наборы строк в таких компонентах какTCoaboBox, TListBox, TRichEdit и др. Эти классы (TComboBoxStrings, TListBoxStrings, TRichEditStrings и др.) объявляются в разделеimplementation соответствующих модулей (StdCtrls, ComCtrls и др.) и поэтому скрыты от броузера Delphi и не включены в справочную службу. Единственным доступным наследником класса TStrings является классTStringList - полнофункциональный класс общего назначения для работы с набором строк.
Особенностью классаTStrings и его потомков является то, что элементами наборов служат пары строка-объект, в которых строка - собственно строка символов, а объект - объект любого класса Delphi. Такая двойственность позволяет хранить вTStrings объекты с их описаниями, сортировать объекты, и т.д. Кроме того, в качестве объекта может также выступать потомок от TStrings, что позволяет создавать многомерные наборы строк. Основные свойства классаTStrings представлены в табл. 5.6.
Таблица 5.6
Свойства | Описание | ||
property Capacity: Integer read GetCapacity write SetCapacity; | Текущая емкость набора строк. Всегда большеCount. | ||
property CommaText: string read GetCommaText write SetCommaText; | Служит для установки и получения всего набора строк в вгде единой строки с кавычками и запятыми | ||
property Count: Integer read GetCount; | Текущее количество строк в наборе. | ||
property Names[Index: Integer]: string read GetName; | Дя$ строки с индексомIndex возвращает частьКате, если это строкаName=Value,в «ротивном случае возвращает пустую строку. | ||
property Objects[Index: Integer]: TObject read GetObject write PutObject; | Отсрывает доступ к объекту, связанному со строкой с индексомIndex | ||
property Values(const Name: string]: string read GetValue write SetValue; | По частиName отыскивает в наборе и возвращает частьValue для строк вида Nane=Value | ||
property Strings[Index: Integer]: string read Get write Put; default; | Открывает доступ к строке с индексом Index | ||
property Text: string read GetTextStr write SetTextStr; | Интерпретирует набор строк в виде одной длинной строки с разделителями EOLN мехду отдельными строками набора. | ||
property StringsAdaptes: IstringsAdapter read FAdapter write SetStringsAdapter; | Это свойство используется при разработке компонентов, отвечающих стандарту ActiveX. | ||
Технически классTStrings реалшуется в виде динамического массива указателей. СвойствоCapacity показывает текущую длину этого массива, свойствоCount - количество элементов, занятых в нем. Если при добавлении очередного элементаCount становится равнымCapacity, происходит автоматическое расширение массива на 15 элементов. Основные методы классаTStrings представлены в табл. 5.7. Таблица 5.7 | |||
Свойство | Описание | ||
function Add(const S: string): Integer; virtual; | Добавляет строку в набор данных и возвращает ее индекс. | ||
procedure Append(const S: string); | Добавляет строку в набор данных | ||
function AddObject(const S: string; AObject: TObject): Integer; virtual; | Добавляет строку и объект в набор данных | ||
procedure AddStriags(Strings: TStrings); virtual; | Добавляет к текущему новый набор строк | ||
procec .ire Assign(Source: TPersistent); override; i. | Удаляет прежний набор строк и загружает из параметраSource новый набор. В случае неудачи возникает исключение EConvertErrог | ||
procedure BeginUpdate; | Устанавливает флаг начала обновлений. До вызоваEndOpdate блокируется сортировка строк, что ускоряет процесс многократного изменения данных. |
procedure Clear; virtual; abstract; | Очищает набор данных и освобождает связанную с ним память. |
procedure Delete(Index: Integer); virtual; abstract; | Удаляет элемент набора с индексом Index и освобождает связанную с ним память. |
procedure EndOpdate; | Сбрасывает флаг изменения и при необходимости сортирует строки |
function Equals(Strings: TStrings): Boolean; | Сравнивает построчно текущий набор данных с набором Strings и возвращает true, если наборы равны |
procedure Exchange(Indexl, Index2: Integer); virtual; | Меняет местами элементы с индексами IndexlиIndex2 |
function GetText: PChar; virtual; | Загружает строки из единого массива, в котором они разделены EOLN |
function IndexOf(const S: string): Integer; virtual; | Для строки S возвращает ее индекс, или -1 если строки нет |
function IndexOfName(const Name: string): Integer; virtual; | Возвращает индекс первой строки вида Name=Value в которой частьМатесовпадает с параметром. |
function IndexOfObject(AObject: TObject): Integer; virtual; | Для объекта AObject возвращает индекс строки, или -1, если такого объекта в наборе нет |
procedure Insert(Index: Integer; const S: string); virtual; abstract; | Вставляет строку в набор и присваивает ей индексIndex. |
procedure InsertObject(Index: Integer; const S: string; AObject: TObject); virtual; | Вставляет строку и объект в набор и присваивает им индексIndex. |
procedure LoadFromFile(const FileName: string); virtual; • | Загружает набор из файла |
procedure LoadFromS trearn (Stream: TStream); virtual; | Загружает набор из потока |
procedure Move(CurIndex, Newlndex: Integer); virtual; | Перемещает строку из положения Cur Index в положениеNewlndex |
procedure SaveToFile(const FileName: string); virtual; | Сохраняет набор в файле |
procedure SaveToStream(Stream: TStream); virtual; | Сохраняет набор в потоке |
procedure SetText(Text: PChar); virtual; | Выгружает строки в единый массив, в котором они отделяются друг от друга признаком EOLN. |
МетодыAdd, Append, Insert, Clear и т.п. - абстрактные, то есть они объявлены в классеTStrings, и таким образом определены во всех потомках. Но каждый потомок самостоятельно реализует то, как располагаются в памяти объекты и строки. В то же время наличие, например, метода Assign позволяет с его помощью копировать наборы данных из одного потомка классаTStrings в другой.
КлассTStringListКлассTStringList происходит от классаTStrings и является уже не абстрактным, а полнофункциональным классом общего назначения для работы с наборами строк. Для этого в нем перекрыты все абстрактные методы класса TStrings, а кроме этого добавлены свойства и методы, перечисленные в табл. 5.8.
Таблица 5.8
Новые свойства и методы | Описание |
property Duplicates: TDuplieates read FDuplicates write FDuplicates; | Управление возможностью размещения в наборе двух и более идентичных строк |
property Sorted: Boolean read FSorted write SetSorted; | Признак необходимости сортировки строк в алфавитном порядке |
property OnChange: TNotifyEvent read FQnChange write FOnChange; | Определяет реакцию на изменение набора строк. Возникает после последнего изменения. |
property OnChanging: TNotifyEvent read FOaChanging write FOnChanging; | Определяет реакцию на изменение набора строк. Возникает до очередного изменения. |
property CaseSensitive: Boolean read FCaseSensitive write SetCaseSen3itive; | Определяет, учитывается ли регистр при сортировке строк |
function Find(const S: string; var Index: Integer): Boolean; virtual; | Ищет в наборе строку S и в случае успеха в параметре Index сообщает ее индекс. |
Тип свойстваDuplicates определяется как TDuplieates = (duplgnore, dupAecept, dupError); duplgnore - идентичная строка отвергается, программе ничего об этом не сообщается.
dupError - в случае идентичных строк возбуждается исключение dupAecept - идентичность строк при сортировке игнорируется