Разбиение литерала по строкам программы
Часто бывает необходимо разместить длинный литерал на нескольких строках текста программы. Например, требуется вывести сообщение, содержащее 200 символов. Максимальная длина одной строки текста в редакторе кода равна 1024 символам. На экране целиком умещается около 80 символов текста в одной строке. Следовательно, напечатать длинный текст в одной строке редактора можно, но читать его – с трудом. Лучше всего разбить длинный текст – литерал на несколько строк исходной программы. Для этого просто используйте операцию слияния (+)
MessageBox(0, 'Файл изменен, но не был сохранен. ' + 'Сохранить его сейчас ' + 'или снова вернуться в режим редактирования? ', 'Message', 0);
Сравнение строк
Строки можно сравнивать друг с другом с помощью операций сравнения. Операции сравнения перечислены в таблице 1.3.
Таблица 1.3. Операции сравнения строк
Сравнение строк основано на анализе кодов ASCII. Две строки считаются равными если они имеют одинаковую длину и содержат одинаковые последовательности символов. Операции «меньше – больше» используют для сортировки строк в алфавитном порядке. Чаще всего в программах применяется операции «равно – не равно»:
if FileName = 'TEST.TXT' then OpenFile(FileName) Else ReportError;
Строковые функции
Object Pascal предоставляет большой набор процедур и функций, предназначенных для выполнения различных операций над строками. Наиболее употребительные функции перечислены в таблице 1.4.
Таблица 1.4. Строковые процедуры и функции
Дадим пояснения к функциям таблицы 1.4. Функция StrToInt преобразует строку, содержащую текстовое представление целого числа в значение целого типа. Допустим, что на форме приложения имеется компонент редактирования (Edit), с помощью которого пользователь должен ввести значение целого числа. Компонент Edit работает только с текстом. Поэтому получить этот текст как значение целого числа следует так:
StepNo:= StrToInt(Edit1.Text);
где StepNo – переменная типа integer. Остальные функции StrToXXX (StrToFloat, StrToDate, и т.д.) работают точно также. Любая из этих функций создает исключительную ситуацию если не может выполнить преобразование строки в число. Например, если пользователь введет S123 вместо 123, возникнет ошибка времени выполнения (исключительная ситуация) так как символ S нельзя интерпретировать как цифру.
Функция Format используется довольно часто. Ее удобно применять для формирования текстов сообщений, содержание которых зависит от переменных параметров. Рассмотрим следующий текст
Спутник <…> выведен на <…> орбиту высотой <…> км.
Здесь угловыми скобками отмечены переменные составляющие текста - параметры. Пусть первый параметр – наименование спутника; второй – одно из слов «расчетную/нерасчетную»; третий параметр – целое число. Следующий фрагмент кода – текст функции, которая возвращает отформатированное сообщение.
function GetSituationTxt(const SatName: string; Situation:boolean; Altitude:integer): string; Const sTextToFormat= ’Спутник %s выведен на %s орбиту высотой %d км’; sSitTxt:array[boolean] of string = (’нерасчетную’,’расчетную’); Begin Result:=Format(sTextToFormat, [SatName, sSitTxt[Situation], Altitude]); end;
Исходная строка представлена константой sTextToFormat. Символы %s в ней означают, что вместо них надо подставить параметр – строку, а символы %d обозначают место вставки значения целого числа. Подставляемые параметры перечисляют через запятую и заключают в квадратные скобки. Типы значений параметров не должны противоречить символам форматирования. Подробные сведения о форматировании строк функцией Format приведены в следующем разделе.
Форматирование строк
Форматируемая строка, передаваемая в функцию Format может содержать обычный текст и спецификации формата. Текст копируется в результирующую строку без изменения. Спецификация формата извлекает из списка аргументов очередной параметр и преобразует его в строку т.е. форматирует в соответствии с информацией, закодированной в спецификаторе. Спецификатор формата имеет вид:
% [index:] [-] [width] [. prec] type
Здесь квадратные скобки охватывают необязательные элементы конструкции. Любая спецификация формата начинается с символа %. После % следуют параметры спецификации в следующем порядке:
индекс аргумента [ index: ] признак выравнивания влево, [ - ]
спецификация ширины, [ width ] спецификация точности, [. prec ] код формата, type
Допустимые коды перечислены в следующей таблице:
Спецификаторы формата можно записывать как строчными, так и заглавными буквами. При форматировании вещественных значений используются разделители дробной части и тысяч, определенные в секции «Язык и стандарты» панели управления Windows. Во время выполнения программы они записаны в глобальных переменных DecimalSeparator и ThousandSeparator. Значения спецификаторов index, width, и precision могут быть указаны явно (например "%10d"), либо неявно с помощью символа * (например "%*.*f"). В последнем случае следующий по порядку аргумент из списка (он должен быть целым числом) используется как соответствующий спецификатор. Например,
Format('%*.*f', [8, 2, 123.456])
то же самое что и
Format('%8.2f', [123.456]).
Спецификация width задает минимально допустимую ширину поля. Если результирующая строка короче ширины поля, в нее добавляется соответствующее число пробелов. По умолчанию результат выравнивается вправо, но если спецификация формата содержит знак (-), то результат выравнивается влево. Спецификатор индекса (index) явно указывает на аргумент в списке. Индекс первого аргумента в списке равен 0. Используя спецификацию индекса можно форматировать одни и те же аргументы несколько раз. Например, результатом Format('%d %d %0:d %d', [10, 20]) будет строка вида '10 20 10 20'.
Множества
Поскольку множества используются в Delphi весьма часто, рассмотрим как с ними работать. Множество строится из значений базового типа. В этом смысле оно похоже на массив. Но в отличие от массива, множество может содержать любое количество различных элементов базового типа – от нуля элементов всех возможных значений. Если множество не содержит ни одного элемента, то говорят, что оно пустое. На множествах определены такие операции как объединения, пересечения, включение и исключение.
Как пример множества рассмотрим свойство Style объекта VCL Font (шрифт). Это свойство представляет собой комбинацию признаков начертания символов шрифта. Каждый из признаков имеет стандартное наименование
fsBold – полужирный fsItalic – наклонный fsUnderline – подчеркнутый fsStrikeout – перечеркнутый
Шрифт можно характеризовать любым сочетанием этих признаков или ни одним из них. Иными словами, множество признаков шрифта может быть пустым, оно может содержать все различные признаки или любую комбинацию различных признаков. В общем случае объявление множества включает определение базового типа (если базовый тип не является стандартным) и самого множества. Базовым может быть любой дискретный (целочисленный) тип с количеством различных элементов не более 256. Таким образом, стандартными базовыми типами элементов множеств являются byte и char. Базовый тип признаков шрифта в модуле VCL GRAPHICS.PAS объявлен так
Type TFontStyles= (fsBold,fsItalic,fsUnderline,fsStrikeout);
Данное объявление вводит в рассмотрение четыре различных значения. Тип свойства Style шрифта объявлен так
type TFontStyle = set of TFontStyles;
и буквально означает «множество значений типа TFontStyles». При проектировании формы приложения, в свойство–множество Style шрифта можно включать любые различные признаки из числа перечисленных в TFontStyles, отмечая их в окне инспектора объектов. Может возникнуть необходимость изменения состава признаков шрифта непосредственно в процессе выполнения программы, например, в ответ на нажатие какой-либо кнопки. Допустим, что нам необходимо изменить стиль шрифта формы добавлением признаков «полужирный, наклонный». Следующий фрагмент кода показывает как это можно сделать:
procedure Form1.Button1Click(Sender:TObject); Begin Font.Styles:= Font.Styles + [fsBold, fsItalic]; end;
В этом коде в свойство-множество Styles включаются элементы fsBold и fsItalic. Список включаемых элементов находится в квадратных скобках, которые в данном случае называются конструктором множества. Исключить признак наклонного шрифта можно так:
Font.Style:= Font.Style – [fsItalic];
В результате выполнения этого оператора из множества Styles будет исключен элемент fsItalic. Допустим, что нам нужно знать, содержится данный элемент в множестве или нет. Например, мы хотим знать обладает ли текущий шрифт признаком «полужирный»? Ответ дает следующий код:
if fsBold in Styles then DoSomething;
Для «очистки» множества используется конструктор пустого множества, например:
Form1.Font.Styles:= [];
Следующий пример показывает как инициализировать множество с требуемым составом элементов:
Form1.Font.Styles:= [fsBold, fsItalic];
Подобным образом можно модифицировать стиль шрифта любого компонента формы, например,
Memo1.Font.Style:= []; Memo1.Font.Style:= Memo1.Font.Style + [fsBold, fsItalic];
Записи
Записи являются еще одним типом структурированных данных, поддерживаемым языком Object Pascal.
Новый термин. Запись – это группа данных, связанных общим смыслом и обрабатываемых как единое целое. Данные в записи могут быть разнотипны и называются полями.
Зададимся целью создать описание коллекции CD с музыкой. Было бы удобно иметь такую переменную, которая позволила бы хранить всю необходимую нам информацию об одном CD в одном месте. Именно такую возможность и дают нам записи. Сначала мы должны объявить структуру записи, а затем использовать ее экземпляры– переменные. Для объявления записи применяется ключевое слово record:
Type TCDRecord = record Number: integer; // Порядковый номер CD в коллекции Title: string; // Наименование Artist: string; // Исполнитель Year: integer; // Год выпуска Recorded: string; // Фирма-производитель Price: double; // Стоимость Market: string; // Где куплен end;
Каждый элемент записи называется полем. В данном случае запись объединяет данные трех различных типов – целого, строкового и вещественного.
ПРИМЕЧАНИЕ. К объявлению записи в этом примере следует относиться только как к примеру. Так, запись с полями типа «длинная строка» не подходит для записи в файл. Если предполагается хранить записи в файлах, все записи должны иметь одинаковый размер (в байтах). В данном же случае никто не может гарантировать то, что все записи сведений о коллекции CD будут иметь одну и ту же длину. При создании записей, которые предполагается записывать в файлы, поля строкового типа следует объявлять либо как короткие строки, либо как массивы символов (array of Char). Более подробно об этом говорится в разделе «Обработка двоичных данных».
После того как тип записи объявлен, можно работать с переменными – экземплярами:
Var CD: TCDRecord;
Теперь можно присваивать значения полям переменной CD:
CD.Number:=1; CD.Title:=’Aftermath’; CD.Artist:=’The Rolling Stones’; CD.Year:= 1986; CD.Recorded:=’ABCKO Music and Records,Inc’; CD.Price:= 80; CD.Market:= ’Горбушка’;
Здесь мы видим что поле, относящееся к переменной–записи, обозначается идентификатором, состоящим из имени переменной, точки и имени поля. Ниже дан пример присваивания значения поля записи свойству надписи, размещенной на некоторой форме:
Label1.Caption:= CD.Recorded; Объявление записи Синтаксис оператора record имеет вид
name = record field_1: data_type; field_2: data_type; . . . field_n: data_type; end;
Оператор with
Оператор with применяется как к записям, так и к объектам. Здесь мы рассмотрим то как он используется вместе с записями. Выше мы написали код, заполняющий структуру записи данными:
CD.Number:=1; CD.Title:=’Aftermath’; CD.Artist:=’The Rolling Stones’; CD.Year:= 1986; CD.Recorded:=’ABCKO Music and Records,Inc’; CD.Price:= 80; CD.Market:= ’Горбушка’;
С помощью оператора with этот код можно несколько упростить:
with CD do Begin Number:=1; Title:=’Aftermath’; Artist:=’The Rolling Stones’; Year:= 1986; Recorded:=’ABCKO Music and Records,Inc’; Price:= 80; Market:= ’Горбушка’; end;
Оператор with присоединяет квалификатор (имя записи) по умолчанию к блоку кода. Все, что находится внутри begin – end рассматривается как собственность записи CD.
Массивы записей
В любой программе можно объявить массив записей аналогично объявлению массива данных целого или вещественного типов:
Var MyCDs: array [0..9] of TCDRecord;
Begin MyCDs[0].Number:=1; MyCDs[0].Title:=’Aftermath’; MyCDs[0].Artist:=’The Rolling Stones’; MyCDs[0].Year:= 1986; MyCDs[0].Recorded:=’ABCKO Music and Records,Inc’; MyCDs[0].Price:= 80; MyCDs[0].Market:= ’Горбушка’;
MyCDs[1].Number:= 2; MyCDs[1].Title:= ’Between the buttons’; MyCDs[1].Artist:= ’The Rolling Stones’;
MyCDs[2].Number:= 3; MyCDs[2].Title:= ’Willage Green Preservation Society’; MyCDs[2].Artist:= ’The Kinks’;
Label1.Caption:= MyCDs[2].Artist; { Продолжение... } end;
Это выглядит чуть сложнее, чем в случае массива целого или вещественного типа. Так, индекс следует за именем массива MyCDs, а затем – точка и имя поля.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|