Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ракитин Р.Ю. ООП в Turbo Delphi

.PDF
Скачиваний:
55
Добавлен:
18.03.2015
Размер:
3.59 Mб
Скачать

91

присваивании переменной нового значения длина строки автоматически делается равной длине присвоенного текста.

Сцепление текстов двух строк осуществляется операцией «+». Например,

для строк S1:=’12345’ и s2:=’ABCD’, при операции S:=S1+’_и_’+S2,

получим результирующую строку s: 12345_и_ABCD.

Такого же результата можно достигнуть при использовании функции

Concat (const String1 {,String2 ...}: string): string;

Для работы со строками также используются, следующие процедуры и функции:

function AnsiCompareStr (const String1,

String2: String): Integer; – сравнивает String1 и String2 на равенство. Сравнение не затрагивает длину, оно выполняется по буквам. Но более длинная строка больше, чем короткая. Сравнение чувствительно к регистру;

function AnsiCompareText (const String1,

String2: String): Integer; сравнивает String1 и String2 на равенство, игнорируя регистр. Сравнение не затрагивает длину, оно выполняется по буквам. Но более длинная строка больше, чем короткая;

function AnsiPos (const Needle, HayStack: String): Integer;

ищет подстроку Needle в строке HayStack, возвращая позицию в строке первого вхождения. Если строка не найдена, то возвращается 0. Поиск чувствителен к регистру;

function AnsiLowerCase (const MixedString: string): String;

создает копию MixedString со всеми символами, c преобразованием в строчные буквы;

function AnsiUpperCase (const MixedString: String): String; – cоздаёт копию MixedString со всеми символами, преобразованными в верхний регистр;

function Copy (Source: string; StartChar,

Count: Integer): string; возвращает строку, состоящую из указанных в Count количестве символов начиная с StartChar символа. Первый символ строки имеет индекс = 1;

procedure Delete (var Source: string; StartChar: Integer; Count: Integer); удаляет последовательность символов вплоть до

символа Count из строки источника начиная с позиции StartChar.

Процедура вырезает символы из строки и после этого сдвигает символы справа на их место. Первый символ строки = 1;

procedure Insert (const InsertStr: string;

var TargetStr: string; Position: Integer); вставляет одну строку (InsertStr) в другую строку (TargetStr) в заданной позиции

92

(Position). Символы строки TargetStr начиная с символа указанного в Position, смещаются вправо. Длина TargetStr является суммой длины этих двух строк;

function LastDelimiter (const Delimiters,

Source: String): Integer; находит последнее вхождение любого набора символов разделителей (Delimiter) в строке (Source);

function StrScan (const Characters: PAnsiChar;

SearchChar: Char): PAnsiChar; используется в тех случаях, когда

вам нужно найти единичный символ в списке известных символов (Characters). Если SearchChar (искомый символ) присутствует в Characters, то в качестве результата функции возвращается указатель на

Characters;

function StringOfChar (RepeatCharacter: Char;

RepeatCount: Integer): String; создает новую строку длиной

RepeatCount, заполненную символами RepeatCharacter. Эта функция

избавляет вас от необходимости создания цикла или утомительного ручного набора;

function Trim (const Text: String): String; удаляет пробельные и управляющие символы (такие как перевод строки) в начале и в конце строки. Также можно воспользоваться функциями TrimLeft и TrimRight;

function WrapText (const SourceString

{,MaxColumnSize: Integer= 45}): string; – эффективно разбивает строку текста SourceString на множественные строки в возвращаемой строке. Вставляет заданную по умолчании подстроку в конец строки после каждого набора слов равного MaxColumnSize символам. По сути, функция вставляет в строку символы #13#10.

Компоненты для ввода/вывода строк

Для ввода и вывода информации в объектно-ориентированном программировании существует целый ряд вариантов. В библиотеке визуальных компонентов Delphi существует множество компонентов, позволяющих отображать, вводить и редактировать текстовую информацию. Нами уже был рассмотрен компонент Label (Метка). Ниже приведен перечень компонентов с краткими характеристиками и указанием основных параметров, содержащих отображаемый или вводимый текст.

1. Элемент управления Edit (Одна строка) .

Как видно из ранее рассмотренных примеров, данный компонент используется для получения от пользователя различной информации. Так же

пользователь может скопировать текстовую информацию из компонента в буфер обмена.

93

Основные св ойства:

Te xt основное свойство для хранения текстово й строки;

Ma xLength максимально до пустимое число си мволов, которое м ожно ввести в поле ко мпонент а;

Bo rderSty le вид рамки компонента. Свойст ва может принимать значения

bsSingle (обычная рамка) и ли bsNone (рамка отсутствует);

 

Re adOnly свойств о,

определяющее,

будет л и испол ьзоваться компонент

только д ля чтения.

Если свойство

установлено в False, то ввод данных

разрешае тся, в пр отивном случае вво д будет запрещён;

 

Pa sswordC har

символ

п ароля. Позволяет

заменить

при отображении

введенн ый

символ

на

указанный

в данном

свойств е.

Напри мер, можно

скрыть пароль под символом «звездочка».

2. Компонент StaticText (М етка с бордюром) .

Данный компонент п одобен компоненту Label, и его мо жно найти на вклад ке

Additional. Он

обеспечивает

возмож ность за дания

стиля

бор дюра

чер ез

сво йство Bo rderStyle. Свой ство мо жет принимать

значения sb sNone (н ет

ра мки), sbsSingle (тонкая рамка ), sbsSun ken (утоп ленный те кст).

 

 

 

3. Компонент MaskEdit (Окно маскир ованного редактир ования) .

 

Компон ент

испо льзуется

для фо рматиров ания

данных

или

для

ввода

си мволов в соответс твии с шаблоном. Он расп оложен на вкладке

Additional.

Основные с войства Text и E ditMask. В последнем сво йстве вводится мас ка для вводим ого текста. Это м ожно сделать вруч ную, исп ользуя специальные уп равляющи е символы.

С имвол

 

 

Зна чение в маске

 

 

 

 

 

>

Все

символ ы,

вводимые

п ользовател ем

после

текуще й

позиции,

переводятся в верхний регистр. Действие прекращается после указан ия

 

символа < и ли символ ов <>.

 

 

 

 

 

 

<

Все

симво лы,

вводимые пользователе м после

текущей

позиции,

переводятся в нижни й регистр. Действие прекращается пос ле указан ия

 

символа > и ли символ ов <>.

 

 

 

 

 

 

<>

Отключение автомати ческого изменения регистра вводимых с имволов.

 

\

Необходим для

испо льзования в маске символов,

которые

считают ся

управляющими.

Если перед уп равляющим символ ом используется \,

то

 

са м символ р ассматри вается как обычный.

 

 

 

 

 

L

В текущей позиции может присутствовать только буква.

 

 

 

I

В текущей позиции может

п рисутство вать

только

буква ,

либо

не

присутствовать ничего.

 

 

 

 

 

 

 

 

 

 

 

 

 

0

В текущей позиции может присутствовать только цифра.

 

 

 

9

В текущей позиции может

присутствовать

толь ко

цифр а,

либо

не

присутствовать ничего.

 

 

 

 

 

 

 

 

 

 

 

 

 

A

В текущей позиции может присутствовать только буква или цифра.

 

94

a

В текущей позиции м ожет присутствовать только буква или

цифра, либо

не присутств овать ничего.

 

 

 

 

 

С

В текущей позиции может присутствовать любой си мвол.

 

 

с

В текущей позиции может присутствовать любой символ либо

не

присутствовать ничего.

 

 

 

 

 

#

В текущей позиции м ожет присутствовать цифра, з нак (плюс или минус)

либо не прис утствовать ничего.

 

 

 

 

 

:

В текущую позицию б удет вставлен символ, разделяющий часы, минуты

и секунды в значениях времени . Символ автоматически считывается

из

 

настроек Windows.

 

 

/

В текущую позицию б удет вставлен символ, разделяющий месяца, дни и

года в датах. Символ автоматически считывается из настроек

Windows.

 

 

 

;

Используется для отделения час тей маски друг от друга.

 

 

_

В текущую п озицию а втоматически вставляется про бел.

 

 

Наприм ер, маска “\(999 9\)00-0 0-00;1;_позволяет ввести телефоны

такого

вида

(____)__-__-_ _.

При

этом символы “(“, “)”, “-” буд ут

оставлены,

а симво лы

“_”

будут

заменены на соответствующ ие цифр ы,

на пример (3 852)36-52-55.

 

 

 

Также

можно

открыть

окно

 

ред актирования,

в

кот ором

 

вво дится

свой

шаблон

или

 

выбирается готовый.

Для откр ытия

 

ок на

перейдите в

 

Инспекторе

 

об ъекта на

вкладку

Свойства

и

 

на против поля Edit Mask наж мите на управляющие симв олы.

4. Компонент Panel (Панель) .

Компон ент пред ставляет собой контейнер для др угих компонентов и поз воляет ле гко управлять компонентам и, которы е находятся на па нели. Также

он может

использоваться

и для

от ображен ия текст а с воз можностями

об ъемного оформлен ия.

 

 

 

 

За

внешний ви д

панели

отвеча ют

два

сво йства

 

BevelInner

и

BevelOuter.

Рас смотрим

програм му, показывающую,

как

может

выглядеть

панель

с

разл ичными

вар иантами установл енных пар аметров.

 

В компонент Pa el можно выводить текст,

для этого используетс я свойств о Captio n.

 

Свойст во

Align,

позвол яет

«прик репить»

па нель

к

границе

компонен та,

на котором

рас положен а

панел ь,

например

фо рмы.

В

результате привязки панели к границе формы

размер панели автоматически

меняется

при

95

изменении размера компонента, на котором панель расположена.

Если на панель помещены различные компоненты, то все они наследуют свойства панели, влияющие на их отрисовку. Таким образом, если панель окажется невидимой (свойство Visible=False), то и все компоненты окажутся невидимыми.

5. Компонент Memo (Многострочное поле ввода) .

Компонент позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Для знакомства с основными свойствами компонента рассмотрим небольшую программу. Для этого создадим новый проект. Установим на форму компонент TMemo.

По умолчании в нем уже присутствует одна строка текста, равная имени, компонента. За содержимое текста отвечает свойство Lines. Это свойство целый объект типа TStrings, имеющий свои свойства и методы. Немного позже мы познакомимся с некоторыми из них.

Очистим содержимое компонент Memol.

Для этого дважды щелкним по свойству Lines. При этом откроется окно редактора строк. Оно содержит простой текстовый редактор, в котором можно набрать многострочный текст. Удалим все его содержимое. После чего нажмите кнопку ОК.

Теперь напишем программу, которая

будет выполнять простые функции текстового редактора.

Добавим на форму одну кнопку. Изменим её свойство Caption на «Очистить», а имя на ClearButton. Также изменим имя и компонента Memol на MainMemo. Создадим для кнопки обработчик события OnClick. В нем напишем следующий метод:

MainMemo.Lines.Clear;

В этом программном коде вызывается метод Clear объекта Lines, который в свою очередь принадлежит объекту MainMemo. Свойство Lines это целый объект, и у него есть метод Clear, который очищает содержимое строк редактора.

Запустим программу и напишем внутри компонента Memo какой-нибудь текст. Потом нажмем кнопку «Очистить», чтобы очистить всё, что ввели.

Усложним пример, добавив возможность сохранения введенного текста и загрузки его обратно.

Создадим обработчик события OnShow (срабатывает, когда отображается окно) для формы и напишем в нём следующий код:

MainMemo.Lines.LoadFromFile (‘memo.txt’);

96

Здесь вызывается метод LoadFromFile объекта Lines. Ему нужно передать только один параметр имя файла, откуда будет происходить загрузка данных.

+ Для использования метода LoadFromFile файл должен

существовать.

Проверим наличие файла перед использованием метода LoadFromFile. Для этого воспользуемся функцией FileExists. Ей нужно передать имя файла, существование которого надо проверить, и если такой файл существует, функция вернет True.

+ Более подробно о работе с файловой системой смотрите в

Главе 11.

Давайте изменим обработчик события OnShow следующим образом:

if FileExists('memo.txt') then MainMemo.Lines.LoadFromFile ('memo.txt');

Теперь реализуем обработчик события OnClose (срабатывает на закрытие окна). В нем напишем процедуру сохранения содержимого MainMemo.

MainMemo.Lines.SaveToFile ('memo.txt');

Здесь используется метод SaveToFile, который работает так же, как и метод загрузки файла, только сохраняет данные.

В компоненте TMemo текст хранится как простая последовательность строк массив. Используя предыдущий пример,

наберите текст и после закрытия программы посмотрите, как он выглядит в файле.

Для доступа к каждой строке можно воспользоваться свойством Strings объекта Lines. На рисунке наглядно

показано, как получить доступ к строкам. Чтобы получить Нулевую строку,

нужно написать

MainMemo.Lines.Strings[0];

Для первой строки MainMemo.Lines.Strings[1]; и т.д.

Давайте напишем пример, который будет получать доступ к строкам, чтобы увидеть все это на практике. Добавим три кнопки:

«Добавить» дадим этой кнопке имя AddButton;

«Удалить» дадим этой кнопке имя DelButton;

«Изменить» дадим этой кнопке имя ChangeButton.

Можно расположить их как показано на рисунке. Теперь создадим обработчик события OnClick для кнопки «Добавить». Здесь мы будем

97

программно добавлять новую строку в MainMemo. Для этого у объекта Lines есть метод Add, имеющий только один параметр текст новой строки:

MainMemo.Lines.Add(‘Новая строка’);

Теперь создадим обработчик события OnClick для кнопки «Удалить». По этому событию мы должны удалить строку, к которой находится сейчас курсор. Для этого напишем в обработчике следующий текст:

if MainMemo.Lines.Count<>0 then MainMemo.Lines.Delete (MainMemo.CaretPos.Y);

В первой строке проверяется, сколько строк в компоненте MainMemo. Для этого используется свойство Count объекта Lines. Если оно не равно нулю, значит, строки есть, и, следовательно, можно удалить текущую строку.

Для удаления используется метод Delete объекта Lines. В качестве единственного параметра нужно передать номер строки для удаления. Для определения текущей строки используется свойство CaretPos, которое указывает на текущую позицию курсора. CaretPos это переменная типа TPoint. У типа есть два свойства: Х указывает на текущую колонку, a Y указывает на текущую строку.

В завершении напишем обработчик события OnClick для кнопки «Изменить». В нем напишем следующий код:

MainMemo.Lines.Strings[MainMemo.CaretPos.Y]:='ABCDF'; MainMemo.Lines.Strings[0]:='Текст изменён';

6. Компонент RichEdit (Многострочное поле ввода в формате RTF) .

Компонент RichEdit, как и Memo, представляет собой окно редактирования, но содержит дополнительные свойства по форматированию отдельных абзацев, выбора атрибутов шрифта, поиск текста и многое другое.

7. Компонент ListBox (Список выбора) .

Отображение стандартного окна списка Windows, позволяющего пользователю выбирать из него пункты.

Чтобы получить, доступ к строкам списка, нужно воспользоваться свойством Items объекта TListBox. Это свойство имеет тип TStrings, поэтому работа со строками аналогична компоненту TMemo.

Номер выделенной строки хранится в свойстве ItemIndex. С помощью свойства Items.Strings можно получить доступ ко всем строкам списка.

Бывают ситуации, когда надо выбрать несколько элементов в списке. Для этого у компонента ListBox есть свойство MultiSelect. Если в нём устано- вить знамение True, то можно будет выбирать мышью несколько строк. Для этого можно щёлкать по нужным элементам, удерживая нажатой клавишу Сtrl. Также у компонента ListBox есть свойство Selected. Это свойство имеет тип массива в виде булевых значений. Таких значений ровно столько, сколько и

98

строк в компоненте ListBox. Чтобы узнать, выделена ли определенная строка, нужно проверить соответствующий элемент в массиве Select.

8.Компонент CheckListBox (Список с индикаторами) .

Данный компонент очень похож на простой TListBox, только у каждого элемента списка есть еще и квадратик для выделения, как у TCheckBox. Чтобы узнать, выделена ли какая-то строка, надо проверить свойство Checked компонента CheckListBox. В квадратных скобках надо указать номер интересующей строки. Для этого необходимо использовать метод

Checked [Index: Integer]: Boolean.

9.Компонент ComboBox (Выпадающий список) .

Компонент представляет собой сочетание поля редактирования и списка выбора, что позволяет вводить данные путем набора с клавиатуры или выбором из списка. Основное свойство Items.

Свойство Style определяет вид компонента и имеет следующие значения:

csDropDown основной стиль. При нем можно не только выбирать значения из списка, но и вводить в строку свои;

csDropDownList при этом стиле можно только выбирать из списка;

сsOwnerDrawFixed при этом стиле можно рисовать элементы с помощью графических средств. Высота элементов фиксированная;

csOwnerDrawVariable при этом стиле можно рисовать элементы. Отличается от предыдущего тем, что высота элементов нефиксированная;

csSimple только строка ввода без выпадающего списка. Компонент будет выглядеть, как TEdit.

При выборе какого-либо элемента списка генерируется событие OnChange.

Список, отображаемый в поле компонента, можно формировать при создании формы или во время работы программы, для этого используются методы объекта TString.

Абстрактный класс объектов TStrings

Класс TStrings представляет собой списки строк и используется во многих компонентах Delphi в качестве различных свойств.

+ Класс TStrings является абстрактным, поэтому для создания

объектов необходимо определить класс потомок или воспользоваться классом TStringList.

Класс TStrings содержит методы и свойства, позволяющие манипулировать со списками строк:

добавлять и удалять строки в указанных позициях;

перестраивать и упорядочивать последовательность строк;

получать доступ к конкретным строкам;

99

читать и записывать списки строк в файлы и потоки;

связывать с каждой строкой некоторый объект.

Рассмотрим некоторые свойства:

Count: Integer число строк в списке. Свойство только для чтения;

Strings [Index: Integer]: String текст строки с указанным индексом.

Индекс первой строки 0;

Text: String Представляет весь список как одну строку, внутри которой

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

Рассмотрим некоторые методы:

Add (const S: string): Integer добавляет строку в конец списка. Возвращает индекс добавленной строки. В окнах редактирования добавляемая строка может оказаться разбитой на несколько, так что в этих случаях возвращаемый индекс ни о чем не говорит.

AddStrings (Strings: TStrings) добавляет в список группу строк другого объекта Strings типа TStrings;

Append (const S: string) добавляет строку в конец списка. Метод аналогичен Add, но не возвращает индекс строки;

Clear очищает список;

Delete (Index: Integer) – удаляет из списка указанную строку;

Exchange (Index1, Index2: Integer) переставляет местами указанные строки списка;

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

Insert (Index: Integer; const S: string) – вставляет указанную строку S в заданную позицию Index. Если Index=0, строка вставляется на первую позицию;

LoadFromFile (const FileName: string) заполняет список строками текста из указанного файла FileName;

Move (CurIndex, NewIndex: Integer) изменяет позицию строки с индексом CurIndex, давая ей индекс NewIndex;

SaveToFile (const FileName: string) Сохраняет строки списка в файле с указанным именем;

SetText (Text: PChar) задает значение свойства Text.

100

Глава 8. Модульная структура приложений

Модульность является одним из принципов, лежащим в основе объектно- ориентированного программирования.

Модульность это свойство системы, которая была разложена на внутренне связанные, но слабо взаимодействующие между собой модули.

Модульное программирование предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов, модуль подпрограмм вывода на принтер. Связи между модулями осуществляются через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым «внутренним» переменным) запрещён.

Использование модульного программирования существенно упрощает ведение разработки программ несколькими программистами, каждый из которых разрабатывает свои модули. Внутренняя организация модулей скрыта от остальных и потому может изменяться независимо.

Взаимодействие модулей осуществляется через специально оговоренные интерфейсы модулей. Кроме того модули в дальнейшем могут использоваться в других разработках, что увеличивает производительность труда программистов.

Структура модуля в Delphi

Каждый модуль в Delphi имеет жестко заданную структуру, которая обычно автоматически генерируется системой при его создании. Пустой модуль имеет следующую структуру:

unit <имя модуля>;

interface // Открытый интерфейс модуля

{Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, функций и процедур, к которым будет доступ из других модулей}

implementation // Реализация модуля

{Сюда могут помещаться списки подключаемых модулей, объявления типов, констант, переменных, к которым не будет доступа из других модулей. Тут же должны быть реализации всех объявленных в разделе interface функций и процедур, а также могут быть реализации любых дополнительных, не объявленных ранее функций и процедур}

initialization //необязательный

{Операторы, выполняемые один раз при первом обращении к модулю}