ИнфТехнКомпТехн
.pdfCloseFile(OutFile);
readln; |
// Пауза |
end. |
|
Внимание:
Size – размер выделяемой памяти в записях (по умолчанию это 128 байт). Для пары процедур GetMem, FreeMem имя указателя и размер памяти должны быть одинаковы. Удалять нужно точно те байты, которые выделялись. В процедуре FreeMem размер можно пропустить, по умолчанию он будет таким же, как в процедуре GetMem.
Выводы
1.В программах применяются переменные:
статические, под которые память выделяется при компоновке на все время работы программы;
динамические, под которые память выделяется в процессе работы на время надобности в них.
2.Динамические структуры обеспечивают экономное использование памяти, особенно когда переменных много и они не всегда нужны.
3.Динамические структуры заданного типа (размера) создаются с использованием типизированных указателей p процедурой New(p), а освобождаются процедурой Dispose(p). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется типом данных.
4.Динамические структуры произвольного размера создаются c использованием указателей p процедурой GetMem(p, Size), а освобождаются процедурой FreeMem(p, Size). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется значением Size (фактически это Size*128).
5.После освобождения памяти рекомендуется сделать указатель неопределенным, пРисвоив ему значение Nil.
12. Исключения
Подготовка к работе
1.По рекомендованной литературе изучить класс исключений и их обработку.
2.Разработать алгоритмы решения задач.
3.Составить программы решения задач.
4.Контрольные вопросы
5.Что такое исключение?
6.Классы исключений и их свойства.
7.Оператор try…except. Назначение, структура и применение.
8.Оператор try…finally. Назначение, структура и применение.
9.Глобальные и локальные обработчики исключений.
10.Обработчик исключения on…do.
11.Исключение EZeroDivide.
12.Исключение ERangeError.
13.Как включить отработку исключения ERangeError.
14.Как отключить перехват исключения системой.
Задание к работе
1.Создать программу, обрабатывающую исключения с использованием оператора try… except. Проект – консольное приложение.
201
2.Создать программу, обрабатывающую исключение с использованием оператора try… finally. Проект – консольное приложение.
Взаданиях надо рассчитывать функции f1(x) и f2(x) при x = i*h. i - индекс цикла (целые числа в интервале -10...10). Шаг изменения h. Варианты заданий приведены в табл. 12.1.
Таблица 12.1 - Варианты заданий
|
Функция 1 |
|
|
Функция 2 |
|
|
||
|
f1(x) |
|
h1 |
тип |
f2(x) |
|
h2 |
тип |
1 |
1/x |
|
π/5 |
real |
200+x |
|
10 |
byte |
2 |
1/sin(x) |
|
π/5 |
single |
(300+x)*50 |
|
100 |
word |
3 |
1/cos(x) |
|
π/5 |
extended |
300+x |
|
10 |
shortint |
4 |
tg(x) |
|
π/5 |
real |
(200+x)*200 |
|
10 |
smallint |
5 |
ctg(x) |
|
π/5 |
single |
100+x |
|
15 |
byte |
|
|
|
|
|
|
|
|
|
6 |
1+1/x |
|
π/10 |
extended |
(300-x)*50 |
|
20 |
word |
7 |
2+1/sin(x) |
|
π/10 |
real |
50+x |
|
30 |
shortint |
8 |
3+1/cos(x) |
|
π/10 |
single |
200+x |
|
10 |
smallint |
9 |
4+tg(x) |
|
π/10 |
extended |
250+x |
|
50 |
byte |
|
|
|
|
|
|
|
|
|
10 |
5+ctg(x) |
|
π/10 |
real |
200-x |
|
30 |
word |
11 |
1-1/x |
|
π/20 |
single |
200+x |
|
10 |
shortint |
12 |
2-1/sin(x) |
|
π/20 |
extended |
(200+x)*200 |
|
10 |
smallint |
13 |
3-1/cos(x) |
|
π/20 |
real |
400+x |
|
100 |
byte |
14 |
4- tg(x) |
|
π/20 |
single |
200+x |
|
10 |
word |
15 |
5-ctg(x) |
|
π/20 |
extended |
100-x |
|
30 |
shortint |
Необходимо отслеживать два исключения:
Деление на 0 (исключение EZeroDivide).
Выход за пределы диапазона (исключение ERangeError).
Внимание:
Встроенный отладчик Delphi перехватывает все исключительные ситуации и формирует свои сообщения о них в диалоговом окне, которое пользователь перед продолжением программы должен закрыть. Чтобы избежать этого, следует отменить использование отладчика, сбросив флаг «Встроенный отладчик» в окне команды Сервис=>Опции отладчика.
Чтобы отслеживать исключения в операциях с числами, необходимо в окне команды Проект=>Опции... на вкладке «Компилятор» установить флаги директив компилятора:
Проверка области.
Проверка ввода/вывода.
Проверка переполнения.
При работе с программой рекомендуется менять h1 и h2, чтобы получать разные результаты и условия возможного возникновения исключений.
Пример выполнения Вариант задания:
f1(x) = 1/sin(x), h1 = π/6, тип данных для f1(x) Real.
f2(x) =100+x, h2 = 4, тип данных для f2(x) Byte
Задание 1
Создать программу обработки исключений, использующую оператор try…except. Проект – консольное приложение.
202
Окно работающего приложения задания 1 показано на Рис. 12.1 для трех вариантов: исключений нет, ошибка деления на 0,ошибка диапазона.
|
Рисунок 12.1 – Варианты приложения |
|
|
|
||
Листинг программы |
|
|
|
|
|
|
program Prg_11_1; |
|
|
|
|
|
|
{$APPTYPE CONSOLE} |
|
|
|
|
|
|
uses |
|
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
|
|
const |
|
|
|
|
|
|
h1=pi/8; |
|
|
|
|
|
|
h2=20; |
|
|
|
|
|
|
var |
|
|
|
|
|
|
f:boolean=false; |
|
y:array[-10..10] |
of |
real; |
||
i,imax,imin,i_error:integer; |
||||||
b:array[-10..10] of byte; |
|
|
|
|
|
|
begin |
|
Imin и |
Imax в пределах -10...10')); |
|||
writeln(Rus('Введите |
||||||
write(' |
Imin='); readln(imin); write(' |
Imax='); |
|
|||
readln(imax); |
|
|
|
|
|
|
try |
|
|
|
|
|
|
for i:=imin to imax do |
|
|
|
|
|
|
begin |
|
ошибка |
|
|
|
|
i_error:=i;// i, если |
|
|
|
|
||
y[i]:=1/sin(i*h1); |
|
|
|
|
|
|
end; |
|
|
|
|
|
|
for i:=imin to imax do |
|
|
|
|
|
|
begin |
|
ошибка |
|
|
|
|
i_error:=i;// i, если |
|
|
|
|
||
|
|
203 |
|
|
|
b[i]:=100+i*h2;
end; except
on EZeroDivide do begin writeln(Rus('Деление на 0')); writeln(Rus('при i='),i_error); f:=true;
end;
on ERangeError do begin writeln(Rus('Ошибка диапазона')); writeln(Rus('при i='),i_error); f:=true;
end;
end;
if not f then writeln('OK'); readln; end.
Задание 2
Создать программу обработки исключений, использующую оператор try…finally. Проект – консольное приложение.
Листинг программы |
|
|
|
|
|
|
|
||
program Prg_11_2; |
|
|
|
|
|
|
|||
{$APPTYPE CONSOLE} |
|
|
|
|
|
|
|||
uses |
|
|
|
|
|
|
|
|
|
SysUtils,RusTrans; |
|
|
|
|
|
|
|||
const |
|
//шаг |
для f1 h2=40; |
//шаг |
для f2 |
|
|||
h1=pi/6; |
|
||||||||
var |
|
|
|
|
ошибки |
|
|
|
|
f:boolean=false;//флаг |
|
|
|
||||||
i,Imin,Imax,i_error,dy:integer; |
|
|
|
||||||
s:string; |
|
|
|
|
|
|
|
|
|
y:array[-10..10] of real; |
|
|
|
|
|||||
b:array[-10..10] of byte; |
|
|
|
|
|||||
begin |
|
|
|
Imin и |
Imax в пределах -10...10')); |
|
|||
writeln(Rus('Введите |
|
||||||||
write(' |
Imin='); readln(imin); write(' |
Imax='); |
|
||||||
readln(imax); |
Try |
|
|
|
|
|
|
||
try |
//Секция |
|
//Начало оператора |
1 |
|
||||
for i:=Imin to Imax do |
|
|
|||||||
begin |
|
|
|
ошибка |
|
|
|
|
|
i_error:=i;// i, если |
|
|
|
|
|||||
if sin(i*h1)=0 |
|
|
|
|
|
|
|
||
then begin |
//Установить |
флаг |
ошибки |
|
|
||||
f:=true; |
сообщения |
об |
|||||||
writeLn(Rus('Деление |
на |
0')); |
//Вывод |
||||||
ошибке |
|
|
|
|
|
|
|
|
|
writeln(Rus('при i='),i_error); |
|
|
|
||||||
end |
|
|
|
|
|
|
|
|
|
else f:=false; |
|
|
|
|
|
|
|
y[i]:=1/sin(i*h1);
end;
204
for i:=Imin to Imax do |
//начало оператора 2 |
|
|||||
begin |
|
|
ошибка |
|
|
|
|
i_error:=i;//i, если |
|
|
|
||||
dy:=i*h2; |
|
|
|
|
|
|
|
if (dy<-30) or (dy>225) |
|
|
|
|
|||
then begin |
//Установить |
флаг |
ошибки |
writeLn(Rus('Ошибка |
|||
f:=true; |
|||||||
диапазона')); |
//Вывод |
|
сообщения |
об |
ошибке |
||
writeln(Rus('при |
i='),i_error); |
|
|
||||
end |
|
|
|
|
|
|
|
else f:=false; |
|
|
|
|
|
|
|
b[i]:=30+i*h2; |
|
|
|
|
|
|
|
end; |
//Секция |
Finally |
|
|
|
||
finally |
//OK, если ошибок |
нет |
|||||
if not f then writeln('OK'); |
|||||||
end; //Конец Try...Finally |
|
|
|
||||
readln; |
//Пауза |
|
|
|
|
|
|
end. |
|
|
|
|
|
|
|
Окно работающего приложения задания |
2 в целом совпадает с |
окном задания 1. |
|||||
Однако оператор try…finally не |
обрабатывает |
исключение. |
|
|
Выводы
1.При исполнении программ возможны исключения (ситуации с ошибками). Примеры исключений - деление на ноль EZeroDivide, выход значений за пределы допустимого диапазона ERangeError.
2.Встроенный отладчик Delphi перехватывает все исключительные ситуации и формирует свои сообщения о них в диалоговом окне, которое пользователь перед продолжением программы должен закрыть. Чтобы избежать этого, следует отменить использование отладчика, сбросив флаг «Встроенный отладчик» в окне команды Сервис=>Опции отладчика.
3.Чтобы отслеживать исключения в операциях с числами, необходимо в окне команды Проект=>Опции... на вкладке «Компилятор» установить флаги директив компилятора: Проверка области, Проверка ввода/вывода, Проверка переполнения.
4.Для обработки исключений используются обработчики исключений (глобальные и локальные). Глобальные обработчики определены в ИСР и вызываются автоматически, если отладчик подключен. Локальные обработчики создает пользователь.
5.Для локальной обработки исключений определен оператор try…except…end. В секции try размещаются операторы, в которых могут возникнуть исключения, а в секции except обработчики исключений. При обнаружении исключения ис-
6.полнение операторов секции try прекращается, управление передается нужному обработчику в секции except.
7.Обработчик исключения имеет формат on <исключение> do <оператор> end.
8.Для обнаружения исключений определен оператор try…finally. В секции try размещаются операторы, в которых могут возникнуть исключения, а в секции finally операторы, исполняемые всегда. При возникновении исключения исполнение
9.операторов секции try прекращается, управление передается первому оператору секции finally. После исполнения секции finally в случае ошибки появиться сообщение системного обработчика исключений.
i.Списки
205
Подготовка к работе
По указанной литературе изучить определенные в ИСР Delphi списки и основные команды, используемые для работы с ними.
Контрольные вопросы
1.Списки, их назначение.
2.Компоненты списков ListBox (список) и ComboBox (комбинированный список) в ИСР Delphi. Их назначение и сравнение.
3.Создание в форме компонентов списков.
4.Свойства Count (количество) и Capacity (емкость) компонент списков.
5.Свойства Items (элементы) и ItemIndex (номер элемента) компонент списков. Нумерация элементов списков.
6.Предварительное редактирование списков.
7.Свойство Text (текст) компонента ComboBox.
8.Программное редактирование строк компонентов списков..
9.Метод добавить элемент Add(Item) и его использование.
10.Метод ввести элемент Insert(Index,Item) и его использование.
11.Метод удалить элемент Delete(Index) и его использование.
12.Метод очистки Clear и его использование.
13.Метод поменять элементы Exchange(Index1, Index2) и его использование.
14.Метод переместить элемент Index1 в позицию Index2 Move(Index11, Index2) и его использование.
Задание
1.Активизировать ИСР.
2.Создать пустую форму проекта и задать ее свойства.
3.Заполнить форму компонентами в соответствии с заданием.
4.Посмотреть текст модуля формы в редакторе кода.
5.Написать коды обработчиков событий.
6.Отладить проект.
7.Сохранить проект на локальной машине.
8.Выход из ИСР.
9.Скопировать проект на сервер.
Пример выполнения Задание
Создать проект работы со списками. В проекте предусмотреть:
1.Заполнение комбинированного списка из поля ввода.
2.Редактирование комбинированного списка (ввести строку, переместить строку).
3.Копирование строк из списка ComboBox в список ListBox,
Рекомендуемая форма программы приведена на Рис. 13.1.
206
Рисунок 13.1 - Форма программы
Форма содержит следующие компоненты:
ListBox1 - простой список.
Label1 – метка для заголовка компонента ListBox1.
ComboBox1 - комбинированный список.Label2 – метка для заголовка компонента ComboBox1.
Edit1однострочный редактор для ввода текста. В него вводится текст строки для списка.
Label3 – метка для заголовка редактора Edit1.
Button1– кнопка "Инициализация". Позволяет очистить поле Edit1 и установить там курсор.
Button2 – кнопка "Принять в ComboBox" для заполнения компонента
ComboBox1.
Button3 – кнопка "Редактировать ComboBox". Позволяет вводить, удалять, взаимозаменять и перемещать строки в списке.
Button4 – кнопка "Копировать в ListBox". Позволяет скопировать в ListBox строки, выбираемые в ComboBox.
Выполнение
1.Активизируем ИСР, выбрав Delphi в проводнике Windows.
2.Экран имеет вид, показанный на Рис. 12.2. По умолчанию выводится пустая форма, которую нужно заполнить компонентами. В окне Дерева объектов отображен компонент Форма с именем Form1 по умолчанию
Задание свойств формы.
Выбираем объект Form1 и подбираем его размеры и положение. В окне Инспектора объектов назначаем свойства формы:
Свойство |
Значение |
|
|
English |
Перевод |
English |
Русское |
Name |
Имя |
Prg_12_1 |
|
Caption |
Надпись |
Prg_12_1 |
Программирование_ Номер_Задание |
Position |
Положение |
poScreenCenter |
В центре экрана |
У формы меняется заголовок Form1=> Prg_12_1.
207
Заполнение формы
При заполнении формы в палитре компонент выбирается нужный блок и переносится в форму. Там подбираются его положение и размеры. Затем в окне Инспектора объектов назначаются свойства компонента. Большая часть свойств устанавливается автоматически, их редактировать не следует. Нужные нам компоненты размещаются в палитре компонент на странице Standard.
Для кнопок необходимо добавить функциональность, написав код обработчика события нажатия. При двойном щелчке по кнопке ИСР автоматически объявляет подпрограмму обработчика. В код модуля формы проекта заносятся:
1.В поля объекта заголовок обработчика. Заголовок обработчика формируется автоматически. Его имя содержит записанные без пробелов имя компонента и события с префиксом on, которое отрабатывается.
2.В раздел реализации шаблон обработчика. Он имеет заголовок, совпадающий с заголовком в поле объекта с добавлением имени формы в начале заголовка. В него между операторными скобками begin…end надо внести текст подпрограммы
обработки события.
Для некоторых обработчиков могут потребоваться и локальные переменные.
Листинг модуля формы: unit Prg_12_1_; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TPrg_12_1 = class(TForm)
ListBox1: TListBox; ComboBox1: TComboBox; Button1: TButton; Edit1: TEdit;
Button2: TButton;
Label1: TLabel; Label2: TLabel; Label3: TLabel; Button3: TButton; Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject);
private
{Private declarations } public
{Public declarations } end;
var
Prg_12 1: TPrg_12 1; implementation
{$R *.dfm}
procedure TPrg_12_1.Button1Click(Sender: TObject); begin Edit1.Text:=''; Edit1.SetFocus;
end;
procedure TPrg_12_1.Button2Click(Sender: TObject); begin ComboBox1.Items.Add(Edit1.Text); Edit1.Text:=''; Edit1.SetFocus;
end;
procedure TPrg_12_1.Button3Click(Sender: TObject);
208
begin ComboBox1.Items.Insert(comboBox1.ItemIndex,Edit1.Text); Edit1.Text:='';
Edit1.SetFocus;
end;
procedure TPrg_12_1.Button4Click(Sender: TObject); begin
ListBox1.Items.Add(ComboBox1.Items[ComboBox1.ItemIndex]);
end;
end.
После заполнения панелей компонентами форма примет вид Рис. 13.1. Окно Дерево объектов приобретает вид, показанный на Рис. 13.3. Проверьте по нему правильность введенных компонент, их имена и иерархию.
Рисунок13.3 - Дерево объектов после заполнения формы компонентами
3. Сохраним проект в папке с именем 12_1.
Для этого вызовем команду Файл => Сохранить Проект Как, которая приводит к появлению диалогового окна. В нем нужно попасть в нужную папку и сохранить проект. При сохранении проекта приложения необходимо сохранять проект (с именем Prg_12_1) и модуль формы (с именем Prg_12_1_).
4.Проверим программу в работе. Запускаем программу командой. Выполнить. Возникает окно приложения.
Инициализация. Кнопкой Инициализация очищаем Edit1 и передаем ему фокус ввода. Курсор появляется в поле ввода Edit1.
Заполнение списка ComboBox. Для каждой строки в редакторе Edit1 заносим текст, кнопкой. Принять в ComboBox переносим его в список. Повторяем операцию нужное число раз. Каждый раз проверяем список ComboBox, убеждаясь в появлении новой строки в конце.
Редактирование. В редакторе Edit1 заносим строку текста для ввода в
произвольно выбираемую позицию. В ComboBox выделяем позицию для ввода, ее текст перемещается в верхнюю строку редактирования.
Копирование. В ComboBox выделяем позицию для копирования, ее текст перемещается в верхнюю строку редактирования. Кнопкой Копировать в ListBox переносим строку в ListBox. Каждый раз наблюдаем ListBox, чтобы убедится в появлении там новой строки в очередной позиции.
Выводы
1. Списки используются для выбора элементов из большого набора.
209
2.В ИСР Delphi определены несколько компонент списков:
ListBox - простой список строк текста для выбора без редактирования.
ComboBox - комбинированный список строк текста с возможностью выбора и редактирования.
ComboBoxEx - расширенный комбинированный список строк с отображением в строках текста и значков.
3.Все списки содержат массив строк текста, для которых применяются свойства:
Items(Index) - массив строк текста с номером Index. Нумерация с 0.
ItemIdent - номер выделенного элемента.
Count - число элементов в списке.
Capacity - максимальное число элементов в списке.
4.Для работы со списками доступны методы:
Add - добавляет элемент в конец списка.
Insert(Index,Item) - добавляет элемент Item в позицию с номером Index. Список переиндексируется.
Delete (Index) - удаляет элемент с номером Index. Список переиндексируется.
Clear - очищает список. Делает Count=0, Capacity=0.
Exchange(Index1, Index2) - меняет местами элементы с номерами Index1 и Index2.
Move(CurIndex, NewIndex) - перемещает элемент из текущей позиции
CurIndex в новую позицию NewIndex.
5.Список ComboBox может отображаться в полной и краткой формах. В первом случае отображаются строка редактирования и список для выбора. Во втором случае список выбора выпадающий, отображается по требованию.
14. Модули
Подготовка к работе
1.По рекомендованной литературе изучить назначение и использование модулей и DLL (Dynamic Linked Library = динамически связываемая библиотека);
2.Разработать алгоритмы решения задач.
3.Составить программы решения задач.
Контрольные вопросы
1.Что такое модуль? Его назначение и создание.
2.Структура модуля.
3.Назначение и содержание секций Interface, Implementation, Initialization, Finalization.
4.Связывание модуля с вызывающей программой.
5.Что такое DLL? Ее назначение и создание.
6.Структура DLL.
7.Экспортируемые и внутренние подпрограммы DLL.
8.Назначение и содержание списка Exports.
9.Связывание DLL с вызывающей программой.
10.Способы вызова подпрограмм из DLL.
Задание к работе
1.Создать вызывающую программу, использующую модуль комплексной арифметики Complex, содержащий 4 функции: сложение, вычитание, умножение и деление. Вызывающая программа должна выполнить функцию 1 с комплексными операндами Comp1=a + i*b и Comp2=c + i*d b и функцию деления Comp1 на ноль. Варианты заданий в табл. 13.1. Проект – приложение.
210