Правильная ссылка на эту страницу
http://az-design.ru/Support/SoftWare/Delphi/D3/SB25.shtml

Глава 25. TStrings и его производные

В настоящей главе обсуждается класс String и порожденные непосредственно от него классы. Рисунок 25-1 иллюстрирует отношения между TStrings и всей иерархией VCL, в том числе производными классами, которые будут обсуждаться в главе.

TStrings
       Класс TStrings — это абстрактный классовый тип, который не используется непосредственно, однако поддерживает создание производных классов, оперирующих со строковыми данными. Наиболее общим производным от TStrings является TStringsList, который используется для большинства обобщенных строковых операций. В данной главе вначале рассматриваются детали класса TStrings, а затем описываются производные классы TStrings.


РИСУНОК 25-1 Иерархическая диаграмма TStrings и производные классы.

       Хотя класс и называется TStrings, но он сконструирован для выполнения более общего множества операций, нежели простое манипулирование строками. Фактически TStrings не оперирует со строками вообще. Скорее, его работа заключается в действиях с коллекциями строк. В этом смысле TStrings является абстрактным контейнерным классом, и все порожденные от него классы обеспечивают детали реализации, предоставляющие возможность методам, определенным в TStrings, выполнять свою работу. Часто аргумент типа TStrings специфицируется просто для того, чтобы функция могла полиморфически оперировать с различными производными TStrings. Одним из самых интересных и потенциально полезных механизмов TStrings является его способность функционировать в качестве ассоциированного списка или словаря, в котором различные строковые входы действуют в качестве ключевых имен, которые можно задействовать для извлечения любого объекта по его имени.
       Каждый строковый вход в производных классах TStrings способен содержать не только строку, но и ссылку на любой объект Delphi. Данный механизм представляет собой то, что позволяет производным класса TStrings функционировать подобно элементарным символьным таблицам. Такая функциональность часто используется различными элементами управления для обеспечения механизма поддержки рисования владельцем. В данном случае ссылка на объект указывает на битовый образ, подлежащий отрисовке, в сочетании с текстом, который появляется в определенном списке. Наиболее фундаментальным производным классом TStrings является TStringList. Данный класс перекрывает все необходимые виртуальные функции TStrings для того, чтобы реализовать желаемое поведение списка строк, способного хранить объекты. Если потратить некоторое время на глубокое изучение TStrings и TStringList, появятся предпосылки для лучшего понимания некоторых тонких вещей, которые можно выполнить посредством этого полезного семейства классов.
       Вот как выглядят общедоступные объявления класса TStrings. Обратите внимание на большое количество виртуальных функций. Это обстоятельство подсказывает, что большая часть детальной работы будет реализована в производных классах.

TStrings = class(TPersistent)
   . . . 
   . . . 
public
   function  Add(const S: string): Integer; virtual;
   function  AddObject(const S: string; AObject: TObject): Integer; virtual;
   procedure Addstrings(Strings: TStrings); virtual;
   procedure Assign(Sourse: TPersistent); override;
   procedure BeginUpdate;
   procedure Clear; virtual; abstract;
   procedure Delete(Index: Integer); virtual; abstract;
   procedure EndUpdate;
   function  Equals(Strings: TStrings): Boolean;
   procedure Exchange(Index1, Index2: Integer); virtual;
   function  GetText: PChar; virtual;
   function  IndexOf(const S: string): Integer; virtual;
   function  IndexOfName(const Name: string): Integer;
   function  IndexOfObject(AObject: TObject): Integer;
   procedure Insert(Index: Integer; const S: string); virtual; abstract;
   procedure InsertObject(Index: Integer; const S: string; AObject: TObject);
   procedure LoadFromFile(const FileName: string);
   procedure LoadFromStream(Stream: TStream); virtual;
   procedure Move(CurIndex, Newlndex: Integer); virtual;
   procedure SaveToFile(const FileName: string);
   procedure SaveToStream(Stream: TStream); virtual;
   procedure SetText(Text: PChar); virtual;
   property  Capacity: Integer;
   property  CommaText: string;
   property  Count: Integer;
   property  Names[Index: Integer]: string;
   property  Objects[Index: Integer]: TObject;
   property  Values[const Name: string]: string;
   property  Strings[Index: Integer]: string;
   property  Text: string;
end;

В таблице 25-1 перечислены свойства, реализуемые TStrings

Таблица 25-1 Свойства реализуемые TStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить в конец списка новую строку. Нет
AddObject Добавить в конец списка новую строку и объект. Нет
AddStrings Скопировать строки и ссылки на объекты из одного объекта TStrings в конец другого объекта TStrings. Нет
Assign Сделать содержимое одного объекта TStrings равным содержимому другого объекта TStrings. TPersistent
BeginUpdate Указать, что объект TStrings обновляется. Нет
Capacity Указать количество Strings, которое способен содержать объект TStrings, не требуя расширения. Нет
Clear Инициализировать пустое внутреннее состояние. Нет
Count Возвратить размер списка. Нет
Delete Удалить из списка вход по индексу. Нет
EndUpdate Указать, что объект TStrings завершил операцию обновления. Нет
Equals Сравнить два объекта TStrings. Нет
Exchange Поменять местами два входа списка TStrings. Нет
GetText Возвратить все строки, содержащиеся в элементах списка в простом массиве PChar. Нет
IndexOf Возвратить номер элемента списка, совпадающего со строковым аргументом. Нет
IndexOfName Возвратить Index именной части строки, которая записана в виде Name = Value (Имя = Значение). Нет
IndexOfObject Возвратить номер входа элемента списка, совпадающего с аргументом ссылки на объект. Нет
Insert Вставить новую строку в указанную позицию списка. Нет
InsertObject Вставить в указанную позицию списка строку и ссылку на объект. Нет
LoadFromFile Загрузить строковые данные в список из указанного дискового файла. Нет
LoadFromStream Загрузить строковые данные в список из указанного потокового объекта. Нет
Move Переместить элемент списка из одной позиции в другую. Нет
Names Возвратить именную часть строки в позиции списка строк, указанную Index, когда строка записана в форме Name = Value (Имя = Значение). Нет
Objects Возвратить объект в позиции, указанной индексом. Нет
SaveToFile Сохранить в дисковом файле все строковые данные. Нет
SaveToStream Сохранить все строковые данные в указанном потоке. Нет
SetText Указать элементы списка из массива PChar. Нет
Strings Получить доступ к строкам в индексированных позициях. Нет
Text Получить или установить содержимое компонента TStrings. Отдельные элементы разделяются последовательностями символов возврата каретки/прогона строки ( ). Нет
Values Читать или записывать индексированные значения Property. Нет

TComboBoxStrings
       Класс TComboBoxStrings используется всеми управляющими классами, порожденными от TCustomComboBox. Среди них — TComboBox, TDriveComboBox и TDBComboBox. Методы, определенные именно этим производным TStrings, работают в сочетании с элементом управления комбинированным окном Windows для обеспечения функциональности, которую ожидают от любого класса подобного рода. TComboBoxStrings по функциям похож на класс TListBoxStrings за исключением того, что базовый элемент управления Windows является комбинированным окном, а не окном списка.
       В таблице 25-2 перечислены методы, которые реализуются TComboBoxStrings.

Таблица 25-2 Методы, реализуемые TComboBoxStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить элемент к концу списка. TStrings
Clear Удалить из списка все входы. TStrings
Delete Удалить указанный вход. TStrings
Insert Вставить вход в указанную позицию, протолкнув все входы на один вниз TStrings

THeaderStrings
       Класс THeaderStrings определен для использования компонента THeader и соответствует свойству компонента THeader. Другими словами, свойство Sections компонента THeader имеет тип TheaderStrings. Размер и содержимое списка THeaderStrings в большой степени определяют то, что появляется в компоненте THeader, когда он отображается в родительской форме.
       В таблице 25-3 перечислены методы, реализуемые THeaderStrings.

Таблица 25-3 Методы, реализуемые THeaderStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Assign Копировать любой производный объект TStrings в объект THeaderStrings. TStrings
Clear Удалить из списка все входы. TStrings
Create Создать новый экземпляр THeaderStrings и инициализировать список. TObject
Delete Удалить элемент из списка строк. TStrings
Destroy Разрушить экземпляр объекта. TObject
Insert Добавить новый элемент в индексированную позицию TStrings

TIndexFiles


       Класс TIndexFiles используется классом TTable, который необходим для управления базами данных. Поскольку TIndexFiles используется для управления внутренними структурами данных, принадлежащих экземпляру TTable, то маловероятно, что потребуется иметь дело с этим классом непосредственно, если конечно это не связано с разработкой собственной версии или производной от класса TTable.
       В таблице 25-4 перечислены методы, которые реализуются TIndexFile.

Таблица 25-4 Методы, реализуемые TIndexFiles

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить новый IndexFile к списку и открыть его для использования владеющим объектом TTable. TStrings
Clear Закрыть индексные файлы, затем удалить из списка все входы. TStrings
Create Создать новый экземпляр TIndexFiles и инициализировать внутренние структуры TTable, ассоциированные с его использованием. TStrings
Delete Закрыть ассоциированный индексный файл и удалить из списка строк индексированный элемент. TStrings
Insert Вставить в индексированную позицию новый элемент имени файла и открыть его для использования владеющим объектом TTable. TStrings

TListBoxStrings
       Класс TListBoxStrings используется классом TCustomListBox для управления списком элементов, представленного классами, порожденными от TCustomListBox. Это классы TListBox и TFileListBox. Обратите внимание, что каждый из методов данного класса перекрывает виртуальную функцию, определенную в TStrings. Данные функции внутренне сконструированы для такого взаимодействия, чтобы извлекать или запоминать требуемую информацию из соответствующего элемента управления Windows. Это отличается от работы TStringList, который создает и поддерживает требуемую память для списка элементов самостоятельно. В данном случае Delphi полагается на поведение, обеспечиваемое для соответствующей функциональности внутренними механизмами Windows. В таблице 25-5 перечислены методы, реализованные TListBoxStrings.

Таблица 25-5 Методы, реализуемые TListBoxSTrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить элемент в конец списка. TStrings
Clear Удалить из списка все входы. TStrings
Delete Удалить указанный вход. TStrings
Insert Вставить вход в указанную позицию, протолкнув все входы на один вниз. TStrings

TMemoStrings
       Класс TMemoStrings обеспечивает строковый основанный на списке интерфейс для стандартного элемента управления редактированием Windows. Отдельные строки элемента управления редактированием отображаются в индивидуальные элементы в списке строк. Обратите внимание на то, что в определении данного класса нет поддержки хранения и извлечения ссылок на объекты, как это имеет место в классах TListBoxStrings и TComboBoxStrings, поскольку окно редактирования вообще предназначено для хранения только текстовой информации. В таблице 25-6 перечислены методы, реализуемые TMemoStrings.

Таблица 25-6 Методы, реализуемые TMemoStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Clear Удалить из списка все входы. TStrings
Delete Удалить указанный вход. TStrings
Insert Вставить вход в указанную позицию, протолкнув все входы вниз на один. TStrings
LoadFromStream Загрузить текстовое содержимое мемо-окна из объекта TStream. TStrings
SaveToStream Сохранить текстовое содержимое мемо-окна в объекте TStream. TPersistent.

TOutlineStrings
       TOutlineStrings обеспечивает класс памяти для строк, используемый компонентом TOutline. В таблице 25-7 перечислены методы, реализуемые TOutlineStrings.

Таблица 25-7 Методы, реализуемые TOutLineStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить элемент в конец списка. TStrings
Clear Удалить из списка все элементы. TStrings
Delete Удалить из списка указанный элемент. TStrings
GetObject Извлечь объект, содержащийся в элементе индексированного списка. TStrings
Insert Вставить элемент в список. TStrings
PutObject Поместить объект в элемент индексированного списка TOutline. TStrings

TPageAccess
       Класс TPageAccess используется элементом управления Notebook для хранения имен страниц, ассоциированных с содержимым Notebook. В таблице 25-8 перечислены методы, реализуемые TPageAccess.

Таблица 25-8 Методы, реализуемые TPageAccess

Использовать или установить это ... Чтобы сделать это ... Наследование
Clear Удалить из списка все элементы. TStrings
Create Создать новый экземпляр TPageAccess и инициализировать список. TObject
Delete Удалить элемент из списка строк. TStrings
Insert Добавить новый элемент в индексированную позицию. TStrings
Move Переместить элемент из одной позиции в другую в списке строк. TStrings

TRichEditStrings
       Класс TRichEditStrings используется для обеспечения доступа к строкам текста, содержащимся в элементе управления TRichEdit. Соответствующий компонент TRichEditStrings получается из свойства Lines ассоциированного элемента управления TRichEdit. Дополнительная информация, связанная с элементом управления TRichEdit, приведена в таблице 25-9 и в главе 64, "TCustomEdit и его потомки".

Таблица 25-9 Методы, реализуемые TRichEditStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
AddStrings Добавить содержимое другого производного TStrings в объект TRichEditStrings. TStrings
Clear Удалить из списка все строки. TStrings
Delete Удалить из элемента управления списком указанную строку. TStrings
Insert Добавить новую строку в индексированную позицию. TStrings
LoadFromFile Загрузить список из файла. TStrings
LoadFromStream Загрузить список из потока. TStrings
SaveToFile Сохранить список в файле. TStrings
SaveToStream Сохранить список в потоке. TStrings
PlainText Логическое свойство, используемое для определения, содержит ли TRichEditStrings только строки текста (чтение/запись). Нет

TStringGridSTrings
       Класс TStringGridSTrings используется TStringGrid для обеспечения поддержки базового класса памяти для строк, содержащихся в ячейках компонента TStringGrid. Объект TStringGrid обеспечивает свойства индексирования членов Cols и Rows, которые возвращают ссылки на объекты типа TStringGridSTrings. Используя подобную технологию, можно получить список строк, представляющий как строки, так и колонки компонента TStringGrid, и манипулировать содержимым как и у любого другого потомка TStrings.
       В таблице 25-10 перечислены методы, реализуемые TStringGridSTrings.

Таблица 25-10 Методы, реализуемые TStringGridStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Assign Копировать содержимое одного типа производного TStrings в массив TStringGridSTrings. TStrings
Create Создать новый экземпляр типа TStringGridSTrings. TObject

TStringList
       Класс TStringList является наиболее обобщенным производным классом TStrings и обеспечивает богатую коллекцию операций для обобщенного управления содержимым. Многие его функции перекрывают абстрактные виртуальные методы, определенные в классе TStrings. TStringList должен использоваться при необходимости осуществлять управление списками строк или ассоциациями строка/объект независимо от любых других компонентов или элементов управления.
       В таблице 25-11 перечислены методы и обработчики событий, которые реализованы TStringList.

Таблица 25-11 Методы, свойства и обработчики событий, реализуемые TStringList

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Условно добавить новую строку в конец списка (см. Duplicates). TStrings
Clear Удалить из списка все элементы. TStrings
Create Создать новый объект TStringList (конструктор класса). TObject
Delete Удалить вход в позиции и разрушить хранимую там строку. TStrings
Destroy Разрушить объект TStringList (деструктор класса). TObject
Duplicates Указать, как список будет обрабатывать дублированные входы. TStrings
Exchange Переставить два члена списка. TStrings
Find Возвратить индекс указанной строки в списке, если она найдена. (Используется для от сортированных списков). Нет
IndexOf Возвратить индекс указанной строки в списке. TStrings
Insert Вставить в указанную позицию новый строковый элемент, сдвинув все остальные элементы вниз. TStrings
OnChange Выполняется после проведения изменений в списке. TStrings
OnChanging Выполняется как только в списке начинаются изменения. TStrings
Sort Сортировать список, используя алгоритм Quicksort. Нет
Sorted Выяснить, отсортирован ли список. Нет

TSubItems
       Класс TSubItems предоставляет доступ к строкам, которые появляются как подэлементы элементов списка в элементе управления List View, инкапсулированном в компоненте TListView. Обратитесь к обсуждению компонента TListView в главе 58, "TCustomListView и TListView", чтобы получить лучшее представление о том, когда используется TSubltems. Для добавления нового элемента применяйте метод Add из TSubItems. TSubItems видим только тогда, когда свойство ViewStyle владеющего компонента TListView установлено в vsReport. В таблице 25-15 перечислены свойства, реализуемые TSubItems.

Таблица 25-12 Свойства, реализуемые TSubItems

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить в конец списка новую строку. TStrings
Create Создать новый экземпляр типа TSubItems. TStrings
Insert Вставить в указанную позицию новый строковый элемент, протолкнув все остальные элементы вниз. TStrings
Handle Получить дескриптор соответствующего объекта Win95. Нет
Owner Получить ссылку на TListItem, который владеет списком строк TSubItems. Нет

TTabPageAccess
       Объект TTabPageAccess используется с целью поддержки списка TTabPages для компонента TPageControl (TTabbedNotebook в Delphi 1.0). Соответствующий объект TTabPageAccess получается посредством свойства Pages владеющего компонента TPageControl. Данный список строк представляет отдельные страницы TPageControl. За более подробной информацией обратитесь к описанию компонента TPageControl в главу 59, "TCustomTabControl и его производные". В таблице 25-13 перечислены свойства, реализуемые TTabPageAccess.

Таблица 25-13 Свойства, реализуемые TTabPageAccess

Использовать или установить это ... Чтобы сделать это ... Наследование
Clear Удалить все содержимое списка. TStrings
Create Создать новый экземпляр типа TTabPageAccess. TObject
Delete Удалить из списка индексированный элемент. TStrings
GetPageAt Получить ссылку на TTabPage, который владеет списком строк TTabPageAccess. Нет
Insert Вставить новый строковый элемент в указанную позицию, протолкнув вниз остальные элементы. TStrings
Move Переместить элемент из одной позиции списка в другую. TStrings

TTabStrings
       Класс TTabStrings определяет класс списка строк, внутренне используемый классами TCustomTabControl и TTabControl для управления информацией вкладки. Для дополнительной информации о TCustomTabControl и TTabControl обратитесь к главе 59. В таблице 25-14 перечислены методы, реализуемые TTabStrings.

Таблица 25-14 Методы, реализуемые TTabStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Clear Удалить из списка все содержимое. TStrings
Delete Удалить из списка индексированный элемент. TStrings
Insert Вставить в указанную позицию новый строковый элемент. TStrings

TTreeStrings
       Класс TTreeStrings используется для поддержки списка строк, управляемого классом TCustomTreeView и его производными. Маловероятно, что вам придется взаимодействовать с TTreeStrings непосредственно. Скорее всего вы будете использовать методы, обеспечиваемые классом TCustomTreeView и его производными. За дополнительной информацией, связанной с классом TCustomTreeView и его производными, обратитесь к главе 60, "TCustomTreeView и TTreeView".
       В таблице 25-15 перечислены методы, которые реализованы TTreeStrings.

Таблица 25-15 Методы, свойства и события, реализуемые TTreeStrings

Использовать или установить это ... Чтобы сделать это ... Наследование
Add Добавить новую строку к списку TTreeStrings. TStrings
Clear Удалить из списка все содержимое. TStrings
Create Создать новый экземпляр типа TTreeStrings, передавая TTreeNodes в качестве Owner. TObject
Delete Удалить из списка индексированный элемент. TStrings
Insert Вставить в указанную позицию новый строковый элемент, протолкнув остальные входы вниз. TStrings
Owner Получить ссылку на TTreeNodes, который владеет списком арок TTreeStrings. Нет

Метод Add
Метод AddObject
Метод AddStrings
Метод Assign
Метод BeginUpdate
Свойство Capacity
Метод Clear
Свойство CommaText
Свойство Count
Метод Create
Метод Delete
Метод Destroy
Свойство Duplicates
Метод EndUpdate
Метод Exchange
Метод Find
Метод GetObject
Метод GetPageAt
Свойство Handle
Метод IndexOf
Метод IndexOfName
Метод IndexOfObject
Метод Insert
Метод InsertObject
Метод LoadFromFile
Метод LoadFromStream
Метод Move
Свойство Names
Свойство Objects
Событие OnChange
Событие OnChanging
Свойство Owner
Свойство PlainText
Метод PutObject
Метод SaveToFile
Метод SaveToStream
Метод SetText
Метод Sort
Свойство Sorted
Свойство Strings
Свойство Text
Свойство Values

Пример проекта
       В следующем примере проекта будет исследовано применение объекта TStringList и других производных TStrings, чтобы улучшить понимание, как работают различные части строковых классов. Между различными производными типов строковых классов имеется много общего. Такое сходство обусловлено тем, что упомянутые классы имеют общий родительский класс TStrings. Таким образом, за исключением специального поведения, определенного перекрывающими методами, большая часть методов TStrings применима ко всем классам сходным образом, и после овладения общей частью класса TStrings легко разобраться в производных классах. Еще более важно то, что большинство перекрывающих функций написано таким образом, чтобы обеспечить более или менее функциональную эквивалентность между различными производными класса TStrings. При этом следует помнить о том, что любые компоненты, которые используют строковую информацию как часть изображения, поддерживают свои строковые значения в классах, произведенных от класса TStrings. Следовательно при разработке совершенно нового пользовательского элемента управления можно ознакомиться с реализацией некоторых стандартных элементов управления Delphi, чтобы получить ощущение способов взаимодействия элементов управления и строковых классов. В следующем примере разрабатывается новый класс, порожденный от TStringList. Если вы помните, то класс TStringList реализует метод сортировки, но сортирует всегда по возрастанию. В примере к новому классу добавляется метод, обеспечивающий возможность выполнения сортировки по убыванию. Затем новый класс используется для реализации простой программы, предоставляющей возможность открыть текстовый файл для просмотра, выполнить необязательную сортировку и сохранить файл.
       Форма содержит элемент управления Memo и несколько кнопок, управляющих операциями сортировки. Соответствующий модуль кода, реализующий программу, показан ниже:

unit Fview;
interface
uses
   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
   Forms, Dialogs, StdCtrls, Menus; 
type TForml = class(TForm)
   Bevel1: TBeve1;
   Memo1: TMemo;
   MainMenul: TMainMenu;
   Filel: TMenuItem;
   Openl: TMenuItem;
   N1: TMenuItem;
   Save1: TMenuItern;
   SaveAs1: TMenuItem;
   N2: TMenuItem;
   Exit1: TMenuItem;
   Panel1: TPanel;
   Button1: TButton;
   RadioButtonl: TRadioButton;
   RadioButton2: TRadioButton;
   OpenDialogl: TOpenDialog;
   SaveDialogl: TSaveDialog;
   procedure OpenlClick(Sender: TObject);
   procedure SavelClick(Sender: TObject);
   procedure SaveAslClick(Sender: TObject);
   procedure RadioButtonlClick(Sender: TObject);
   procedure RadioButton2Click(Sender: TObject);
   procedure ButtonlClick(Sender: TObject);
   procedure FormCreate(Sender: TObject); 
   procedure ExitlClick(Sender: TObject);

private
{ Private declarations }
   sortMode: boolean;   { true для сортировки по возрастанию, a false - по убыванию } 
public
{ Public declarations } 
end;
{ Новый класс StringList, поддерживающий сортировку как по возрастанию, так и по убыванию }

TNewStringList = class(TStringList)
public
   procedure Sortup;   { метод, реализующий сортировку по возрастанию }
   procedure Sortdn;   { метод, реализующий сортировку по убыванию }
   procedure Reverse;  { метод, обеспечивающий изменение порядка строк в списке }
end;
var
   Forml: TForml;
implementation
{$R *.DFM}
procedure TForml.OpenlClick(Sender: TObject);
begin
{ вызвать стандартный OpenDialog для получения требуемого файла }
   if OpenDialogl.Execute then begin
      Memo1.Lines.LoadFromFile(OpenDialogl.FileName);
  { Загрузить мемо из файла }
      SaveDialog1.FileName := OpenDialogl.FileName;
   { Определить имя файла для сохранения }
      Caption := OpenDialogl.FileName;
{ Установить заголовок формы }
    end;

end;
procedure TForm1.Save1Click(Sender: TObject);
begin
   Memo1.Lines.SaveToFile(SaveDialogl.FileName);
       { Сохранить мемо в файл }
end;
procedure TForm1.SaveAs1Click(Sender: TObject);
Begin
  if SaveDialogl.Execute then   { Разрешить пользователю выбрать имя файла для сохранения } 
    begin
       Memo1.Lines.SaveToFile(SaveDialogl.FileName); { Сохранить в файл с новым именем }
       Caption := SaveDialogl.FileName;              { Установить новый заголовок формы }
       OpenDialogl.FileName := Caption;              { Установить новое имя в OpenDialog }
    end;
end;
{ определение функций и процедур для нового класса строк }

procedure TNewStringList.Sortup;
begin
   Sorted := true;  { просто установить свойство Sorted из TStringList }
end;
procedure TNewStringList.Sortdn;
begin
   Sorted := true;  { установить свойство Sorted для сортировки по возрастанию }
   Reverse;         { и затем вызвать Reverse для изменения порядка следования строк в списке }
end;
procedure TNewStringList.Reverse;
var
   i: integer;
   lc: integer;
begin
  lc := Count div 2;    { это количество перестановок, которые необходимо выполнить }
  for i := 0 to lc - 1 do
     begin
        exchange(i, Count - 1 - i);   {ну это совсем просто  }
     end;
end;
procedure TForm1.RadioButtonlClick(Sender: TObject);
begin
   sortMode := true;     { записать изменение в sortMode }
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
   sortMode := false;     { записать изменение в sortMode }
end;
procedure TForml.ButtonlClick(Sender: TObject);
var
   ts: TNewStringLis t;
begin
   if sortMode = true then begin
      ts := TNewStringList.Create; { создать новый экземпляр списка строк }
      ts.assign(Memol.Lines);      { скопировать содержимое мемо в список строк }
      ts.Sortup;                   { сортировать по возрастанию }
      Memo1.Lines.Assign(ts);      { присвоить результаты сортировки в мемо }
      ts.free;                     { разрушить рабочий объект }
   end else begin
      ts := TNewStringList.Create;
      ts.assign(Memol.Lines);
      ts.Sortdn;    { данный вызов - это единственное отличие сортировки по убыванию }
      Memo1.Lines.Assign(ts);
      ts.free;
   end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ соответствующим образом проинициализировать }
   RadioButton1.Checked := true;
   RadioButton1Click(Sender);    { установить начальное состояние в сортировку по возрастанию }
end;
procedure TForm1.ExitlClick(Sender: TObject);
begin
   halt; { завершить программу }
end;
end.

       Первое, что интересно заметить, — это объявление нового классового типа TNewStringList. Данный новый класс наследует все поведение класса TStringList и добавляет три новых процедуры. Процедуры называются Sort up, Sortdn и Reverse. Процедура Sortup просто устанавливает свойство Sorted в True, что, как вы помните, автоматически приводит к вызову метода Sort для списка. Процедура Sortdn делает в своем начале то же самое для получения содержимого в возрастающем порядке, а затем вызывает процедуру Reverse с целью изменения порядка на обратный. Reverse работает, используя метод класса TStringList для обмена входов в списке. Метод TForm1.ButtonClick выполняет желаемую операцию сортировки путем исследования глобальной переменной формы с именем sortMode, которая при создании формы устанавливается в True и модифицируется всякий раз при нажатии одного из переключателей. Входы меню Open и Save выполняют свои операции посредством встроенных диалогов Delphi и затем используют строковые методы для загрузки или сохранения в выбранный файл. Поскольку данная программа создавалась как утилита сортировки, окно мемо программируется только на чтение так, чтобы единственные возможные изменения оказались результатами операции сортировки. За более подробными сведениями можно обратиться к листингу программы.

уже скачали 218 раз.


<<< Пред. Оглавление
Начало раздела
След. >>>




Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:56 MSK


Постоянный адрес статьи:
http://az-design.ru/Support/SoftWare/Delphi/D3/SB25.shtml