Работа с простой графикой и OpenGL. Delphi (Lazarus)
Скачать 0.56 Mb.
|
Процедуры и функции при построении изображений14. Февраль 2013 - 16:29 | admin Среда программирования: Delphi (Lazarus) Понятие процедуры, функции и метода класса Важной составной частью программирования в Object Pascal является использование подпрограмм - специальным образом оформленных и логически законченных блоков инструкций. Подпрограмму можно вызывать любое число раз из других мест программы, или из других подпрограмм. Таким образом, использование подпрограмм позволяет сделать исходный код более стройным и наглядным. Подпрограммы в Pascal делят на процедуры и функции. Процедуры - это такие подпрограммы, которые выполняют предназначенное действие и возвращают выполнение в точку вызова. Функции в целом аналогичны процедурам, за тем исключением, что они еще и возвращают результат своего выполнения. Процедуры и функции, объявленные внутри класса называют методами класса. Процедуры и функции могут иметь свой собственный набор переменных, объявленных внутри нее и называемых локальными переменными. По завершению работы значения таких переменных теряются. procedure Stars (N : Integer); // N - параметр, определяющий количество звезд Var i : Integer; // Локальная переменная, используемая в операторе цикла begin for i:=1 to N do Form1.PaintBox1.Canvas.Pixels[Random(PaintBox1.Width), Random(PaintBox1.Height)]:=clRed; end; Обмен значениями между различными процедурами возможен через параметры, глобальные переменные и возвращаемые в функциях значения. Переменные объявленные в разделе Var модуля являются глобальными для всех процедур и классов модуля и доступны в любой процедуре, функции и методе класса данного модуля. Однако, работа с такими переменными напрямую внутри процедур считается "не красивым" и усложняет отлов ошибок. Поэтому удобно использовать передачу параметров и возвращаемые значения. Передача параметров Pascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется. Передача параметров по значению Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример: procedure Test(s: string); При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s. Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже. Примечание: в случае если в процедуру передается переменная объекта, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Передача параметров по ссылке Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции. procedure ChangeMe(var x: longint); begin x := 2; // Параметр х изменен вызванной процедурой end; Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение. Передача параметров констант Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметра-константы: procedure Test(const s: string ); Пример использования процедуры Star для построения звездного неба Процедура Star объявлена внутри класса TForm1 и по сути является методом этого класса, позволяющим рисовать звезды на форме. При создании процедуры удобно использовать горячие клавиши (Ctrl-Shift+C), которые автоматически создадут тело процедуры внутри блока implementation. Для этого необходимо прописать заголовок процедуры в разделе public или private и нажать горячие клавиши Ctrl-Shift+C. В процедуру передаются параметры x,y - координаты расположения звезды, Size - размер и Color - цвет отрисовки. Используя цикл задается 100 звезд разного цвета и размера. unit Unit1; interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } // Рисованиезвезды procedure Star(x,y: Integer; Size: Integer; Colour: TColor); // Получение случайного цвета. A - параметр, определяющий яркость случайного цвета function GetRandomColor( A: Integer): TColor; end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); // Локальные переменные i и с используются для задания количества и цвета звезд Var i : Integer; c : TColor; begin // Закрашиваем поле для рисования в черный цвет PaintBox1.Canvas.Brush.Color:=clBlack; PaintBox1.Canvas.Rectangle(0,0,PaintBox1.Width, PaintBox1.Height); // Вызываем процедуру Star 100 раз, тем самым рисуя 100 звезд for i := 1 to 100 do begin // Случайным образом формируем цвет звезды, с помощью функции c := GetRandomColor(100); // Вызываем процедуру отрисовки звезды с разными случайными параметрами Star( Random(PaintBox1.Width), Random(PaintBox1.Height), Random(7)+3, c); end; end; //Процедура прорисовки звезды с разными параметрами расположения, размера и цвета procedure TForm1.Star(x, y: Integer; Size: Integer; Colour: TColor); begin // Задаем цвет в соответствии с полученным параметром PaintBox1.Canvas.Pen.Color:= Colour; PaintBox1.Canvas.Brush.Color:= Colour; // Рисуем звезду, используя переданные координаты и размер Paintbox1.Canvas.Polygon( [Point(x, y-size), Point(x-size div 4, y-size div 4), Point(x-size, y), Point(x-size div 4, y+size div 4), Point(x, y+size), Point(x+size div 4, y+size div 4), Point(x+size, y), Point(x+size div 4, y-size div 4), Point(x, y-size)]); end; function TForm1.GetRandomColor( A: Integer): TColor; begin // Проверка на корректность задания параметра A (не больше 255) if A > 255 then A := 255; // Получение случайного цвета, в зависимости от значения A Result := RGBToColor(Random(256-A)+A, Random(256-A)+A, Random(256-A)+A); end; end. |