Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа
Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.
Примечания:
1. Форматирующие символы можно задавать как в верхнем, так и в нижнем регистрах.
2. Тип преобразования m (денежный) тесно связан с правилами представления, принятыми в конкретной стране. Для этого в модуле SYSUTILS определены значения ряда типизированных констант, начальные значения которых берутся из секции [Inti] файла WIN.INI. Вы можете изменять их значения в соответствии с вашими потребностями:
Имя и тип |
Что означает |
CurrencyString: string[7]; |
Символ (или символы), добавляемые к строке с представлением денежной суммы и обозначающие национальную денежную единицу. Это может быть, например, '$', 'DM' или 'руб'. |
CurrencyFormat: Byte; |
Определяет способ добавления знака денежной единицы к строке. Число 1 будет преобразовано так в зависимости от значения этого параметра: '$!' при 0; '1$' при 1; '$ Г при 2; '1 $' при 3. |
NegCurrFormat: Byte; |
Определяет способ добавления знака денежной единицы и минуса к строке в том случае, если происходит преобразование отрицательного числа (к положительным числам отношения не имеет). Число -1 будет преобразовано так в зависимости от значения этого параметра: '($!)' при 0; '-$!' при 1; '$-1' при 2; '$!-' при 3; '(!$)' при 4; '-!$' при 5; 'i-$' при 6; '!$-' при 7; '-1 $' при 8; '-$ Г при 9; '$ 1-' при 10. |
CurrencyDecimals: Byte; |
Число знаков после запятой в представлении денежных сумм. Например, число 10.15 при разных значениях этого параметра отобразится так: '$10' при 0, '$10.15' при 2, '$10.1500' при 4. |
ThousandSeparator: Char; |
Символ, разделяющий строку на группы по три цифры справа налево (разделитель тысяч). Применяется, в частности, в типе преобразования п. |
DecimalSeparator: Char; |
Символ, отделяющий дробную часть числа от целой. |
Мы закончили рассмотрение символа типа преобразования. Рассмотрим остальные составные части спецификатора формата.
Поле ширины устанавливает минимально допустимое количество символов в преобразованной строке. Это означает, что если она короче, чем задано в этом поле, то происходит добавление пробелов до требуемого количества. По умолчанию пробелы добавляются спереди (выравнивание по правому краю), но признак выравнивания по левому краю ("-"; он должен стоять перед полем ширины) позволяет выравнивать строку по-иному.
Поле индекса позволяет динамически изменить последовательность извлечения аргументов из массива. Обычно аргументы извлекаются последовательно, по мере их востребования спецификаторами формата. Поле индекса означает, что следующим нужно извлечь аргумент с данным индексом. Пользуясь индексом, одни и те же аргументы могут быть использованы многократно. Например, вызов Format ( ' %s %s %0 : s %s ', [ 'Yes', 'No' ] ) Даст на выходе строку 'Yes No Yes No'.
Поле точности играет разную роль в зависимости от того, с каким типом преобразования применяется. Его особенности приведены вместе с описанием типа (с теми из них, где оно имеет смысл).
Поля индекса, ширины и точности могут быть заданы напрямую или косвенно. Первый способ подразумевает явное указание значения поля (например, ' %10 . 5f '). Для косвенного задания значений нужно в соответствующих местах цифры заменить звездочками (например, '%*.*f'). В этом случае вместо звездочек будут подставлены следующие значения из списка аргументов (они обязательно должны быть целыми числами). Например, выражение
Format('Value is %*.*',[10,5, 2.718]);
эквивалентно:
Format('Value is %10.5',[2.718]);
Как уже упоминалось, наиболее употребимой функцией из группы форматирующих является Format, которая работает со строками типа string и максимально освобождает программиста от рутинной работы. Другие функции используют то же ядро и правила преобразования, но отличаются параметрами:
procedure FmtStr(var Result: string; const Format: string; const Args: array of const); |
To же, что и Format, но оформлено в виде процедуры. Результат преобразования возвращается в параметре Result. |
function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar; |
Форматирующая строка должна находиться в параметре Format, а результирующая помещается в буфер Buffer (он должен иметь нужную длину). Функция возвращает указатель на Buffer. |
function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar; const Args: array of const) : PChar; |
Работает как StrFmt, но длина результирующей строки не будет превышать MaxLen символов. |
function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const) : Cardinal; |
Форматирующая строка находится в буфере Format длиной FmtLen, a результирующая -- в буфере Buffer длиной BufLen. Функция возвращает число реально помещенных в Buffer символов, причем оно всегда меньше или равно BufLen. |
Функции преобразования чисел с плавающей точкой
Преобразование числа с плавающей точкой (далее в этом разделе просто числа) в текстовую строку и обратно всегда было достаточно сложной задачей. Для ее решения в Delphi есть функции сразу трех уровней сложности.
Первый -- самый простой -- представлен функцией FloatToStr:
function FloatToStr **-**-alue : Extended): string;
Число, заданное параметром Value, преобразуется в возвращаемую функцией строку. Формат преобразования соответствует типу преобразования g функции Format, причем длина выходной строки принимается равной 15 символам.
Больше возможностей для управления форматом вывода дает функция:
function PloatToStrF(Value: Extended; Format:
TFloatFormat; Precision, Digits: Integer): string;
Здесь Value -- преобразуемое значение, Format -- один из предопределенных форматов. Хотя этот параметр имеет тип TFloatFormat, он имеет очень много общего с типами преобразований в функции Format (ссылки на них есть в предлагаемой таблице). Параметр Precision задает общее число символов в выходной строке и не должен превышать 7 для фактического параметра типа Single, 15 -- для Double и 18 -- для Extended. Digits -- это параметр, интерпретируемый в зависимости от значения параметра Format:
ffExponent |
Научный формат, соответствует типу е. Precision задает общее число символов, Digits -- число знаков в показателе экспоненты {0-4). |
ffFixed |
Формат с фиксированной точкой; соответствует типу f. Precision задает общее число символов, Digits -- число знаков после запятой (0-18). Если значение Precision мало для представления числа, используется научный формат. |
ffGeneral |
Обобщенный формат, соответствует типу д (см. описание функции Format). |
ffNumber |
Отличается от fTFixed наличием символов-разделителей тысяч (см. тип преобразования п). |
ffCurrency |
Соответствует типу преобразования т. Параметр Digits задает число символов после десятичной точки в выходной строке (0-18). |
В случае, когда в функцию переданы значения Value, соответствующие особым случаям сопроцессора ("не-число", плюс и минус бесконечность), она возвращает соответственно строки 'NAN', 'INF' и '-INF'.
Наконец, возможность полного управления форматом предоставляет функция FormatFloat:
function FormatFloat(const Format: string; Value: Extended): string;
Она преобразует число в строку в соответствии со спецификатором формата, содержащимся в параметре Format. Правила его задания следующие:
0 |
Поле для цифры. Если форматируемая величина имеет в этой позиции цифру, то вставляется она, в противном случае вставляется 0. |
# |
Поле для цифры. Если форматируемая величина имеет в этой позиции цифру, то вставляется она, в противном случае ничего не вставляется. |
|
Поле для десятичной точки. Сюда вставляется символ, определенный константой DecimalSeparator. |
; |
Поле для разделителя тысяч. Оно означает, что группы по три цифры, считая влево от десятичной точки, будут разделяться специальным символом (он задан константой ThousandSeparator). Местоположение поля может быть произвольным. |
Е+, Е-, е+, е- |
Признаки представления числа в научном формате. Появление любого из этих аргументов означает, что число будет преобразовано с характеристикой и мантиссой. Вставка нулей после такого аргумента позволяет определить ширину мантиссы. Разница между Е+, е+ и Е-, е-в том, что в первых двух случаях ставится "+" при выводе положительных чисел. |
'хх' "хх" |
Символы, заключенные в обычные или двойные кавычки, напрямую включаются в выходную строку. |
; |
Разделяет спецификаторы формата для положительных, отрицательных и нулевых чисел. |
Примечания:
1. Число всегда округляется до той точности, которую позволяет заданное программистом количество полей для размещения цифр ('0' и '#').
2. Если у преобразуемого числа слева от десятичной точки получается больше значащих цифр, чем задано полей для их размещения, то цифры все равно добавляются в строку. Если полей недостаточно справа от точки, происходит округление.
3. Символ ';' позволяет задать три разных формата вывода для чисел с разным знаком. При различном количестве форматов они применяются следующим образом:
* один: применяется для всех чисел;
* два: первый применяется для чисел, больших или равных нулю, второй -- для отрицательных;
* три: первьш применяется для положительных, второй -- для отрицательных чисел, третий -- для нуля.
Если форматы для отрицательных чисел или нуля пусты, применяется формат для положительных чисел.
Если пуст формат для положительных чисел или спецификатор формата вообще не задан (пустая строка), то числа форматируются согласно обобщенному формату (как в функции FloatToStr). Такое форматирование применяется также в случае, если число значащих цифр слева от десятичной точки превысило 18 и не задан научный формат.
Применение спецификатора иллюстрируется в таблице на примере преобразования четырех чисел:
Спецификатор |
1234 |
-1234 |
0.5 |
0 |
0 |
1234 |
-1234 |
1 |
0 |
0.00 |
1234.00 |
-1234.00 |
0.50 |
0.00 |
#.## |
1234 |
-1234 |
.5 |
|
#.##0.00 |
1,234.00 |
-1,234.00 |
0.50 |
0.00 |
#,##0.00;(#,##0.00) |
1,234.00 |
(1,234.00) |
0.50 |
0.00 |
#,##0.00;;Zero |
1,234.00 |
-1,234.00 |
0.50 |
Zero |
О.ОООЕ+00 |
1.234Е+03 |
-1.234Е+03 |
5.000Е-01 |
О.ОООЕ+00 |
#.###Е-0 |
1.234ЕЗ |
-1.234ЕЗ |
5Е-1 |
ОЕО |
Две следующие функции применяют те же правила, что и рассмотренные выше функции, но отличаются параметрами:
function FloatToText(Buffer: PChar; Value: Extended; Format: TFloatFormat; Precision, Digits: Integer) : Integer; |
Соответствует FloatToStrF, но выходная строка помещается в буфер Buffer (без начальной длины!), а число символов в ней возвращается самой функцией. |
function FloatToTextFmt(Buffer: PChar; Value: Extended; Format: PChar): Integer; |
Соответствует FormatFloat, но выходная строка помещается в буфер Buffer (без начальной длины!), а число символов в ней возвращается самой функцией. |
Наконец, процедура:
procedure FloatToDecimal(var Result: TFloatRec; Value: Extended; Precision, Decimals: Integer); |
Производит подготовительный анализ преобразуемого числа, занося в поля записи Result различные его характеристики. |
Перейдем к рассмотрению функций преобразования текстовой строки в число. Их две -- соответственно для строк типа string и PChar:
function StrToPloat(const S: string): Extended;
function TextToFloat(Buffer: PChar; var Value: Extended): Boolean;
Общие правила для передаваемой в функцию строки таковы:
* допускаются как научный, так и фиксированный форматы;
* в качестве десятичной точки должен выступать символ, который содержится в DecimalSeparator;
* не допускаются символы-разделители тысяч (ThousandSeparator), а также символы обозначения денежньк единиц.
В случае ошибки преобразования функция StrToFloat генерирует исключительную ситуацию EConvertError, a TextToFloat -- возвращает значение False.
Функции работы с датами и временем
В Delphi для хранения дать! и (или) времени предусмотрен формат TDateTime, представляющий собой, на самом деле, обычное число с плавающей точкой.
При этом дата представляется целой частью числа, а время -- дробной. Преимущество этого подхода в том, что теперь дать! и времена можно корректно складывать и вычитать, например:
var StartTime: tDateTime;
procedure TFormI.PormCreate(Sender: TObject);
begin
StartTime := Now;
end;
procedure TFormI.FormClick(Sender: TObject);
begin
Labell.Caption := 'Co времени запуска прошло' +
DateTimeToStr(Now - StartTime);
end;
Функции этой группы приведены в таблице:
function EncodeDate(Year, Month, Day: Word): TDateTime; |
Преобразует дату, заданную раздельно годом, месяцем и днем, в формат TDateTime. Если они выходят за допустимые пределы, возникает ИС EConvertError. |
procedure DecodeDatefDate: TDateTime; var Year, Month, Day: Word); |
Преобразует дату в виде TDateTime к раздельным составляющим: году, месяцу и дню. |
function EncodeTimefHour, Min, Sec, MSec: Word): TDateTime; |
Преобразует значение времени, заданное часом, минутой, секундой и миллисекундой в формат TDateTime. |
procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word) ; |
Преобразует значение времени в формате TDateTime в раздельные составляющие: час, минуту, секунду и миллисекунду. |
function DayOfWeektDate: TDateTime): Integer; |
Возвращает номер текущего дня недели от 1 (воскресенье) до 7 (суббота). |
function Date: TDateTime; |
Возвращает текущую дату. |
function Time: TDateTime; |
Возвращает текущее время. |
function Now: TDateTime; |
Возвращает текущие дату и время. |
function DateToStr(Date: TDateTime): string; |
Преобразует дату Date в текстовую строку. |
function TimeToStr(Time: TDateTime): string; |
Преобразует время из типа TDateTime в текстовую строку. |
function DateTimeToStr(DateTime: TDateTime): string; |
Преобразует дату и время из типа TDateTime в текстовую строку. |