Работа с графикой в delphi
РАБОТА С ГРАФИКОЙ В DELPHI
Отчёт по лабораторной работе
Цель и задача работы
Научиться использовать графику в языке программирования Delphi.
Задание на работу
1) Предусмотреть возможность изменения цвета графика, созданного из вводимых точек.
2) Написать программу, в которой происходит симуляция броуновского движения молекул.
3) Создать файл MS Word и записать в него рисунок с комментарием
1. Схема алгоритма
На рисунке 1.1 приведена схема алгоритма выбора цвета.
|
Текст программы
Ниже приведён текст программы, написанный на языке программирования Delphi 7, выполняющий создание графика по точкам и изменение его цвета.
unit Lab;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart;
type
arra=array of array of integer;
TMainProgram = class(TForm)
MainProgramInf: TLabel;// Информация о назначении ПО
InputArray: TStringGrid;// Таблица для ввода массива точек
startinf: TLabel;// Объект для вывода информации на дисплей
endinformation: TLabel;// Объект для вывода информации на дисплей
start: TButton;// Объект для запуска программы
InfWind: TLabel;// Информация о вводе размера
InputLength: TEdit;// Объект для ввода размера массива точек
StartLength: TButton;// Объект для изменения размера массива точек
Graph: TChart;// Объект, на котором выводится график
Graph_Points: TLineSeries;// Объект — график
X_inf: TLabel;// обозначение ввода координаты Х
Y_inf: TLabel;// обозначение ввода координаты Y
Colors: TColorDialog;// Объект для выбора цвета графика
procedure startClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StartLengthClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainProgram: TMainProgram;
{Подпрограмма для проверки ввода данных}
procedure checkandinputarr(var flag:boolean;InputArray:TStringGrid;var arr:arra);
var
size:integer;
flag:boolean;
implementation
{$R *.dfm}
{Подпрограмма для проверки ввода данных}
procedure checkandinputarr(var flag:boolean;InputArray:TStringGrid;var arr:arra);
var i, j:integer;
begin
i:=-1;
while ((i<size-1)and(flag=false)) do
begin
inc(i);
try
arr[i][0]:=strtoint(InputArray. Cells[i,0]);
arr[i][1]:=strtoint(InputArray. Cells[i,1]);
except
on EConvertError do
begin
ShowMessage(‘Ошибка преобразования ввода элемента матрицы. Введите целое число!’);
flag:=true;
end;
end;
end;
end;
{Подпрограмма для создания динамического массива}
function GetMem(var arr:arra;size:integer):boolean;
var i:integer;
flag:boolean;
begin
flag:=false;
SetLength(arr, size);
if arr<>nil then
begin
i:=0;
while ((i<=size-1)and(flag<>true)) do
begin
SetLength(arr[i],2);
if arr[i]=nil then
begin
flag:=true;
Result:=true;
end;
inc(i);
end;
end;
end;
{Подпрограмма для освобождения памяти из-под динамического массива}
procedure FreeMem(var arr:arra;size:integer);
var i:integer;
begin
for i:=0 to size-1 do
arr[i]:=nil;
arr:=nil;
end;
{Подпрограмма для создания графика с выбираемым цветом по вводимым точкам}
procedure TMainProgram. startClick(Sender: TObject);
var arr:arra;
i:integer;
begin
Graph_Points. Clear;
Graph. BottomAxis. Automatic:=True;
Graph. LeftAxis. Automatic:=True;
flag:=false;
SetLength(arr, size);
if GetMem(arr, size)<>true then
begin
checkandinputarr(flag, InputArray, arr);
if ((flag=false)and(colors. Execute)) then
begin
for i:=1 to size do
Graph_Points. AddXY(arr[0][i],arr[1][i],»,Colors. Color);
end;
FreeMem(arr, size);
{output_from_file(Graph_Points, SaveFile);}
end
else
ShowMessage(‘Память не выделилась!!’);
end;
procedure TMainProgram. FormCreate(Sender: TObject);
begin
size:=9;
Graph_Points. Clear;
end;
{Подпрограмма для изменения размеров таблицы с точками}
procedure TMainProgram. StartLengthClick(Sender: TObject);
begin
try
size:=strtoint(InputLength. Text);
except
on EConvertError do
begin
ShowMessage(‘Ошибка преобразования ввода элемента матрицы. Введите целое число!’);
flag:=true;
end;
end;
if ((size<3)or(size>32768)) then
begin
flag:=true;
ShowMessage(‘Ошибка ввода смещения. Введите значение в допустимом диапозоне’);
end;
InputArray. ColCount:=size;
end;
end.
Инструкция пользователю
Данная программа создана для создания графика по вводимым точкам с изменением его цвета. Заполните массив точек и введите цвет точки.
Инструкция программисту
Для создания динамического массива точек был использована структура arra=array of array of integer. Список переменных, используемых в программе, для решения поставленной задачи, представлен в таблице 1.1.
Таблица 1.1 — Перечень переменных для решения поставленной задачи
Имя |
Тип |
Описание |
i |
integer |
счетчик цикла |
arr |
boolean |
динамический массив точек |
Список используемых компонентов представлен в таблице 1.2.
Таблица 1.2 — Перечень используемых компонентов и их описание
MainProgramInf |
TLabel |
Информация о назначении ПО |
startinf |
TLabel |
Объект для вывода информации на дисплей |
InputArray |
TStringGrid |
Таблица для ввода массива точек |
endinformation |
TLabel |
Объект для вывода информации на дисплей |
start: |
TButton |
Объект для запуска программы |
InputChange |
TLabel |
Ввод нового размера таблицы |
inputcolor |
TEdit |
Ввод цвета |
Graph |
TChart |
Объект, на котором выводится график |
Graph_Points |
TLineSeries |
Объект — график |
X_inf |
TLabel |
обозначение ввода координаты Х |
Y_inf |
TLabel |
обозначение ввода координаты Y |
Colors |
TColorDialog |
Объект для выбора цвета графика |
InfWind |
TLabel |
Информация о вводе размера |
InputLength |
TEdit |
Объект для ввода размера массива точек |
StartLength |
TButton |
Объект для изменения размера массива точек |
Тестовый пример
Для проверки работоспособности программы были введены начальные данные. Программа выдаст результат (рисунок 1.2).
Рисунок 1.2 – Пример работы программы
2. Схема алгоритма
На рисунках 2.1 и 2.2 приведена схема алгоритма создания броуновского движения молекул.
|
|
|
|
Рисунок 2.1–Схема алгоритма создания массива случайных точек
Рисунок 2.2–Схема алгоритма имитации броуновского движения молекул
Текст программы
Ниже приведён текст программы, написанный на языке программирования Delphi 7, для создания на канве броуновского движения молекул.
unit lab;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TMainForm = class(TForm)
Start: TButton;// Объект для запуска программы
InfInput: TLabel;// Объект с информацией о программе
Pict: TImage;// Объект, на который выводится броуновское движение
InputDelay: TEdit;// Окно для ввода длительности паузы
InfLong: TLabel;// Информация о вводе размера массива
InputLong: TEdit;// Окно для ввода массива
InfDelay: TLabel;// Информация о вводе длительности паузы
InfV: TLabel;// Информация о вводе скорости молекулы
InputV: TEdit;// Окно для ввода скорости молекулы
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
point = record
Vx, Vy:integer;
X, Y:integer;
Dir:real;
end;
points=array of point;
var
Form1: TForm1;
implementation
{$R *.dfm}
{Подпрограмма для проверки ввода}
function check(var delay:integer;var long:integer;var V:integer;InputDelay:TEdit;InputLong:TEdit;InputV:TEdit):boolean;
begin
result:=true;
try
if ((strtoint(InputDelay. Text)<=MaxInt)and(strtoint(InputDelay. Text)>-MaxInt)and(strtoint(InputLong. Text)<=MaxInt)and(strtoint(InputLong. Text)>-MaxInt)and(strtoint(InputV. Text)<=MaxInt)and(strtoint(InputV. Text)>-MaxInt)) then
begin
delay:=strtoint(InputDelay. Text);
long:=strtoint(InputLong. Text);
V:=strtoint(InputV. Text);
end
else
result:=false;
except
on EconvertError do
begin
ShowMessage(‘Ошибка считывания численного значения!!!’);
result:=false;
end;
end;
end;
{Подпрограмма для создания динамического массива}
function getmem(var p:points;long:integer):boolean;
begin
SetLength(p, long);
if (p=nil) then
ShowMessage(‘Ошибка выделения памяти!’);
end;
procedure freemem(var p:points;long:integer);
begin
p:=nil
end;
{Подпрограмма для очистки канвы}
procedure clear(var Pict:TImage);
var i, j:integer;
begin
for i:=1 to 385 do
for j:=1 to 345 do
Pict. Canvas. Pixels[i, j]:=clWhite;
end;
{Подпрограмма для создания имитации броуновского движения точек}
procedure TForm1.StartClick(Sender: TObject);
var delay, long, i,V, j,t:integer;
p:points;
begin
if check(delay, long, V,InputDelay, InputLong, InputV) then
begin
SetLength(p, long);
for i:=0 to long-1 do
begin
p[i].Dir:=Random(360)*pi/180;
p[i].X:=random(384);
p[i].Y:=random(344);
end;
j:=0;
repeat
inc(j);
for i:=0 to long-1 do
begin
if (((p[i].X+round(V*sin(p[i].Dir)))<380) and ((p[i].X+round(V*sin(p[i].Dir)))>5)) then
p[i].Vx:=round(V*sin(p[i].Dir))
else
begin
p[i].Vx:=-round(V*sin(-p[i].Dir));
p[i].Dir:=-p[i].Dir;
end;
if (((p[i].Y+round(V*cos(p[i].Dir)))<340)and((p[i].Y+round(V*cos(p[i].Dir)))>5)) then
p[i].Vy:=round(V*cos(p[i].Dir))
else
begin
p[i].Vy:=-round(V*cos(p[i].Dir));
p[i].Dir:=-p[i].Dir;
end;
p[i].X:=p[i].X+p[i].Vx;
p[i].Y:=p[i].Y+p[i].Vy;
Pict. Canvas. Pixels[(p[i].X),(p[i].Y)]:=clBlack;
end;
t:=GetTickCount+delay;
clear(Pict);
repeat
Application. ProcessMessages;
until GetTickCount-t>=1000;
until (not(j<>long*2));
freemem(p, long);
end;
end;
end.
Инструкция пользователю
Данная программа создана для вывода на канву броуновского движения точки. Пользователь должен ввести паузу между начертаниями точки и количество рисуемых точек.
Инструкция программисту
Для решения задачи был использован тип-запись point. Структуры этого типа приведены в таблице 2.1. Список переменных, используемых в программе, для решения поставленной задачи, представлен в таблице 2.2.
Таблица 2.1 – Структуры типа point
Имя |
Тип |
Описание |
Vx |
integer |
Скорость молекулы относительно X |
Vy |
integer |
Скорость молекулы относительно Y |
X |
integer |
Координаты по оси Х |
Y |
integer |
Координаты по оси Y |
Dir |
real |
Угол движения молекулы |
Таблица 2.2 — Перечень переменных для решения поставленной задачи
Имя |
Тип |
Описание |
delay |
integer |
Пауза при выполнении программы |
long |
integer |
Размер массива точек |
i |
integer |
счетчик цикла |
V |
integer |
Скорость передвижения молекул |
j |
integer |
счетчик цикла |
t |
integer |
вспомогательная переменная для паузы программы |
p |
points |
Массив с характеристиками точек |
Список используемых компонентов представлен в таблице 2.3
Таблица 2.3 — Перечень используемых компонентов и их описание
Имя |
Тип |
Описание |
Start |
TButton |
Объект для запуска программы |
InfInput |
TLabel |
Объект с информацией о программе |
Pict |
TImage |
Объект, на который выводится броуновское движение |
InputDelay |
TEdit |
Окно для ввода длительности паузы |
InfLong |
TLabel |
Информация о вводе размера массива |
InputLong |
TEdit |
Окно для ввода массива |
InfDelay |
TLabel |
Информация о вводе длительности паузы |
InfV |
TLabel |
Информация о вводе скорости молекулы |
InputV |
TEdit |
Окно для ввода скорости молекулы |
Тестовый пример
Для проверки работоспособности программы были введены следующие данные. Программа выдаст результат (рисунок 2.3).
Рисунок 2.3 – Пример работы программы
3. Схема алгоритма
На рисунке 3.1 приведена схема алгоритма вывода в Word файл рисунка и подрисуночной подписи.
|
Рисунок 3.1 – Схема алгоритма вывода в Word картинки и подрисуночной подписи
Текст программы
Ниже приведён текст программы, написанный на языке программирования Delphi 7, для вывода в файл MS Word картинки и подрисуночной подписи.
unit ProgLab;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComObj;
type
TMainProgram = class(TForm)
Picture: TImage;// Объект, на который выводится картинка
InputString: TEdit;// Строка, записываемая в файл
Start: TButton;// Объект для запуска программы
Find_Picture: TOpenPictureDialog;// Объект для выбора адреса картинки
InfInpString: TLabel;// Информация о вводе строки
InputParag: TEdit;// Объект для ввода числа пропускаемых строк
InfInpParag: TLabel;// Информация о вводе числа пропускаемых строк
InfMainProg: TLabel;// Информация о основной программе
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainProgram: TMainProgram;
implementation
{$R *.dfm}
{Подпрограмма для проверки ввода данных}
function check(InputParag:TEdit;var parag:integer):boolean;
begin
try
parag:=strtoint(InputParag. Text);
except
on EConvertError do
begin
ShowMessage(‘Ошибка ввода! Введите целое число!’);
result:=false;
end;
end;
if ((parag<1)or(parag>32768)) then
begin
result:=false;
ShowMessage(‘Ошибка ввода смещения. Введите значение в допустимом диапозоне [0,32768]’);
end;
end;
{Подпрограмма для ввода картинки}
function InputfromFile(var picture:TImage;var Find_Picture: TOpenPictureDialog):boolean;
begin
if FileExists(Find_Picture. FileName) then
Picture. Picture. LoadFromFile(Find_Picture. FileName);
end;
{Подпрограмма для пересылки картинки и подрисуночной подписи в файл Word}
procedure TMainProgram. StartClick(Sender: TObject);
var word:variant;
i, parag:integer;
begin
if ((Find_Picture. Execute)) then
if (check(InputParag, parag)) then
if InputfromFile(picture, Find_Picture) then
begin
Word:=CreateOleObject(‘Word. Application’);
Word. Visible:=True;
Word. Documents. Add; Word. ActiveDocument. Shapes. AddOLEObject(ClassType:=’Paint. Picture’,FileName:=Find_Picture. FileName, left:=Picture. Left, top:=Picture. Top, width:=Picture. Width, Height:=Picture. Height);
for i:=1 to Parag do
Word. ActiveDocument. Paragraphs. Add;
Word. ActiveDocument. Range. InsertAfter(InputString. Text);
Word. Quit;
end;
end;
end.
Инструкция пользователю
Данная программа создана для вывода подрисуночной надписи и рисунка в файл MS Word. Для запуска программы необходимо активировать вкладку «Пуск».
Инструкция программисту
Список переменных, используемых в программе, для решения поставленной задачи, представлен в таблице 3.1.
Таблица 3.1 — Перечень переменных для решения поставленной задачи
Имя |
Тип |
Описание |
word |
variant |
Файловая переменная Word |
i |
integer |
счётчик цикла |
parag |
integer |
Число пропускаемых строк |
Список используемых компонентов представлен в таблице 3.2.
Таблица 3.2 — Перечень используемых компонентов и их описание
Имя |
Тип |
Описание |
Picture |
TImage |
Объект, на который выводится картинка |
InputString |
TEdit |
Строка, записываемая в файл |
Start |
TButton |
Объект для запуска программы |
Find_Picture |
TOpenPictureDialog |
Объект для выбора адреса картинки |
InfInpString |
TLabel |
Информация о вводе строки |
InputParag |
TEdit |
Объект для ввода числа пропускаемых строк |
InfInpParag |
TLabel |
Информация о вводе числа пропускаемых строк |
InfMainProg |
TLabel |
Информация о основной программе |
Тестовый пример
Для проверки работоспособности программы были введены следующие данные. Программа выдаст результат (рисунок 3.2-3.3).
Рисунок 3.2 – Пример окна программы по выводу рисунка и подрисуночной подписи в файл MS Word
Рисунок 3.3 – Пример работы программы по выводу рисунка и подрисуночной подписи в файл MS Word
Вывод
В ходе выполнения данной лабораторной работы я научился использовать графику и обращение с MS Word в Delphi, изучил способы работы и правила с графиками, изображениями, создания изображений на канве, создание связей с файлами MS Word. С помощью этих полученных знаний было выполнено задание данной лабораторной работы.