Работа с графикой в 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. С помощью этих полученных знаний было выполнено задание данной лабораторной работы.