- •Средства визуального программирования
- •090105 «Комплексное обеспечение информационной безопасности
- •Ставрополь, 2010 Содержание
- •Введение
- •Задачи дисциплины – дать основы:
- •В результате изучения дисциплины студенты должны
- •1.1. Версия 1
- •1.2. Версия 2
- •1.3. Версия 3
- •1.4. Версия 4
- •1.5. Версия 5
- •1.6. Версия 6
- •2.1. Главное окно
- •2.2. Окно формы
- •2.3. Окно дерева объектов
- •2.4. Окно инспектора объектов
- •2.5. Окно кода программы
- •3.1. Пустая форма и ее модификация
- •3.2. Размещение нового компонента
- •3.3. Реакция на события
- •3.4. Некоторые итоги
- •4.1. Страница standard
- •4.2. Страница additional
- •4.3. Страница win32
- •4.4. Страница system
- •4.5. Страница dialogs
- •4.6. Страница win31
- •4.7. Страница samples
- •4.8. Компоненты для работы с базами данных
- •4.9. Компоненты для доступа к интернет
- •4.10. Доступ к серверам автоматизации
- •5.1. Учебная программа
- •5.2. Структура программ delphi
- •5.3. Типы
- •5.4. Операторы языка
- •5.5. Массивы
- •5.6. Процедуры и функции
- •6.1. Алфавит
- •6.2. Идентификаторы
- •6.3. Константы
- •6.4. Выражения
- •6.5. Операции
- •7.1. Простые типы
- •7.2. Структурированные типы
- •7.3. Строки
- •7.4. Указатели и динамическая память
- •7.5. Псевдонимы типов
- •8.1. Локализация имен
- •8.2. Описание подпрограммы
- •8.3. Параметры-массивы и параметры-строки
- •8.4. Процедурные типы
- •8.5. Рекурсия и опережающее описание
- •9.1. Основные понятия
- •9.2. Составляющие класса
- •9.3. Объявление класса
- •9.4. Интерфейсы
- •10.1. Основные свойства варианта
- •10.2. Преобразование вариантов к данным других типов
- •10.3. Подпрограммы для работы с вариантами
- •10.4. Вариантные массивы
- •10.5. Пользовательские варианты
- •11.1. Доступ к файлам
- •11.2. Процедуры и функции для работы с файлами
- •11.3. Текстовые файлы
- •11.4. Типизированные файлы
- •11.5. Нетипизированные файлы
- •11.6. Средства windows для работы с файлами
- •11.7. Отображение файлов в память
- •11.7.1. Создание/открытие файла
- •11.8. Объектная модель работы с файлами
- •12.1. Структура модулей
- •12.2. Заголовок модуля и связь модулей друг с другом
- •12.3. Интерфейсная часть
- •12.4. Исполняемая часть
- •12.5. Инициирующая и завершающая части
- •12.6. Доступ к объявленным в модуле объектам
- •12.7. Типы модулей в delphi
- •13.1. Назначение
- •13.2. Реализация
- •13.3. Пример
- •13.4. Использование
- •13.5. Включение в библиотеку форм
- •15.1. Константы простых типов и типа string
- •15.2. Константы-массивы
- •15.3. Константы-записи
- •15.4. Константы-множества
- •15.5. Константы-указатели
- •15.6. Инициация переменных
- •16.1. Класс exception - обработка исключений
- •16.2. Класс tlist - списки
- •16.3. Классы tstrings и tstringlist -наборы строк и объектов
- •16.4. Графический инструментарий
- •Список используемой литературы
16.3. Классы tstrings и tstringlist -наборы строк и объектов
16.3.1. TStrings
Абстрактный класс TStrings инкапсулирует поля и методы для работы с наборами строк. От него порождены многочисленные специализированные потомки, обслуживающие наборы строк в таких компонентах, как TComboBox, TListBox, TRichEdit и др. Эти классы
(TComboBoxStrings, TListBoxStrings, TRichEditStrings и др.) объявляются в разделах Implementation соответствующих модулей (Stdctris, Сomctris и др.) и поэтому скрыты от браузера Delphi и не включены в Help-службу. Единственным доступным наследником TStrings является TStringList - полнофункциональный класс общего назначения.
Замечательной особенностью TStrings и его потомков является то обстоятельство, что элементами наборов служат пары строка-объект, в которых строка - собственно строка символов, а объект -объект любого класса Delphi. Такая двойственность позволяет сохранять в TStrings объекты с текстовыми примечаниями, сортировать объекты, отыскивать нужный объект по его описанию и т. д. Кроме того, в качестве объекта может использоваться потомок от TStrings, что позволяет создавать многомерные наборы строк.
Свойства класса:
property Capacity: Integer; |
Текущая емкость набора строк |
property CommaText: String; |
Служит для установки или получения всего набора строк в виде единой строки с кавычками и запятыми (см. ниже пояснения) Текущее количество строк в наборе. |
property Count: Integer; |
Интерпретирует все строки списка в виде одной длинной строки |
property DelimitedText: String; |
Каждая строка окружается символами QuoteChar и отделяется от соседней символом Delimiter |
property Delimiter: Char; |
Символ для выделения строк в свойстве DelimitedText |
property Names[Index: Integer] : String; |
Для строки с индексом Index возвращает часть Name, если это строка вида Name=Value, в противном случае возвращает пустую строку |
property Objects[Index: Integer] : TObject; |
Открывает доступ к объекту, связанному со строкой с индексом Index |
property QuoteChar: Char; |
Символ для разделения строк в свойстве DelimitedText |
property Strings[Index: Integer] : String; |
Открывает доступ к строке с индексом Index |
property StringsAdapter: TStringsAdapter; |
Это свойство используется только при разработке компонентов, отвечающих стандарту Act iv |
property Text: String; |
Интерпретирует набор строк в виде одной длинной строки с разделителями eoln между отдельными строками набо |
property Values[const Name: String]: String; |
По части Name отыскивает в наборе и возвращает часть Value для строк вида Name=Valu |
Набор строк технически реализуется подобно TList - в виде массива указателей. Свойство Capacity показывает текущую длину этого массива, а свойство count - количество элементов, занятых в нем. Если при добавлении очередного элемента capacity окажется меньше count, происходит автоматическое расширение массива. При этом в динамической памяти резервируется место для размещения Capacity + 16 указателей, в новый массив переписывается содержимое старого массива, после чего старый массив уничтожается. Если вам известно количество элементов в создаваемом наборе строк, имеет смысл заранее нужным образом установить свойство capacity, чтобы сократить непроизводительные расходы на многократные расширения массива указателей.
Свойство commaText интерпретирует содержимое набора строк в виде одной длинной строки с элементами вида "первая строка", "вторая строка", "третья строка" и т. д. (каждая строка набора заключается в двойные кавычки и отделяется от соседней строки запятой; если в строке встречается символ “"”, он удваивается). Свойство Text интерпретирует содержимое набора в виде одной длинной строки с элементами, разделенными стандартным признаком eoln (#13#10).
Свойства Names И Values обрабатывают строки вида Name=Value.
Такие строки широко используются в различных файлах инициации, например, в файле win. ini. Методы класса:
function Add(const S: String) : Integer; function AddObject(const S:String; aObject: TObject):Integer; |
Добавляет строку в набор данных и возвращает ее индекс добавляет строку и объект в набор данных |
procedure AddStrings( Strings: TStrings); |
Добавляет к текущему набору новый набор строк |
procedure Append(const S:String) ; |
То же, что Add, но не возвращает индекс вставленной строки |
procedure Assign(Source: TPersistent) ;
|
Уничтожает прежний набор строк и загружает из Source новый набор. В случае не удачи возникает исключение EсоnvertError |
procedure BeginUpdate; |
Устанавливает флаг начала обновления. До вызова EndUpdate блокируется сортировка строк, что ускоряет процесс много кратного изменения данных |
procedure Clear; |
Очищает набор данных и освобождает связанную с ним память |
procedure Delete(Index: Integer) ;
|
Уничтожает элемент набора с индексом Index и освобождает связанную с ним память |
procedure EndUpdate; |
Сбрасывает флаг изменения и при необходимости сортирует строки |
function Equals(Strings:TStrings): Boolean; |
Сравнивает построчно текущий набор данных с набором Strings и возвращает True, если наборы идентичны |
procedure Exchange(Indexl, Index3: Integers;
|
Меняет местами строки с индексами Index1 и Index2. Если объект сортируется, вызывает исключение EstringListError |
function GetObject(Index:Integer): TObject; virtual; |
Возвращает объект, связанный со строкой Index |
function GetText: PChar;
|
Загружает строки из единого массива, в котором они отделяются друг от друга признаком EOLN |
function IndexOf(const S: String): Integer; |
Для строки S возвращает ее индекс или -1, если такой строки в наборе нет |
function IndexOfName(const Name: String): Integer; |
Возвращает индекс первой строки вида Name=Value, в которой часть Name совпадает с параметром обращения |
function IndexOfObject (aObject: TObject): Integer; |
Для объекта aObj ect возвращает индекс строки или -1, если такого объекта в наборе нет |
procedure Insert(Index: In teger; const S: Strings; |
Вставляет строку в набор и присваивает ей индекс Index |
procedure InsertObject (Index: Integer; const S: String; aObject: TObject) |
Вставляет строку и объект в набор и присваивает им индекс Index |
procedure LoadFromFile (const FileName: Strings; |
Загружает набор из файла
|
procedure LoadFromStream (Stream: TStream) ; |
Загружает набор из потока
|
procedure Move(Curlndex, Nwlndex: Integers; |
Перемещает строку из положения Curlndex в положение Newlndex |
procedure SaveToFile(const FileName: Strings; |
Сохраняет набор в файле
|
procedure SaveToStream (Stream: TStream) ; |
Сохраняет набор в потоке |
procedure SetText(Text: PChar); |
Выгружает строки в единый массив, в ко тором они отделяются друг от друга при знаком EOLN |
Методы Add, Append, Insert, Clear И Т. П. В классе TStrings - абстрактные. Связано это с тем, что класс инкапсулирует их и таким
образом делает доступными во всех потомках, но он при этом не накладывает никаких ограничений на то, как располагаются в памяти строки и объекты. Каждый потомок решает эту задачу наиболее удобным для него способом. Например, потомок TStringList располагает строки и объекты в общей динамической памяти, для чего перекрывает все абстрактные методы своего родителя. Замечу, что? если вы создадите экземпляр класса TStrings с помощью его конструктора Create, компилятор предупредит вас о том, что этот экземпляр содержит абстрактные методы, так что пользоваться им нужно лишь в исключительных случаях.
16.3.2. TStringList
TStringList представляет собой полнофункциональный класс общего назначения и является прямым потомкам TStrings. Помимо перекрытых абстрактных методов своего родителя класс включает в себя такие дополнительные методы и свойства:
property Duplicates: TDu-plicates; |
Свойство, позволяющее управлять возможностью размещения в наборе двух и более идентичных строк |
property Sorted: Boolean; |
Признак необходимости сортировки строк в алфавитном порядке |
property OnChange: TNotifyEvent;; |
Определяет реакцию на изменение набора строк. Возникает после последнего изменения |
property OnChanging: TNotifyEvent |
Определяет реакцию на изменение набора строк. Возникает до очередного изменения |
function Find(const S:String; var Index: Integer) : Boolean; |
Ищет в наборе строку S и в случае успеха в параметре index возвращает ее индекс |
При sorted = True строки набора автоматически сортируются в алфавитном порядке. При этом свойство Duplicates разрешает коллизию, связанную с добавлением в набор строки, идентичной одной из ранее вставленных. Если Duplicates = dulgnore, идентичная строка отвергается и программе ничего об этом не сообщается; если Duplicates = duError, возбуждается исключение EListError; значение Duplicates = duAccept разрешает вставлять в набор сколько угодно идентичных строк.
Следует заметить, что сортировка строк в Windows 32 осуществляется не совсем так, как это происходит в MS-DOS или Windows 3-х. Чтобы убедиться в этом, советую прогнать следующий вариант учебной программы (см. рис. 16.1). В ней обработчик события OnClick кнопки bbRun создает два списка строк - List1и List2. Список List1 первоначально способен сортировать строки (в его свойство sorted устанавливается значение True). Затем в цикле от 32 до 255 (О...31 - это коды служебных символов) происходит наполнение обоих списков: в List1 помещается строка, содержащая символ и его код, а в List2 - наоборот, сначала код, а затем сам символ. Поскольку символьное представление кода дополняется до трех символов (в двузначных числах слева добавляется ведущий ноль), строки в списке List1 окажутся отсортированными по символу, а в списке List2 - по коду символа. Затем оба списка для наглядности объединяются и помещаются в редактор mmOutput.
procedure TfmExample.bbRunClick (Sender: TObject);
var
k: Byte;
Listi, List2: TStringList;
S: String;
begin
// Создаем два списка
List1 := TStringList.Create;
Listi.Sorted := True;
List2 := TStringList.Create;
// Цикл наполнения списков монотонно возрастающими кодами
for k := 32 to 255 do
begin
S := IntToStr(k); // Код символа
if k<100 then
S := '0' + S;// Двузначное число дополняем ведущим нулем
// Формируем строку Listi из символа + табуляция + код символа Listi.Add(Char(k) + #9 + S) ;
// Формируем строку List2 из кода + табуляция + символ
List2.Add(S + #9 + Char(k));
end;
// Объединяем оба списка
Listi.Sorted := False; // Отключаем сортировку List1
for k := 0 to List1.Count-1 do
List1[k] := List1[k] + #9 + List2[k];
// Переносим результат в mmOutput mmOutput.Lines.Assign(List1);
// Уничтожаем List1 и List2 Listi.Free;
List2.Free;
end;
Следует прокомментировать два момента. Во-первых, с помощью единственного оператора
mmOutput.Lines.Assign(List1);
все строки List1 помещаются в свойство Lines редактора mmOutput. Это возможно из-за того, что mmOutput. Lines и Listi имеют общего родителя TStrings, который умеет копировать родственные наборы строк с помощью своего метода Assign. Во-вторых, перед объединением строк мы отключили свойство Sorted списка Listi. если этого не сделать, любое изменение строк в отсортированном списке привело бы к исключентю EStringListError.
Рис. 16.1. Окно прогона программы сравнения сортировки строк для Windows 32 и Windows З.х
Как видим, строки в 32-разрядных Windows сортируются не с учетом внутреннего кода символа, а с учетом “смысла”: в начале располагаются все знаки препинания и разного рода “мусор”, затем идут цифры, буквы латинского алфавита и символы кириллицы. Буквы упорядочены парами - сначала заглавная, за ней строчная - и не идут сплошным массивом. “Виновником” такой сортировки является API-функция AnsiCompareText, К который обращается метод TStringList. Quicksort. Если вам понадобится отсортировать так, как это принято в MS-DOS или Windows З.х, т. е. по коду символа, проделайте следующее.
Разыщите в каталоге source | Rtl | common исходный файл classes . pas и скопируйте его в ваш рабочий каталог (в предыдущих версиях этот файл располагался в каталоге Source | vci). Если вы не найдете этого файла, вы не сможете изменить сортировку, т. к. в классе TStringList метод Quicksort, отвечающий за сортировку, определен в секции private и, следовательно, недоступен наследникам.
В раздел implementation этого модуля сразу после предложения Uses поместите такое описание функции AnsiCompareText:
Function AnsiCompareText(SI, S2: String): Integer;
begin
if S1 < S2 then Result := -1
else if SI == S2 then Result := 0
else Result := 1
end;
3. С помощью опции Project | Add To Project добавьте измененный модуль classes к вашему проекту и сделайте новый прогон программы. Теперь оба столбца будут идентичны.