- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Пример 11
Построить график функции Y = 1/ln(X). (Методика построения графиков приводится при описании примера 4). Данная функция обладает рядом особенностей, которые как раз удобно использовать для иллюстрации исключений. Во-первых, функция не определена при отрицательных значениях аргумента. Во-вторых, она не определена при X = 1 (деление на нуль). Для всех особых точек, естественно, отображать график не будем. Вариант решения задачи приводится на рис. 31.
Рис. 31 Вариант решения примера 11.
Для демонстрации рассматриваемых выше операторов воспользуемся методикой создания собственных исключений. Введём собственный тип - класс ErangeError=class(EmathError);, - являющийся наследником встроенного класса EmathError. Используя ключевое слово Raise, создадим два исключения: одно – ErangeError – для фиксации случая отрицательного аргумента, а другое – переопределим стандартное EDivByZero. Если в программе встретятся другие исключения, то они будут обрабатываться стандартно – в программе эти ситуации определяются просто ключевым словом Raise. Программа для решения примера 11 приводится ниже.
unit prim11;
interface
uses Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
BitBtn1: TBitBtn;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Image1: TImage;
Label3: TLabel;
procedure Edit1KeyPress
(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
end;
ERangeError = class(EMathError);
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Edit1KeyPress
(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9','-','.',#8]) then key:=#0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
xn,xk,y0,yk:integer;
mx,my:real;
x,y,ymax:real;
i:integer;
IsDraw:boolean; {Для переключений при рисовании}
begin
xn:=15;
xk:=280;
y0:=75;
yk:=70;
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
ymax:=10; {Задано произвольно}
IsDraw:=true;
With Image1.Canvas do begin
Pen.Color:=clBlack;
Pen.Width:=1;
Brush.Color:=clWhite;
Rectangle(0,0,Image1.Width,Image1.Height);
MoveTo(xn,y0);
LineTo(xk,y0);
MoveTo(xn,y0+yk);
LineTo(xn,y0-yk);
End;
if b<=a then begin
Label3.Caption:= 'Графика нет';
Exit;
End;
Image1.Canvas.Pen.Color:=clRed;
Image1.Canvas.Pen.Width:=2;
mx:=(b-a)/(xk-xn);
my:=yk/ymax;
for i:=0 to xk-xn do begin
x:=a+i*mx;
try
if x < 0 then Raise ERangeError.CreateFmt
('Шаг i= %d. Отрицательный диапазон',[i]);
if (x > 1-0.5*mx) and (x < 1+0.5*mx)
then Raise EDivByZero.CreateFmt
('Шаг i= %d. Деление на нуль',[i]);
y:=my/ln(x);
if IsDraw then begin
Image1.Canvas.MoveTo(xn+i,y0-round(y));
IsDraw:=false;
end else Image1.Canvas.LineTo(xn+i,y0-round(y));
except
on E:ERangeError do begin
MessageDlg(E.Message,mtWarning,[mbOK],0);
IsDraw:=true;
end;
on E:EDivByZero do begin
Application.MessageBox(PChar(E.Message),
'Предупреждение',mb_OK);
IsDraw:=true;
end else Raise;
end;
end;
end;
end.
В программе для создания объектов исключений используется встроенный конструктор CreateFmt. В качестве аргументов в этот конструктор передаётся строка, используемая для форматированного вывода (символ % представляет спецификатор формата, а последующий символ d – тип формата – вывод цифровых значений), и конструктор открытого массива, в котором в квадратных скобках указываются отдельные элементы вывода.
Выполнять программу в данном случае необходимо не из среды Delphi, а вызывая соответствующий EXE-файл, иначе будут сгенерированы дополнительные исключительные ситуации, связанные с информацией отладчика.
