ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.03.2025
Просмотров: 408
Скачиваний: 1
Изменение данных в файле
Рассмотрим изменение значений в полях файла. Допустим, что на основе имеющихся значений необходимо вычислить новые. Для этого требуется следующая процедура:
procedure TForm1.Button1Click(Sender: TObject);
Var
Hind :integer;
begin
with Table1 do
begin
{Отключим отображение данных на период изменений, для экономии времени}
DisableControls;
First;
while not eof do
begin
{Читаем значение во временную переменную}
hind:=FieldByName('price').AsInteger;
hind:=trunc(0.75*hind); {Изменим значение}
Edit;{Поместим таблицу в режим редактирования}
{Запишем обратно измененное значение}
FieldByName('price').AsInteger:=hind;
post; {Запишем измененное значение в файл}
next;
end;
EnableControls;{Включим отображение данных}
end;
end;
Приведенный способ изменения данных в файле целесообразен, если новые значения получены в результате выполнения вычислений по достаточно сложным алгоритмам, которые не удастся реализовать более простыми средствами обработки данных. Таким же образом можно реализовать кнопки нажатия и пункты меню для изменения данных в файлах базы данных по введенным с экрана значениям.
Графические возможности Delphi
Часто графический способ представления информации более предпочтителен по сравнению с текстовым. В составе Delphi имеются широкие графические возможности, начиная с построения простейших геометрических фигур и кончая высококачественными средствами мультимедиа, включающими в себя движущиеся рисунки со звуковым сопровождением.
Графические элементы
Область рисунка на форме называется канвой (холстом, canvas). В Delphi канва рассматривается как свойство. Для рисования на экране в нашем распоряжении имеется условное “перо”, которое может передвигаться из одной точки в другую без рисования или с рисованием. “Перо” может рисовать разными цветами, разной толщиной и разными линиями (сплошной, пунктирной ). Для передвижения “пера” необходимо задать координаты начальной и конечной точек. Возможно рисовать “пером” сколь угодно сложные кривые. Для этого надо последовательно дать координаты всех точек, через которые оно должно идти. Точка на экране, которая является минимальным адресуемым элементом, называется пикселем. Пиксел задается своими координатами и кодом цвета, которым должна быть отмечена эта точка.
Проиллюстрируем сказанное на примерах. На первых порах областью наших рисунков будет вся форма. Можно создать специальные окна для рисунков, но их создание ничем не отличается от рассмотренной раньше работы с многими формами. Нарисуем на экране линию. Внешний вид экрана представлен на рис. 8.1.
Рис. 8.1. Простейший пример графического вывода
Реализация кнопки “Рисуй”:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.MoveTo(5,5); {Установим перо в заданную точку}
Canvas.LineTo(140,150); {Рисуем линию от исходной точки до заданной}
end;
Можно менять характеристики рисуемых линий, для этого используем свойства:
выбор цвета Canvas.Pen.Color:=clBlue;
выбор толщины линии Canvas.Pen.Width:=3;
выбор стиля линии Canvas.Pen.Style:=psDot;
Какие допускаются цвета, стили и толщины можно узнать через Help. Вопрос: Как менять цвет фона т.е. самой формы?
Для рисования ломаных линий можно пользоваться методом
PolyLine([массив точек]), например,
Canvas.PolyLine([Point(10,10),Point(100,100),Point(50,75)]);
нарисует две линии с общей точкой (100,100). Очевидно, что для рисования замкнутых контуров (например, треугольника) координаты первой и последней точки должны совпадать. В принципе, таким же образом можно рисовать любые многоугольники.
Для рисования более сложных геометрических фигур (эллипс, окружность, дуги и т.п.) в Delphi имеются стандартные процедуры, например, эллипс может быть нарисован следующей процедурой:
Canvas.Ellipse(100,100,300,200);
Описание соответствующих процедур – см. Help!
Нарисованные на экране фигуры могут быть закрашены: это определяется свойством Brush, у которого в свою очередь имеются свойства Color (цвет) и Style (стиль) закраски. Ниже приведен пример вывода на экран закрашенного треугольника:
procedure TForm1.Button2Click(Sender: TObject);
begin
canvas.Brush.Color:=clBlue; {Определим цвет закраски}
Canvas.Brush.Style:=bsCross; {Определим рисунок – стиль – внутри}
Canvas.Polygon([Point(10,10),
Point(200,200),Point(100,175),Point(10,10)]);
end;
Используем Polygon вместо PolyLine, чтобы можно было закрашивать. Возможные значения свойств Color и Style – см. Help; пункт Brush.
Рисование графиков функций
Рисование графиков функций заметно сложнее: необходимо определить координаты всех точек, через которые пройдет его график. На рис. 8.2 показан график синуса, а ниже приведена реализация соответствующей процедуры.
Рис. 8.2. График функции
procedure TForm1.Button1Click(Sender: TObject);
const PI=3.14159;
Var
x,y :real;
px,py,half :longint;
begin
half:=Form1.Height div 2;
{Определяем половину вертикального размера формы}
for px:=0 to Form1.Width do
begin
{масштаб х приводим к 2*PI для отображения полного периода}
x:=px*(2*PI/Form1.Width);
y:=sin(x);
py:=trunc(0.7*y*half)+half;
{Выводим на экран один пиксел с заданными координатами}
{ и цветом: 0 – черный}
Canvas.Pixels[px, py]:=0;
end;
end;
Наиболее сложным моментом при рисовании графиков является расчет масштаба. Если с первой попытки это не удалось, то можно рекомендовать экспериментальным путем определить наиболее удачный вариант. Применяя знания по аналитической геометрии можно рисовать все что угодно!
Компоненты tPaintBox и tShape
До сих пор мы рисовали в пределах всей формы. Часто полезно ограничить графику прямоугольной областью на форме. Для этого используется компонента TPaintBox из палитры System. Как всегда, перенесем эту компоненту на форму, разместим на нужном месте и дадим ей необходимые размеры. Имя этой компоненты по умолчанию – PaintBox1. Координаты в дальнейшем должны определяться в ее пределах. Например, рисование закрашенного треугольника в пределах PaintBox выполняется следующей процедурой:
procedure TForm1.Button2Click(Sender: TObject);
begin
PaintBox1.Canvas.Brush.Color:=clBlue; {Определим цвет закраски}
PaintBox1.Canvas.Brush.Style:=bsCross;
{Определим рисунок – стиль – внутри}
Paintbox1.Canvas.Polygon([Point(10,10),
Point(65,200),Point(120,100),Point(10,10)]);
end;
Нетрудно видеть, что единственным отличием этой процедуры от аналогичной, приведенной выше, является квалификатор PaintBox1.
В Delphi имеется возможность вставить в свою форму простые геометрические фигуры. Для этого используется компонента Shape из палитры Additional. Перенесем ее на форму и обращаем внимание на свойства. В исходном виде Shape имеет форму квадрата, ее высоту и длину, а также местонахождение можно менять традиционными средствами (мышью или присвоением значений ее свойствам). Рассмотрим основные свойства.
Рис. 8.3. Геометрические фигуры
Brush – определяет стиль и цвет наполнения фигуры, имеет два подсвойства Color и Style;
Pen – определяет характеристики (цвет, стиль, толщина) ограничительной линии, имеет подсвойства Color, Mode, Style, Width;
Shape – определяет саму фигуру (эллипс, круг,...).
Форма с несколькими фигурами показана на рис. 8.3. Фигуры используются для иллюстраций, но с их помощью можно выводить и результаты вычислений в форме диаграмм. Напомним, что
Left, Top – координаты левой верхней точки;
Heigth, Width – высота и ширина квадрата.
Попробуйте самостоятельно построить диаграммы!
Исключительные ситуации
Исключительной ситуацией (exception) называется необычная или неожиданная ситуация, прерывающая нормальную работу программы. Генерация исключительной ситуации – уведомление о необычной или неожиданной ситуации. Обработка исключительной ситуации – нахождение выхода из возникшей ситуации и восстановление работоспособности программы.
С исключительными ситуациями мы уже встречались в рассмотренных нами примерах. Например:
Преобразование символьных данных в числовые генерирует исключительную ситуацию, если такое преобразование невозможно.
Если выполнение арифметического выражения невозможно (деление на нуль, квадратный корень отрицательного числа и т.д.), то возникает исключительная ситуация.
Попытка открытия несуществующего в заданной директории файла тоже вызывает исключительную ситуацию.
Обработка исключительных ситуаций
При запуске нашего приложения из среды Delphi можно не беспокоиться об обработке исключительных ситуаций: это делает среда сама и выдает сообщение о природе возникшей ситуации и указывает на место, где это произошло. Если сообщение не появилось, то войдите в меню Delphi, пункт Tools подпункт Options и включите опцию Break on exception. Нашей конечной целью является создание законченных приложений, которые можно запускать прямо из операционной системы Windows 95, без предварительного входа в Delphi. Поэтому мы должны предусмотреть в них и обработку по меньшей мере наиболее вероятных исключительных ситуаций. В противном случае при возникновении исключительной ситуации наше приложение просто остановится, возможно с потерей данных.
Различают:
завершение при исключениях;
обработку исключений.
Завершение при исключениях обеспечит завершение программы без каких-либо специальных действий. Типичными примерами являются операции ввода/вывода, выделение и освобождение памяти. Возникла при этих операциях исключительная ситуация или нет, в любом случае файлы должны быть закрыты, а выделенная память освобождена. Для этого используется блок try finally:
try
оператор1;
оператор2;
. . . . . . . . .
операторN;
finally
операторА;
. . . . . . . .
операторМ;
end;
Если при выполнении операторов 1N исключительная ситуация не возникла, то выполняются все операторы от 1 до N и затем от А до М. Если при выполнении какого-либо оператора от 1 до N возникла исключительная ситуация, то выполнение операторов из этой последовательности прерывается и начинается выполнение операторов из последовательности АМ. Такая конструкция обеспечит завершение независимо от того, возникла исключительная ситуация или нет. В противном случае при возникновении последней выполнение программы прерывается и операторы от А до М тоже не будут выполнены. Рассмотрим это на простом примере.
procedure TForm1.Button1Click(Sender: Tobject);
Var
i, j, k : integer;
ptr : pointer; {Переменная – указатель}
Begin
i:=0;
j:=0;
GetMem (ptr, 4098);
{Выделение памяти и присвоение ее адреса переменной ptr}
try
k:= j div i; {Оператор, при выполнении которого может возникнуть ИС}
finally
FreeMem (ptr, 4098); {Освобождение занятой ранее памяти}
end;
End;
В этой процедуре три “безопасных” с точки зрения возникновения исключительной ситуации оператора находятся вне блока try. Операция деления может стать причиной возникновения исключительной ситуации и находится внутри блока try. Если деление выполнено нормально, то все операторы процедуры выполняются подряд, как будто и нет блока tryfinally. При возникновении исключительной ситуации оператор освобождения памяти в любом случае выполняется. При отсутствии блока tryfinally при возникновении исключительной ситуации выполнение процедуры прервалось бы и память осталась бы занятой.