Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Разбиение литерала по строкам программы




 

Часто бывает необходимо разместить длинный литерал на нескольких строках текста программы. Например, требуется вывести сообщение, содержащее 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. Строковые процедуры и функции

 

Имя Описание Пример
Copy Возвращает подстроку S:= Copy(Source,Index,Count); S:= Copy(’test.txt’,1,4);
Delete Удаляет часть строки Delete(S,Index,Count); Delete(’test.txt’,5,4);
Format Форматирует строку см. пример ниже
Insert Вставка подстроки в строку Insert(Source, SubStr,Index); Insert(’testtxt’,’.’,5);
IntToStr Преобразует целое число в строку Edit1.Text:= IntToStr(Width)
Length Возвращает число символов в строке N:= Length(Source);
LowerCase Преобразует все буквы строки в строчные Name:= LowerCase(Edit1.Text)
Pos Возвращает позицию подстроки в строке K:= Pos(SubStr,Source); K:= Pos(’.’,FileName);
StringOfChar Возвращает строку, заполненную заданным символом  
StrPas Преобразует строку с терминальным нулем (PChar или array of Char) в строку типа string const T: PChar=’0-строка’; var S: string; ........ S:= StrToPas(T);
StrPCopy Преобразует строку типа string в строку с терминальным нулем const S = ’Обычная строка’; var T: PChar;   T:= StrPCopy(S);
StrToInt Преобразует строку в целое число Width:= StrToInt(Edit1.Text);
StrToIntDef Преобразует строку в целое число. Возвращает значение по умолчанию в случае ошибки   Width:= StrToIntDef(Edit1.Text,’120’);
StrToXXX Преобразование строки в специальный тип данных var D,T: TDateTime;   D:= StrToDateTime(Edit1.Text) T:= StrToTime(Edit1.Text);
Trim Удаляет из строки пробелы если они есть в ее начале и в конце  
UpperCase Преобразует все буквы строки в заглавные FileName:= UpperCase(Edit1.Text);
XXXToSTr Преобразование данных специальных типов в строку Edit1.Text:= DateTimeToStr(T)

 

 

Дадим пояснения к функциям таблицы 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

 

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

 

Код Описание
d Десятичный. Соответствующий аргумент должен быть целым числом. Значение аргумента преобразуется в строку десятичных цифр. Если указан спецификатор точности, то отформатированное значение будет содержать это количество символов. Если аргумент содержит меньше цифр, то слева добавляется недостающее число нулей.
e Научный. Аргумент должен быть вещественным числом. Его значение преобразуется в строку вида "-d.ddd...E+ddd". Знак ставится если число отрицательное. Десятичной точке предшествует всегда одна цифра. Общее число цифр (включая одну перед точкой) определяется спецификатором точности. По умолчанию число цифр равно 15. За символом экспоненты "E" всегда следует знак плюс или минус и, по-крайней мере, 3 цифры.
f Фиксированный. Аргумент должен быть вещественным числом. Его значение преобразуется в строку вида "-ddd.ddd...". Знак ставится если число отрицательное. Число цифр после точки определяется спецификатором точности. Если спецификатор точности отсутствует после точки по умолчанию будет две цифры.  
g Универсальный. Аргумент должен быть вещественным. Его значение преобразуется в строку минимально возможной длины либо фиксированного, либо научного формата. Количество значащих цифр результата зависит от значения, заданного спецификатором точности. По умолчанию это 15 цифр. Незначащие нули удаляются из результата, а десятичная точка присутствует только когда она необходима. При преобразовании применяется фиксированный формат если число цифр слева от десятичной точки меньше или равно значению спецификатора точности и форматируемое значение не меньше 0.00001. В противном случае применяется научный формат.  
n Числовой. Аргумент должен быть вещественным числом. Его значение преобразуется в строку вида "-d,ddd,ddd.ddd...". Этот формат аналогичен формату "f" с той разницей, что добавляются разделители тысяч.  
m Денежный. Аргумент должен быть вещественным числом. Его значение преобразуется в строку с учетом текущих значений глобальных переменных CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, DecimalSeparator, CurrencyDecimals, взятых из раздела «Язык и стандарты» панели управления Windows. Если задан спецификатор точности, его значение используется вместо CurrencyDecimals.
p Адрес. Аргумент должен быть указателем Его значение преобразуется в строку вида "XXXX:YYYY" где XXXX и YYYY сегмент и смещение, выраженные в 16-ричной системе счисления.  
s Строка. Аргумент должен быть символом, строкой типа string или строкой PChar. Строковый аргумент вставляется в результирующую строку вместо спецификатора формата. Спецификатор точности устанавливает максимальную длину результата (количество символов). Если аргумент–строка имеет большую длину, «лишние» символы отбрасываются.  
x Шестнадцатеричный. Аргумент должен быть целым числом. Его значение преобразуется в строку 16-ричных цифр.  

 

 

Спецификаторы формата можно записывать как строчными, так и заглавными буквами.

При форматировании вещественных значений используются разделители дробной части и тысяч, определенные в секции «Язык и стандарты» панели управления 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...