Основы Object Pascal (551739), страница 6
Текст из файла (страница 6)
Остальные функции 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];
Совместимость типов данных
Новый термин. Совместимость типов означает, что данные одного типа можно трактовать как данные другого типа. Тем самым, переменные (объекты) родственных типов, можно трактовать как переменные одного и того же общего типа. Принцип совместимости позволяет выполнять преобразование типа переменной. На английском языке это называется typecasting.
Ниже дан пример, показывающий как узнать цифровой код, соответствующий букве «А» латинского алфавита:
procedure TForm1.Button1Click(Sender: TObject);
var
AChar : Char;
AnInteger : Integer;
begin
AChar := 'A';
AnInteger := Integer(AChar);
Label1.Caption := IntToStr(AnInteger);
end;
В этом примере выражение Integer(AChar) есть указание компилятору преобразовать значение переменной AChar типа Char в значение типа Integer. Такое преобразование необходимо постольку поскольку мы не можем присвоить значение типа Char переменной целого типа. Если бы мы сделали такое присваивание, минуя операцию приведения типа, компилятор выдал бы сообщение «Incompatible types: 'Integer' and 'Char' ».
Приведение типов, однако, возможно не всегда. Рассмотрим следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
Pi : Double;
AnInteger : Integer;
begin
Pi := 3.14;
AnInteger := Integer(Pi);
Label1.Caption := IntToStr(AnInteger);
end;
Здесь мы пытаемся трактовать данные типа Double как данные типа Integer. Это недопустимо. Компилятор выдаст сообщение «Invalid typecast ». Для преобразования вещественного значения в целочисленное необходимо использовать функции Trunc, Floor, или Ceil.
ПРИМЕЧАНИЕ.
Функция Trunc возвращает целую часть вещественного числа
Функция Floor округляет вещественное до ближайшего целого снизу
Функция Ceil округляет вещественное до ближайшего целого сверху
Для преобразования типа указателя используется оператор as. (Указатели рассматриваются в следующем разделе, а использование оператора as объясняется ниже в разделе "Ключевые слова классов is и as."
Указатели
Указатель суть адрес переменной в памяти компьютера. Говорят, что он указывает на переменную. Таким образом, указатель косвенно связан с реальными данными.