Методические указания для проведения практических и лабораторных занятий по дисциплине "Программирование на языке высокого уровня" для студентов специальностей 220200 Автоматизированные системы обработки информации и управления

Вид материалаМетодические указания
Подобный материал:
1   2   3   4   5   6   7   8   9   10   11


Примечания:

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

0.000Е+00

#.###Е-0

1.234ЕЗ

-1.234ЕЗ

5Е-1

0Е0


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

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.


4.5. Функции работы с датами и временем


В 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 в текстовую строку.




function StrToDatefconst S: string): TDateTime;

Преобразует текстовую строку в дату типа TDateTime. Строка должна содержать два или три числа, разделенных символом, содержащимся в DateSeparator. Формат даты в строке определяется в соответствии со значением переменной ShortDateFormat.

function StrToTime(const S: string): TDateTime;

Преобразует текстовую строку S в значение времени. Должен использоваться формат HH:NN:SS, где SS — может принимать значения 'AM' или ТМ', иначе означает секунды. Если необходимо получать время в 24-х часовой шкале, то элемент SS формата опус­кается. Если преобразование невозможно, возникает ИС EConvertError.

function

StrToDateTime(const S: string): TDateTime;

Преобразует текстовую строку S в дату и время в формате MM/DD/YY HH:NN:SS (элемент SS см. выше).

function FormatDateTime(const Format: string; DateTime: TdateTime): string;

Преобразует дату и время из типа TDateTime в тек­стовую строку, используя формат, задаваемый параметром Format (см. примеч. 1).

procedure DateTimeToStringfvar Result: string; const Format: string; DateTime: TDateTime);

Преобразует дату и время типа TDateTime в строку Result, используя формат, передаваемый параметром Format (см. примеч. 1).


Примечания:

1. Правила задания спецификатора формата для даты и времени отлича­ются от рассмотренных выше. В первую очередь надо иметь в виду то, что функции вроде FormatDateTime оперируют над одним значением TDateTime, а спецификаторы формата извлекают из него те или иные составные части. При этом могут использоваться:

с

Отображает дату, используя формат ShortDateFormat, затем отобра­жается время в формате LongTimeFormat. Время не отображается, если дробная часть переменной DateTime нулевая.

d

Отображает число месяца без нуля в левом разряде (1-31).

dd

Отображает число месяца с нулем в левом разряде (01-31).

ddd

Отображает день недели в соответствии с сокращенными именами из переменной ShortDayNames.

dddd

Отображает день недели в соответствии с полными именами из переменной LongDayNames.

ddddd

Отображает дату в соответствии с форматом ShortDateFormat.

dddddd

Отображает дату в соответствии с форматом LongDateFormat.

m

Отображает месяц как число без нуля в левом разряде (1-12).

mm

Отображает месяц как число с нулем в левом разряде (01-12).




irirnm

Отображает месяц в соответствии с сокращенными именами из переменной ShortMonthNames.

П1ГПГПП1

Отображает месяц в соответствии с полными именами из переменной Long MonthN am es.

УУ

Отображает год двумя цифрами.

УУУУ

Отображает год четырьмя цифрами.

h

Отображает час как число без нуля в левом разряде (0-23).

hh

Отображает час как число с нулем в левом разряде (00-23).

n

Отображает минуты как число без нуля в левом разряде (0-59).

nn

Отображает минуты как число с нулем в левом разряде (00-59).

s

Отображает секунды как число без нуля в левом разряде (0-59).

ss

Отображает секунды как число с нулем в левом разряде (00-59).

t

Отображает время в соответствии с форматом ShortTimeFormat.

tt

Отображает время в соответствии с форматом LongTimeFormat.

am/pin

Отображает время в 12-часовой шкале. 'AM' означает часы до полудня, 'РМ' — часы после полудня.

arnpm

Отображает время в 12-часовой шкале. При этом для времени до полудня отображается содержимое переменной TimeAMString, а после полудня — TimePMString.

a/p

Отображает время в 12-часовой шкале, 'а' означает часы до полудня, 'р' — часы после полудня.

/

Отображает символ — разделитель даты, содержащийся в переменной DataSeparator.




Отображает символ — разделитель времени, содержащийся в переменной TimeSeparator.

'XX'/'XX'

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


Например, результатом вызова функции с параметрами

FormatDateTime (' "Совещание состоится в" dddd, dirrmim, yyyy, ' + ' "в" hh:nn', StrToDateTime('12/31/95 23:55')) ;

будет строка 'Совещание состоится в среду, 31 декабря 1995 в 23:55' (естес­твенно, если вы переопределили значения элементов массива LongMonth-Names).

2. Спецификаторы am/pm, ampm, a/p используются вместе со спецификато­рами h и hh.

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

4. Начальные значения всех используемых при форматировании даты и вре­мени переменных берутся из секции [inti] файла WIN.INI.

2Л4.6. Функции для работы с памятью

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

function AllocMemfSize: Cardinal): Pointer;

SYSUTILS

Выделяет блок памяти размером Size и возвращает указатель на него. Выделенная память обнуляется.

function ReAllocMem(P: Pointer; CurSize, NewSize: Cardinal): Pointer;

SYSUTILS

Изменяет размер блока памяти разме­ром CurSize, на который указывает Р. Если удается выделить блок размером NewSize, функция возвращает указатель на него. Содержимое старого блока переносится в новый. При этом, если CurSize>NewSize, часть содержимого отбрасывается, а если CurSize

function MemAlloc(Size: Longint): Pointer;

GRAPHICS

Выделяет блок размером Size. Если он меньше 64К, память выделяется в куче памяти Delphi, в противном случае — глобальная.


Память, выделенная при помощи этих функций, может быть освобождена при помощи функции FreeMem.

У компонента же определение конструктора на удивление лаконично, но в нем присутствует указатель на Owner:

constructor Create(AOwner: TComponent);

Ответ прост: Owner — тот объект, который при создании вызывает конструк­торы всех объектов, владельцем которых он является, а при уничтожении — их деструкторы. Таким образом, поместив при разработке компонент на форму, вы можете не заботиться о его создании и уничтожении в программе. Все свойства таких компонентов и все связи между ними запоминаются в файле формы .DFM и при запуске приложения создаются вновь автоматически.

Деструктор компонента

destructor Destroy;

уничтожает все дочерние компоненты (вызывая их деструкторы) и вычеркивает себя из списка компонента-владельца.

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

Принадлежащие компоненты оформлены в виде списка, доступного через свой­ство Components. В классе TComponent предусмотрен набор методов и свойств для управления этим списком:

property Components[Index: Integer]: TComponent;

Возвращает указатель на компонент с индексом в списке Index.

property ComponentCount: Integer;

function FindComponent(const AName: string): TComponent;

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

Возвращает ссылку на компонент-потомок с заданным именем.

procedure InsertComponent(AComponent: TComponent) ;

procedure Rerr.oveCornponent (AComponent: TComponent) ;

Вставляет компонент в конец списка.

Удаляет компонент из списка.

procedure DestroyComponents;

Удаляет все компоненты из списка.


Изменять владельца компонента во время исполнения можно, но без особой необходимости не нужно. Дело в том, что используемый для этого метод RemoveComponent не только вычеркивает компонент из списка, но и обнуляет указатель на него в соответствующем поле владельца. Например, если во время визуального проектирования вы поместили на форму кнопку Buttoni, а затем во время выполнения изменили ее владельца, то все обращения к ней в прог­рамме как к Buttoni стали недействительны.

Рассмотрим другие свойства компонента. Он может находиться в одном из множества следующих состояний:

property ComponentState: TCornponentState;

TComponentState = set of (csLoading, csReading, csWriting, csDestroying, csDesigning) ;

Эти состояния используются средой во время визуального проектирования, при загрузке/выгрузке компонентов из файлов ресурсов. Во время исполнения приложения множество состояний пусто. Лишь метод

procedure Destroying;

устанавливает в состоянии компонента флаг csDestroying и вызывает ана­логичный метод у всех потомков из списка. Он также используется в дест­рукторе компонента.

Свойство Designlnfo относится к стадии разработки (конструирования) приложения:

property Designlnfo: Longint;

В нем хранятся координаты верхнего левого угла компонента во время раз­работки.