- •2. Delphi ортасынның графикалық мүмкіндіктерін сипаттайтын программа 21
- •1 Delphi программалау ортасы
- •1.1 Delphi программалау жүйесі
- •1.2 Delphi–дің артықшылықтары
- •1.3 Өнімнің негізгі сипаттамалары.
- •1.4 Ұйымдастырушының ортасын икемдеу .
- •1.5 Компоненттер
- •1.6 Delphi программалау ортасының графикалық мүмкіндіктері
- •1.8 Қарапайым графиктерді сызу әдістері
- •1.8 Canvas объектінің қасиеттері
- •2. Delphi ортасынның графикалық мүмкіндіктерін сипаттайтын программа
Построение графиков в Delphi Наверное, все видели программы, которых довольно много, для построения всяческих графиков. Если Вы хотите написать что-то подобное на Delphi, то эта статья для Вас. В самых-самых программах Вам предлагается ввести формулу строкой, а не выбирать функции из списка. Самым сложным (?) элементом таких программ является текстовый анализатор. В данной статье я не собираюсь рассказывать, как пишутся текстовые анализаторы. Я собираюсь рассказать о некоторых основных принципах построения графиков, и работы с графикой в среде Delphi без использования специальных графических платформ, таких как DirectX или OpenGL.
Введение
В Delphi для прорисовки различных элементов управления используется специальный класс TCanvas. Можно выделить 4 основных направления, в которых используется этот класс: 1. Загрузка и хранение графических изображений. 2. Создание новых и изменение хранимых изображений с помощью пера, кисти, шрифта. 3. Рисование и/или закраска фигур, линий, текстов. 4. Комбинирование изображений. Как Вы уже поняли, мы пойдем по третьему направлению. Теперь давайте рассмотрим некоторые свойства и методы класса TCanvas. Сразу скажу, что я буду рассматривать далеко не все методы и свойства класса TCanvas, а лишь те, которые мы будем использовать потом.
TCanvas Свойства: 1. property Brush: TBrush; Данное свойство позволяет определить цвет (Brush.Color) и стиль (Brush.Style) заполнения замкнутых фигур и фона. 2. property ClipRect: TRect; - read-only Данное свойство позволяет получить доступную область рисования. Вне этой области рисовать невозможно. Тип TRect, описанный в модуле Windows, имеет следующий синтаксис: Type TRect = record Case integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; 3. property Pen: TPen; Данное свойство позволяет задать цвет пера, рисующего фигуры или линии. Методы: 1. procedure FillRect (const Rect: TRect); Метод позволяет заполнить цветом прямоугольную область холста Rect, используя текущее значение кисти Brush. 2. procedure MoveTo (x, y: integer); Метод позволяет переместить перо в точку (X, Y). 3. procedure LineTo (x, y: integer); Метод позволяет нарисовать прямую линию, которая начинается с текущей позиции пера и заканчивается точкой (x, y). При рисовании используются текущие установки пера Pen. Ну вот, пожалуй, и все, что нам будет нужно, для успешного построения графика. Построение графика. Теория.
Для начала предлагаю немного теории. Мы собираемся писать процедуру построения графика функции на определенной поверхности, заданной свойством Canvas. Я предлагаю поставить оси координат в середине этой области, а график растянуть так, чтобы он растянулся на всю область. Строить мы будем методом lineto. Поэтому нам нужно определиться с шагом изменения величины аргумента. Я предлагаю взять его обратным к масштабу по оси ординат. Так наш график будет выглядеть плавно при любой функции и любом начальном и конечном значении абсциссы. Масштаб по оси абсцисс считается, отношение ширины поверхности к разнице максимального и минимального значения абсциссы. Масштаб по оси ординат считается аналогично: отношение высоты поверхности к разнице между максимальным и минимальным значениями данной функции на данном интервале.
Процедура DrawGraph
Ну вот и все с теорией и я приведу полный код функции, а потом разберем его. Type TFunc = function (x: real): real; procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas); var x, y, h: real; max, min: real; sx, sy: real; xmid, ymid: integer; begin sx := (c.ClipRect.Right)/(b-a); h := 1/sx; xmid := c.ClipRect.Right div 2; ymid := c.ClipRect.Bottom div 2; x := a; max := f( x); min := max; while x<=b do begin y := f( x); if y<min then min := y; if y>max then max := y; x := x + h; end; sy := c.ClipRect.Bottom/ (max-min); c.Brush.Color := clBlack; c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom)); c.Pen.Color := clYellow; c.MoveTo(0, ymid); c.LineTo(c.ClipRect.Right, ymid); c.MoveTo(xmid, 0); c.LineTo(xmid, c.ClipRect.Bottom); x := a; y := f(x); c.Pen.Color := clWhite; c.MoveTo(xmid+round(sx*x), ymid-round(sy*y)); while x<=b do begin y := f(x); c.LineTo(xmid+round(sx*x), ymid-round(sy*y)); x := x + h; end; end; А теперь, если Вы чего-либо не поняли, давайте разберем этот код. Type TFunc = function (x: real): real; Здесь я создал тип-функцию, для того, чтобы передавать в функцию построения графика можно было передавать имя функции в эту процедуру. procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas); Заголовок функции. Параметры: f – функция, график, которой будем троить. a – начальное значение переменной “x”. b – конечное значение переменной “x”. C – канва, на которой будем рисовать. sx := (c.ClipRect.Right)/(b-a); h := 1/sx; xmid := c.ClipRect.Right div 2; ymid := c.ClipRect.Bottom div 2; x := a; max := f( x); min := max; while x<=b do begin y := f( x); if y<min then min := y; if y>max then max := y; x := x + h; end; sy := c.ClipRect.Bottom/ (max-min); В этом куске кода мы считаем масштабы по осям координат, и среднее значения высоты и ширины канвы, чтобы отобразить оси координат. c.Brush.Color := clBlack; c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom)); c.Pen.Color := clYellow; c.MoveTo(0, ymid); c.LineTo(c.ClipRect.Right, ymid); c.MoveTo(xmid, 0); c.LineTo(xmid, c.ClipRect.Bottom); Здесь мы заливаем всю канву черным цветом и рисуем желтым цветом оси координат. x := a; y := f(x); c.Pen.Color := clWhite; c.MoveTo(xmid+round(sx*x), ymid-round(sy*y)); while x<=b do begin y := f(x); LineTo(xmid+round(sx*x), ymid-round(sy*y)); x := x + h; end; Ну и, наконец, нарисовали график нужной нам функции. Небольшой пример: Положим на форму одну кнопку и один компонент TImage. Создадим обработчик функции OnClick для кнопки примерно следующего характера, и следующую функцию для расчета функции Function f(x: real): real; Begin Result := sin(x)*cos(x); End; procedure TForm1.Button1Click(Sender: TObject); begin DrawGraph (f, -10, 10, Image1.Canvas); end; |
unit grfunc; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} Function f(x:real):real; // Функция, график которой надо построить begin f:=2*Sin(x)*exp(x/5); end; procedure GrOfFunc; // строит график функции var x1,x2:real; // границы изменения аргумента функции y1,y2:real; // границы изменения значения функции x:real; // аргумент функции y:real; // значение функции в точке x dx:real; // приращение аргумента l,b:integer; // левый нижний угол области вывода графика w,h:integer; // ширина и высота области вывода графика mx,my:real; // масштаб по осям X и Y x0,y0:integer; // точка - начало координат begin // область вывода графика l:=10; // X - координата левого верхнего угла b:=Form1.ClientHeight-20; // Y - координата левого верхнего угла h:=Form1.ClientHeight-40; // высота w:=Form1.Width-40; // ширина x1:=0; // нижняя граница диапазона аргумента x2:=25; // верхняя граница диапазона аргумента dx:=0.01; // шаг аргумента // найдем максимальное и минимальное значения // функции на отрезке [x1,x2] y1:=f(x1); // минимум y2:=f(x1); // максимум x:=x1; repeat y := f(x); if y < y1 then y1:=y; if y > y2 then y2:=y; x:=x+dx; until (x>=x2); // вычислим масштаб my:=h/abs(y2-y1); // масштаб по оси Y mx:=w/abs(x2-x1); // масштаб по оси X // оси x0:=l; y0:=b-Abs(Round(y1*my)); with form1.Canvas do begin // оси MoveTo(l,b);LineTo(l,b-h); MoveTo(x0,y0);LineTo(x0+w,y0); TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3)); TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3)); // построение графика x:=x1; repeat y:=f(x); Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed; x:=x+dx; until (x>=x2); end; end; procedure TForm1.FormPaint(Sender: TObject); begin GrOfFunc; end; // изменился размер окна программы procedure TForm1.FormResize(Sender: TObject); begin // очистить форму form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight)); // построить график GrOfFunc; end; end.
Создайте приложение, которое строит пикселями график функции y=3*Sin(x)*Cos(x/6). Создайте форму, свойству Caption которой присвойте значение «График функции». В окне Инспектора объектов задайте для свойства Forml.ClientHeight (высота окна формы) значение 300, для свойства Forml.ClientWidht (ширина окна формы) задайте значение 500, для свойства Forml.Color задайте значение clWhite (белый). Для создания процедуры обработчика события OnPaint (перерисовать изображение) выберите в окне Инспектора объектов объект Forml и на странице Events произведите двойной щелчок на пустом поле списка в событии OnPaint. После этого в окне Редактора кода будет сгенерирована заготовка процедуры обработчика события procedure TForml.FormPaint(Sender: TObject); Введите в текст процедуры вызов процедуры построения графика функции DrawGraph: procedure TForml.FormPaint(Sender: TObject); begin DrawGraph; {вызов процедуры построения графика функции} end: Так как при программировании процедуры построения графика функции нам придется использовать для рисования Canvas (холст, канва), окрашивая пикселы канвы, изучите справочную информацию о свойствах Canvas и Pixels. Поскольку перед построением графика придется чертить прямые линии – оси координат и выводить текст на изображении, то следует также изучить справку Delphi о методах MoveTo, LineTo и TextOut. В связи с тем, что при построении графика функции необходимо задавать целочисленные значения координат окрашиваемого пиксела, а результат вычисления функции является вещественным числом, следует ознакомиться со справочной информацией Delphi, касающейся функции Round, округляющей вещественные числа до ближайшего целого числа. Откройте окно Редактора кода и введите текст процедуры построения графика функции: procedure DrawGraph: // Построение графика функции var xl,x2: real; {границы изменения аргумента функции} yl,y2: real; {границы изменения значения функции} х : real; {аргумент функции} у : real; {значение функции в точке х} dx : real; {приращение аргумента} l,b : integer; {левый нижний угол области вывода графика} w,h: integer; {ширина и высота области вывода графика} mx,my: real; {масштаб по осям X и Y} хО,уО: integer; {точка - начало координат} Function f(x:real):real; {функция, график которой надо построить} begin f:= 3*Sin(x)*Cos(x/6); end; begin {область вывода графика на форме} 1:=10; {X - координата левого верхнего угла} b:=Forml.С1ientHeight-20; (У - координата левого верхнего угла} h:=Forml.ClientHeight-40; // высота w:=Forml.Width-40; // ширина х1:=0; // нижняя граница диапазона аргумента х2:=25; // верхняя граница диапазона аргумента dx:=0.01; // шаг аргумента {определение максимального и минимального значений функции на отрезке [xl,x2] для масштабирования} yl:=f(xl); {минимальное значение функции} y2:=f(xl); {максимальное значение функции} x:=xl; {вычислять значения функции для значений х<=х2 и определить максимальное и минимальное значения для масштабирования} repeat y:=f(x); if y< then> yl;=y; {если текущее значение у меньше минимального, то у1:=у} if y>y2 then у2:=у; {если текущее значение у больше минимального, то у2:=у} x:=x+dx; {перейти к следующему значению х} until (x>=x2); {как только х>=х2. прекратить} my:=h/abs(y2-yl); // масштаб по оси Y mx:=w/abs(x2-xl); // масштаб по оси X {задать начало координат} х0:=1; yO:=b-Abs(Round(yl*my)); with Forml.Canvas do {рисование графика} begin {начертить оси координат} MoveTo(I ,b); LineTo(I,.b-h); {ось x} MoveTo(xO,yO); LineTo(xO+w.yO); {ось у} Text0ut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3)); {вывести максимальное значение} TextOut(xO+w,yO,'x'); // подписать ось х TextOut(1+5,b,FloatToStrF(yl,ffGeneral,6,3)); {вывести минимальное значение} Text0ut(l-7,b-h-5,'у'); // подписать ось у {построение графика} x:=xl: repeat {повторять рисовать точки} y:=f(x); Forml. Canvas. Pixel s[xO+Round(x*mx),yO-Round(y*rny)]:=clRed; {clRed - красный цвет рисования графика} x:=x+dx; until (x>=x2); {прекратить, как только х>=х2} end; end; Изучите текст процедуры построения графика функции DrawGraph. Сохраните, откомпилируйте и запустите приложение на выполнение. Убедитесь, что в окне приложения производится построение графика заданной функции. Если вы попытаетесь изменить размеры окна, то увидите, что график искажается, так как он не перерисовывается в соответствии с новыми размерами окна. Для того чтобы перерисовывать изображение при изменении размеров формы, следует создать обработчик события On Resize, определяющий новые параметры клиентской области и вызывающий процедуру построения графика функции DrawGraph. Эта процедура может выглядеть следующим образом: procedure TForml.FormResizeCSender: TObject); begin with Forml do Canvas. FillRect (Rect (0,0, ClientWicith, ClientHeight)): {заполнение прямоугольника канвы, указанного параметром Rect, где ClientWidth.ClientHeight -ширина и высота клиентской области в пикселах} DrawGraph; end; Сохраните измененное приложение, откомпилируйте его и проверьте его работу. Убедитесь, что в окне приложения выполняется построение графика заданной функции, причем при изменении размеров окна происходит корректное перерисовывание графика в новом масштабе
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormPaint(Sender: TObject); var x0,y0: Integer; // начало координат по х и у x,y: Extended; // расчет х и у m: Integer; // масштаб begin x0 := ClientWidth div 2; //узнаем центр формы по х y0 := ClientHeight div 2; // узнаем центр формы по у
// чертим х ось Canvas.MoveTo(0, y0); Canvas.LineTo(ClientWidth, y0);
// чертим у ось Canvas.MoveTo(x0, 0); Canvas.LineTo(x0, ClientHeight);
m := 15; //задаем масштаб, иначе будет очень мелкий график
x := -20; // зададим диапазон от куда до куда будем считать наш график
// собственно прорисовывем while x <= 20 do begin y := 3*x-4; Canvas.Pixels[x0+Round(x*m), y0-Round(y*m)] := clGreen; x := x + 0.01; end;
end;
procedure TForm1.FormResize(Sender: TObject); begin Repaint; end;
end. |
Мазмұны Кріспе……… 3
1 Delphi программалау ортасы………….. 6 1.1 Delphi программалау жүйесі………. 6 1.2 Delphi–дің артықшылықтары……….. 7 1.3 Өнімнің негізгі сипаттамалары………… 7 1.4 Ұйымдастырушының ортасын икемдеу ……… 13 1.5 Компоненттер………. 16 1.6 Delphi программалау ортасының графикалық мүмкіндіктері……. 17 1.7 Мәтінді шығару…….19 1.8 Canvas объектінің қасиеттері…….. 21
2. Delphi ортасынның графикалық мүмкіндіктерін сипаттайтын программа 21
Қорытынды…………. 23
Пайдаланылған әдеиеттер көзі…………. 26
Қосымша………. 27
кіріспе
Әлемдегі миллиондаған программистер Delphi-де жұмыс жасайды және олардың көбісі Delphi-де мәліметтерді өңдеуге және сақтауға арналған программалар құрады. Күнбе-күн коммерциялық және жеке мәліметтерді санамағанда (адам аттары, мекен-жайлар, есепшоттар) визуальды интерфейс көмегімен жұмыс істеу керек болатын көптеген ақпараттар бар: дыбыс файлдары, видео көріністер, WEB –парақшалары және т.б. Осындай көп ақпарат арасында өзімізге керекті мәліметтерді алу үшін, оларды өңдейтін программалар қажет.
Программа құруға ыңғайлы тамаша ортаның бірі – Delphi ортасы таңдап алынды. Оны оқып үйрену , түсіну және логикалыңқ ойлауға өте қарапайым , әрі жеңіл. Delphi программалаудың структуралық тәртібін және программалаудың басқа тілдерге қарағанда жалпы жақсы дамыған.Оның қызықты рекурсивті мүмкіндіктері , сонымен қатар қызықты есептер шығару мүмкіндіктері бар.
Delphi типті жүйені тез және визуальды құру ортасы деп атайды.Себебі ол өзіне компилятормен қоса редактор және көптеген дайын программалар жиынтығын қамтиды.Delphi – де шамамен 200 – ге жуық дайын компоненттер бар.
Delphi-де программа құру жақсы жабдықталған компьютерді қажет етеді.
DELPHI – бұл Borland International-дың қосымшаларды тез құруға арналған жеткілікті жаңа өнімі. Қосымшалармен мәліметтер қорымен “клиент-сервер “ архитектурасында, Internet/Intranet, сонымен қатар локальді машиналар және “ файл-серверлік “ архитектурасында жұмыс істейді.
DELPHI тілі объектілі – бағытталған Object Pascal тілінің жалғасы. DELPHI-ге InterBase локальді SQL сервері, есеп беру генераторлары, визуальді компоненттің және информациялық жүйені немесе Windows ортасының қарапайым программаларын кәсіби өндеуде өзінді сенімді сезіну үшін арналған тағы басқа құрылғылар жатады.
Delphi 6 Windows 95, Windows 98 немесе Windows NT операциялық жүйесінің басқаруымен жұмыс істейді. Delphi 6 ерекшелігі: көптеген Delphi 6-да құрылған программалар негізінен өндіріс және бизнес есептерін шешуге бағытталған. Бұл мәлімметтер қорымен және есеп беру жұмыстары басты шешілу керек есептер болып табылады.
Программалардың сәйкестендірілуі үлкен роль атқарылады. Бұл аппаратпен қамтамассыздандырумен байланысты (HardWare) жекелеген жағдайда
— Мобильді компьютерлерді тарату кең ауқым алуымен байланысты.
Дыбыс, сурет, тексттік және цифрлық типтермен берілген информацияларды беру және оқыту, алу үшін арналған техникалық жабдықтардың әрі қарай дамуы.
Жоғарыда айтылғандай бизнеспен және өндіріспен тығыз байланысты болғандықтан қолданушылар Delphi 6-дан өздерінің есептерін шешу үшін идеал көмекші құрал тапты. Delphi 6-дің Visual Basic және C++ сияқты қолданушы интерфейсі бар. Қазіргі кезде көптеген фирмалар өз программа интерфейсінің стандарты ретінде қабылдады. Қолданушы интерфейсі визуалды құрылатын болғандықтан Delphi ортасында программалауды тез программа құру ортасы делінеді.
Құрудың графикалық ортасынан басқа аспектісі ол- көмекші жүйесінінің күштілігі.
Delphi 6-да басқа да қазіргі программалау ортасы сияқты, объектілі бағытталған программаларға негізделген. Программа құру барысында дайын компоненттерді, олардың қасиетін, әдістерін және алдын-ала анықталған оқиғаларды пайдалану арқылы аз ғана программа кодымен айналып өтуге болады. Программа құрушыға бұл өзінің программасының қолданушы интерфейсін құру барысында көп уақыт үнемдеуді білдіреді.
Delphi 6 қолданушыға өте ыңғайлы, тез программа құруға мүмкіндік береді. Бұл ортаның құрал-саймандары өте көп және керек кезінде актив элемент үшін F1 пернесін басу арқылы көмек алуға болады.
