- •Windows -приложение
- •Среда программирования
- •Встроенный отладчик
- •Использование графики
- •Графические данные и палитра
- •Сохранение проекта
- •Структура приложения
- •Структура модуля
- •Простые типы
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Составной оператор
- •Оператор if
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Пример приложения 6
- •Пример приложения 7
- •Статические массивы
- •Динамические массивы
- •Оператор with
- •Идентичность типов
- •Совместимость типов
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Рекурсия
- •Процедура exit
- •Директивы подпрограммы
- •Класс как объектный тип
- •Наследование
- •Операции is и as
- •Типы ссылки на класс
- •Типизированные файлы
- •Файлы без типа
- •Пример приложения 17
- •Компонент tmainmenii
- •Двунаправленные списки
- •Потоки данных
- •Пример приложения 22
- •Интерфейс drag and drop
- •Пример приложения 24
- •С файлами
- •Пример приложения 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Проблемы синхронизации потоков
Оператор цикла for
Оператор For позволяет организовать выполнение какого-либо другого оператора заранее заданное число раз. Существуют 2 варианта этого оператора:
For <управляюцая переменная> := <Start> to <Finish> do <one-
Ро* <упра»лякщая переменная> := <Start> downto <Finish> do <оператор>;.
Управляющая переменная позволяет ограничить количество расчетов заданного оператора, которое зависит от значений выражений <start> и <Pinish>. Выражение <start> определяет начальное значение управляющей переменной, выражение <Finish> - конечное значение. При каждой итерации управляющая переменная увеличивается на единицу в первом опе-
53
раторе и уменьшает свое значение на единицу во втором операторе. Как только значение управляющей переменной превзойдет значение <Finish> в первом операторе (станет меньше во втором операторе), цикл прекращается. Выражения <start> и <Finish> должны возвращать значения порядкового типа, соответственно Управляющая переменная> должна также иметь порядковый тип. Например,
FOR I:= 1 ГО 10 DO Y:=sin(X) ;
FOR I:- 10 DOWNTO 1 DO X:=sin(X) ;
Если в самом начале цикла значение <Finish> будет больше, чем значение <start> для первого оператора, или значение <Finish> меньше, чем <start> для второго оператора, то не будет выполнено ни одной итерации.
В Delphi скорость выполнения циклических вычислений оптимизирована, поэтому имеют место ограничения на управляющую переменную, которая должна:
-
иметь порядковый тип;
-
быть объявлена в том же блоке, в котором помещен цикл, т. е. должна быть локальной.
ПРИМЕР ПРИЛОЖЕНИЯ 4
Пусть требуется рассчитать табл. 10 и построить на экране дисплея графику =f(x) = sm(x). Шаг изменения координат* и_у графика зададим в пикселах и пусть, h = 1. В данном случае имеют место два типа графиков: физический и дисплейный. Пусть X, У, Н - координаты и шаг физического графика, х, у, h - координаты и шаг дисплейного графика. Прежде чем рисовать график, необходимо выполнить преобразование физических координат в дисплейные (или масштабирование) так, чтобы дисплейный график верно отражал процесс, смоделированный физическим графиком. Физический график начинается в точке х = а и заканчивается в точке х = b.
Пусть дисплейный график начинается в точке Х = хпи продолжается до точки X = хк (рис. 16). Выберем следующую схему построения дисплейного графика:
-
используя заданное А, находим текущее значение х;
-
рассчитываем Я и находим значение физической переменной X;
-
определяем У;
-
преобразуем У в у;
-
на экране дисплея отображаем полученную точку (х,у).
Введем масштаб ту и запишем соотношение у = туУ. Так как данное соотношение справедливо для любой точки графика, необходимо, чтобы оно выполнялось и при значении утт = ту Утах (все значения у будут воспроизводиться на экране). Из этого соотношения можно определить масштаб my,
Максимальное значение F^ в данном случае для функции равно 1, а для дисплейного графика ут^ задается, в общем случае, произвольно.
У,
Дисплейный график (без учета направления оси ординат)
"*"
Физический график
Дисплейный график ртраженный по вертикали)
X
Рис. 16
Теперь найдем соотношение между х и X (или между А и Я, что одно и то же). Примем, чтобы количество точек по оси абсцисс для дисплейного и физического графиков было одинаковым. Чтобы это выполнялось, необходимо согласовать значение шага Н для физического графика с выбранным h для дисплейного графика. Запишем
откуда следует обозначив тх, получим требуемое
соотношение Я = mxh.
Для размещения графика понадобится компонент TImage (страница Ad. ditional). Форма примера 4 приводится на рис. 17. Какие объекты используй ются в данном примере, можно найти в тексте программы.
Рис. 17
Рис. 18
Текст программы приведен ниже.
Компонент TImage используется для рисования графических объектов и геометрических фигур. Полезным свойством компонента TImage является Canvas (холст), которое включает, в частности, свойства Pen, Brush. Канва имеет методы: MoveTo (используется для перемещения невидимого графи! ческого курсора в заданную точку) и LineTo (позволяет рисовать линии)! Эти два метода используются для рисования графика на канве TImage. Кем ординаты задаются в пикселах, горизонтальная ось направлена слева напра-J во, вертикальная - сверху вниз. Вариант решения задачи приводится на рис] 18. Выбраны следующие размеры для Image 1: Width = 305, Height = 154. Осы абсцисс проведена при значении у0 = 75.
unit prim4; interface
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
TForm1 class (TForm) Panel1: TPanel;
Button1: TButton;
BitBtnl: TBitBtn;
Edit1: TEdit;
Label1 Edit2: Label2 image1 Label3 Bevel1
TLabel; TEdit; TLabel; TImage; TLabel; : TBevel;
procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject);
end;
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,у0,yk:integer; mx,my:real; x,y,ymax:real; i: integer; begin
xn:=15;
xk:=280;
УО:=75;
yk:=70;
a:=StrToFloat(Edit1,Text); b:=StrToFloat{Edit2,Text); ymax:=1.0;
{Зададим цвет и толщину пера} Imagel.Canvas.Pen.Color:=clBlack; Imagel.Canvas.Pen.Width:-1;
{Закрасим цветом фона предыдущий график) Imagel.Canvas.Brush.Color:=clWhite; Imagel.canvas.Rectangle(0,0,Imagel.Width, Imagel.Height);
{Рисуем оси координат} Imagel,Canvas.MoveTo(xn,yO);
56
57
Imagel.Canvas.LineTo(xk,yO); Imagel.Canvas.MoveTo(xn,yO+yk); Imagel.Canvas.LineTo(xn,yO-yk);
{Проверяем, введено ли b < a}
if b<=a then begin
Label3.Caption:= 'Графика нет'; Exit;
end else Label3.Caption:=’’;
{Устанавливаем цвет и толщину карандаша для графика}
Imagel.Canvas.Pen.Color:=clRed; Image1.Canvas.Pen.Width:=2; mx:=(b-a)/(xk-xn); my:=yk/ymax;
{Устанавливаем начальную точку графика} Imagel.Canvas.MoveTo(xn,yO-round(my*sin(a)));
{Строим график в цикле for} for i:-l to xk-xn do begin
y:=my*sin(x);
Imagel.Canvas.LineTo(xn+i,yO-round(y));
end;
end;
end.
В обработчике событий OnKeyPress учтено, что вводятся вещественные числа. Используемая функция Round(2) преобразует вещественное число z в целое с предварительным округлением. Для того чтобы возможно было неоднократное построение графика, необходимо стирать предыдущий гра-: фик.