- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Листинг 10.1. Стили заполнения областей



Глава 10

Графические возможности Delphi

Например, инструкция Form1.Canvas.Rectangle (10,10,100,100) вычерчивает в окне программы прямоугольник.

Холст

canvas — это объект типа TCanvas

.

Рис. 10.1. Координаты точек холста

Height и width ClientHeight и Clientwidth.

Карандаш и кисть

Реn (карандаш) и Brush (кисть), которые представляют собой объекты типа TPеп и TBrush, соответственно.

Карандаш

Таблица 10.1. Свойства объекта треп (карандаш)

       
  Свойство Определяет  
  Color Цвет линии  
  Width Толщину линии  
  Style Вид линии  
  Mode Режим отображения  
       

Таблица 10.2. Значение свойства Color определяет цвет линии

           
  Константа Цвет Константа Цвет  
  clBlack Черный clSilver Серебристый  
  clMaroon Каштановый clRed Красный  
  clGreen Зеленый clLime Салатный  
  clOlive Оливковый clBlue Синий  
  clNavy Темно-синий clFuchsia Ярко-розовый  
  clPurple Розовый clAqua Бирюзовый  
  clTeal Зелено-голубой clWhite Белый  
  clGray Серый      
           

Таблица 10.3. Значение свойства Реn. Style определяет вид линии

       
  Константа Вид линии  
  psSolid Сплошная линия  
  psDash Пунктирная линия, длинные штрихи  
  psDot Пунктирная линия, короткие штрихи  
  psDashDot Пунктирная линия, чередование длинного и короткого штрихов  
  psDashDotDot Пунктирная линия, чередование одного длинного и двух коротких штрихов  
  psClear Линия не отображается (используется, если не надо изображать границу области, например, прямоугольника)  
       

Таблица 10.4. Значение свойства Реп. Mode влияет на цвет линии

       
  Константа Цвет линии  
  pmBlack Черный, не зависит от значения свойства Pen. Color  
  pmWhite Белый, не зависит от значения свойства Pen. Color  
  pmCopy Цвет линии определяется значением свойства Pen . Color  
  pmNotCopy Цвет линии является инверсным по отношению к значению свойства Pen. Color  
  pmNot Цвет точки линии определяется как инверсный по отношению к цвету точки холста, в которую выводится точка линии  
       

Кисть

(canvas.Brush)

Таблица 10.5. Свойства объекта TBrush (кисть)

       
  Свойство Определяет  
  Color Style Цвет закрашивания замкнутой области Стиль (тип) заполнения области  
       

Таблица 10.6. Значения свойства Brush. style определяют тип закрашивания

       
  Константа Тип заполнения (заливки) области  
  bsSolid Сплошная заливка  
  bsClear Область не закрашивается  
  bsHorizontal Горизонтальная штриховка  
  bsVertical Вертикальная штриховка  
  bsFDiagonal Диагональная штриховка с наклоном линий вперед  
  bsBDiagonal Диагональная штриховка с наклоном линий назад  
  bsCross Горизонтально-вертикальная штриховка, в клетку  
  bsDiagCross Диагональная штриховка, в клетку  
       

Рис. 10.2. Окно программы Стили заполнения областей

Листинг 10.1. Стили заполнения областей

unitbrustyle_;

Interface

usesWindows, Messages, SysUtils, Classes,Graphics, Controls,

Forms, Dialogs, ExtCtrls;

Type

TForm1 = class(TForm)

procedureFormPaint(Sender: TObject);

private{ Private declarations}

public{ Public declarations )

end;

varForm1: TForm1;

Implementation

{$R *.DFM}

// перерисовка формы

procedureTForm1.FormPaint(Sender: TObject);

Const

bsName: array[1..8]of string =('bsSolid','bsClear',

'bsHorizontal','bsVertical','bsFDiagonal',

'bsBDiagonal','bsCross','bsDiagCross');

Var

x,y: integer; // координаты левого верхнего угла прямоугольника

w,h: integer; // ширина и высота прямоугольника

bs: TBrushStyle;// стиль заполнения области

k: integer; // номер стиля заполнения

i,j: integer;

Begin

w:=40; h:=40; // размер области(прямоугольника)

у:=20;

for i:=1to2do

Begin

х:=10;

forj:=1 to4 do

Begin

k:=j+(i-1)*4; // номер стиля заполнения

casek of

1: bs = bsSolid;

2: bs = bsClear;

3: bs = bsHorizontal;

4: bs = bsVertical;

5: bs = bsFDiagonal;

6: bs = bsBDiagonal;

7: bs = bsCross;

8: bs = bsDiagCross; end;

// вывод прямоугольника

Canvas.Brush.Color := clGreen;

// цвет закрашивания — зеленый

Canvas.Brush.Style := bs;

// стиль закрашивания

Canvas.Rectangle(x, y, x+w, y-t-h);

// вывод названия стиля

Canvas.Brush.Style := bsClear;

Canvas.TextOut(x, y-15, bsName[k]);

// вывод названия стиля

x := x+w+30;

end;

у:= y+h+30;

End;end;end.

Вывод текста

Объект.Canvas.TextOut(x, у, Текст)

где:

Рис. 10.3. Координаты области вывода текста

Таблица 10.7. Свойства объекта TFont

       
  Свойство Определяет  
  Name Size   Style Используемый шрифт. В качестве значения следует использовать название шрифта, например Arial Размер шрифта в пунктах (points). Пункт— это единица измерения размера шрифта, используемая в полиграфии. Один пункт равен 1/72 дюйма Стиль начертания символов. Может быть: нормальным, полужирным, курсивным, подчеркнутым, перечеркнутым. Стиль задается при помощи следующих констант: fsBold (полужирный), fsItalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый).  
       

 

       
  style   Color Свойство style является множеством, что позволяет комбинировать необходимые стили. Например, инструкция программы, устанавливающая стиль "полужирный курсив", выглядит так: Объект. Canvas . Font : = [fsBold, fsItalic] Цвет символов. В качестве значения можно использовать константу типа Tcolor  
       

Внимание!

Область вывода текста закрашивается текущим цветом кисти. Поэтому перед выводом текста свойству Brush.Color нужно присвоить значение bsClear или задать цвет кисти, совпадающий с цветом поверхности, на которую выводится текст.

Следующий фрагмент программы демонстрирует использование функции TextOut для вывода текста на поверхность формы:

withForm1.Canvas do begin

// установить характеристики шрифта

Font.Name := 'Tahoma';

Font.Size := 20;

Font.Style := [fsItalic, fsBold] ;

Brush.Style := bsClear; // область вывода текста не закраш.

TextOut(0, 10, 'Borland Delphi 7');

end;

После вывода текста методом Textout указатель вывода (карандаш) перемещается в правый верхний угол области вывода текста.

Следующий фрагмент программы демонстрирует возможность вывода строки текста при помощи двух инструкций TextOut.

withForm1.Canvas do begin

TextOut(0, 10, 'Borland ') ;

TextOut(PenPos.X, PenPos.Y, 'Delphi 7');

end;

Линия

Компонент.Canvas.LineTo(x,у)

MoveTo(x,y), указав в качестве параметров координаты нового положения карандаша.

Рис. 10.4. Форма приложения Координатная сетка

Interface

usesWindows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

procedureFormPaint(Sender: TObject);

private{ Private declarations }

public{ Public declarations }

end;

varForm1: TForm1;

Implementation

{$R *.DFM}

procedureTForm1.FormPaint(Sender: TObject);

Var

x0,y0:integer; // координаты начала координатных осей

dx,dy:integer; // шаг координатной сетки (в пикселах)

h,w:integer; //высота и ширина области вывода координатной сетки

х,у:integer;

lx,ly:real; // метки (оцифровка) линий сетки по X и Y

dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Y

cross:integer; // счетчик неоцифрованных линий сетки

dcross:integer; // количество неоцифрованных линий между //оцифрованными

Begin

х0:=30; у0:=220; // оси начинаются в точке (40,250)

dx:=40; dy:=40; // шар координатной сетки 40 пикселов

dcross:=1; // помечать линии сетки X: 1 — каждую;

// 2 — через одну; 3 — через две;

dlx:=0.5; // шаг меток оси X

dly:=1.0; // шаг меток оси Y, метками будут: 1, 2, 3 и т. д.

h:=200; w:=300;

withform1.Canvas do begin

cross:=dcross;

MoveTo(x0,v0); LineTo(x0,y0-h); // ось X

MoveTo(x0,y0); LineTo(x0+w, y0); // ось Y

// засечки, сетка и оцифровка по оси X

x:=x0+dx;

lx:=dlx;

Repeat

MoveTo(x,y0-3);LineTo(x,yO+3); // засечка

cross:=cross-l;

if cross = 0 then// оцифровка

Begin

TextOut(x-8,y0+5,FloatToStr(lx));

cross:=dcross ;

end;

Pen.Style:=psDot;

MoveTo(x,y0-3);LineTo(x,y0-h); // линия сетки

Pen.Style:=psSolid;

lx:=lx+dlx;

x:=x+dx;

until (x>x0+w);

// засечки, сетка и оцифровка по оси Y

y:=y0-dy;

ly:=dly;

Repeat

MoveTo(х0-3,у);LineTo(х0+3,у); // засечка

TextOut(х0-20,у,FloatToStr(1у)); // оцифровка

Pen.Style:=psDot; // пунктирная(короткая) линия

MoveTo(х0+3,у); LineTo(x0+w,у); // линия сетки

Pen.Style:=psSolid; // сплошная линия

y:=y-dy;

ly:=ly+dly;

until (y<y0-h);

end;

end;

End.

Ломаная линия

Метод polyline вычерчивает ломаную линию. В качестве параметра метод получает массив типа TPoint. Каждый элемент массива представляет собой запись, поля х и у которой содержат координаты точки перегиба ломаной. Метод Polyline вычерчивает ломаную линию, последовательно соединяя прямыми точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д.

Var

gr: array[1..50] ofTPoint; // график — ломаная линия

x0,y0: integer; // координаты точки начала координат

dx,dy: integer; // шаг координатной сетки по осям X и Y

i: integer;

Begin

х0 := 10; у0 := 200; dx :=5;dy := 5;

// заполним массив gr

fori:=l to50 do begin

gr[i].x := x0 + (i-l)*dx;

gr[i].y := y0 - Data[i]*dy;

end;

// строим график

withforml.Canvas do begin

MoveTo(x0,y0); LineTo(x0,10); // ось Y

MoveTo(x0,y0); LineTo(200,y0); // ось X

Polyline(gr); // график

end;

end;

Метод Polyline можно использовать для вычерчивания замкнутых контуров. Для этого надо, чтобы первый и последний элементы массива содержали координаты одной и той же точки.

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

procedureFormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private{ Private declarations }

public{ Public declarations }

end;

varForml: TForml;

Implementation

{$R *.dfm}

// вычерчивает звезду

procedureStarLine(x0,y0,r: integer; Canvas: TCanvas);

// x0,y0 — координаты центра звезды

//r — радиус заезды

Var

р : array [1.. 11] ofTPoint;

// массив координат лучей и впадин

a: integer; // угол между осью ОХ и прямой, соединяющей

// центр звезды и конец луча или впадину

i: integer;

Begin

а := 18; // строим от правого гор. луча

fori:=l to10 do begin

if(i mod2=0) then begin// впадина

p[i].x := x0+Round(r/2*cos(a*pi/180) ) ;

p[i].y:=y0-Round(r/2*sin(a*pi/180) ) ;

End

else begin// луч

[i].x:=x0+Round(r*cos (a*pi/180) ) ;

[i].y:=y0-Round(r*sin(a*pi/180) ) ;

end;

a := a+36;

end;

p[ll].X := p[l].X; // чтобы замкнуть контур звезды

Canvas.Polyline(р) ; // начертить звезду

end;

// нажатие кнопки мыши

procedureTForm1.FormMouseDown(Sender:TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Begin

ifButton = mbLeft // нажата левая кнопка?

thenForm1.Canvas.Pen.Color : = clRed

elseForm1.Canvas.Pen.Color := clGreen;

StarLine(x, y, 30, Forml. Canvas );

end;

End.

Рис.10.5. Звезда

Примечание

Обратите внимание, что размер массива р на единицу больше, чем количество концов и впадин звезды, и что значения первого и последнего элементов массива совпадают.

Окружность и эллипс

Объект.Canvas.Ellipse(x1,y1,х2,у2)

где:

Рис. 10.6. Значения параметров метода Ellipse определяют вид геометрической фигуры

Дуга

Объект.Canvas.Arc(x1,y1,х2,у2,х3,у3,х4,у4)

где:

Дуга вычерчивается против часовой стрелки от начальной точки к конечной (рис. 10.7).

Рис. 10.7. Значения параметров метода Arc определяют дугу как часть эллипса (окружности)

Прямоугольник

Объект.Canvas.Rectangle(x1,y1,x2,y2)

где:

Метод RoundRec тоже вычерчивает прямоугольник, но со скругленными углами. Объект.Canvas.RoundRec(x1,y1,х2, у2, х3, у3)

где:

Рис. 10.8. Метод RoundRec вычерчивает прямоугольник со скругленными углами

procedureTForm1.Button1Click(Sender: TObject);

Var

r1, r2: TRect; // координаты углов прямоугольников

Begin

// заполнение полей структуры

// зададим координаты углов прямоугольников

r1 := Rect(20,20,60,40);

r2 := Rect(10,10,40,50);

with fоrm1.Canvas do begin

Brush.Color := clRed;

FillRect(r1); // закрашенный прямоугольник

Brush.Color := clGreen;

FrameRect(r2}; // только граница прямоугольника

end;

end;

Многоугольник

Метод Polygon вычерчивает многоугольник

Ниже приведена процедура, которая, используя метод polygon, вычерчивает треугольник:

procedureTForm1.Button2Click(Sender: TObject);

Var

pol: array[1..3] ofTPoint; // координаты точек треугольника

Begin

pol[1].x := 10;

polf1].y := 50;

pol[2].x := 40;

pol[2].y := 10;

pol[3].х := 70;

pol[3].у := 50;

Forml.Canvas.Polygon(pol);

end;

Сектор

Объект. Canvas.Pie(x1,y1,x2,y2,х3,у3,х4,у4)

где:

Рис. 10.9. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)

Точка

Form1.Canvas.Pixels[10,10]:=clRed окрашивает точку поверхности формы в красный цвет.

Размерность массива pixels определяется размером графической поверхности. Размер графической поверхности формы (рабочей области, которую также называют клиентской) задается значениями свойств ClientWidth и ClientHeight, а размер графической поверхности компонента image — значениями свойств Width и Height. Левой верхней точке рабочей области формы соответствует элемент pixels [0,0], а правой нижней - Pixels[Clientwidth - 1,ClientHeight - 1].

Например, если некоторая функция f(x) может принимать значения от нуля до 1000, и для вывода ее графика используется область формы высотой в 250 пикселов, то масштаб оси Y вычисляется по формуле: т = 250/1000. Таким образом, значению f(x) = 70 будет соответствовать точка с координатой Y =233. Значение координаты Y вычислено по формуле

Y= h -f(x) ´ m = 250 – 70 ´ (250/1000),

где h - высота области построения графика.

Примеры построения графиков функций у = 2 sin(x) ex/5.

Interface

usesWindows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs;

Type

TForm1 = class(TForm)

procedureFormPaint(Sender: TObject);

procedureFormResize(Sender: TObject);

private{ Private declarations }

public{Public declarations }

end;

varForm1: TForm1;

Implementation

{$R *.DFM}

// Функция, график которой надо построить

Functionf(x:real):real;

Begin

f:=2*Sin(x)*exp(x/5) ;

end;

// строим график функции

procedureGrOfFunc;

Var

x1,x2:real; // границы изменения аргумента функции

y1,y2:real; // границы изменения значения функции

х:real; // аргумент функции

у:real; // значение функции в точке х

dx:real; // приращение аргумента

l,b:integer; // левый нижний угол области вывода графика

w,h:integer; // ширина и высота области вывода графика

mx,my:real; // масштаб по осям X и Y

х0,у0:integer; // точка — начало координат

Begin

// область вывода графика

l:=10; // X — координата левого верхнего угла

b:=Form1.ClientHeight-20; //У — координата левого верхнего угла

h:=Form1.ClientHeight-40; // высота

w:=Form1.Width-40; // ширина

x1:=0; // нижняя граница диапазона аргумента

х2:=25; // верхняя граница диапазона аргумента

dx:=0.01; // шаг аргумента

// найдем максимальное и минимальное значения

// функции на отрезке [x1,x2]

y1:=f(x1); // минимум

y2:=f(x1); //максимум

x:=x1;

Repeat

У := f (х);

ifу < y1theny1:=y;

ifу > у2theny2:=y;

х:=x+dx;

until (x >= х2);

// вычислим масштаб

my:=h/abs(y2-y1); // масштаб по оси Y

mx:=w/abs(x2-x1); // масштаб по оси X

х0:=1;

у0:=b-Abs(Round(y1*my));

withform1.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;

procedureTForm1.FormPaint(Sender: TObject);

beginGrOfFunc; end;

// изменился размер окна программы

procedureTForm1.FormResize(Sender: TObject);

Begin

// очистить форму

form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));

// построить график

GrOfFunc;

end;

End.

Основную работу выполняет процедура GrOfFunc, которая сначала вычисляет максимальное (у2) и минимальное (yl) значения функции на отрезке [x1,x2]. Затем, используя информацию о ширине (Forml.Clientwidth -40) и высоте (Form1.ClientHeight - 40) области вывода графика, вычисляет масштаб по осям X (mх) иY(mу).

Высота и ширина области вывода графика определяется размерами рабочей (клиентской) области формы, т. е. без учета области заголовка и границ. После вычисления масштаба процедура вычисляет координату у горизонтальной оси (уо) и вычерчивает координатные оси графика. Затем выполняется непосредственное построение графика (рис. 10.10).

Вызов процедуры GrOfFunc выполняют процедуры обработки событий OnPaint и OnFormResize. Процедура TForm1.FormPaint обеспечивает вычерчивание графика после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы, например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Процедура TForm1.FormResize обеспечивает вычерчивание графика после изменения размера формы.

Рис. 10.10. График, построенный процедурой GrOfFunc

Примечание

Рассмотренная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу следует внести изменения.

Программа вывода графика любой функции, используя компоненту Image

unit Unit1;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ExtCtrls;

Type

TForm1 = class(TForm)

Image1: TImage;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

Button1: TButton;

Edit1: TEdit;

Label1: TLabel;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N1Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

Var

Form1: TForm1;

Implementation

{$R *.dfm}

function www(x:real):real ;

Begin

result:=x*x-3*x+2;

end;

procedure TForm1.Button1Click(Sender: TObject);

varx,y:real; i:integer;

Begin

if Edit1.Text<> '' then

Begin

Image1.Canvas.Brush.Color:=clWhite;

Image1.Canvas.Rectangle(0,0,501,501);

Image1.Canvas.MoveTo(0,251);

Image1.Canvas.LineTo(501,251);

Image1.Canvas.MoveTo(251,0);

Image1.Canvas.LineTo(251,501);

Image1.Canvas.MoveTo(241,20);

Image1.Canvas.LineTo(251,0);

Image1.Canvas.LineTo(261,20);

Image1.Canvas.MoveTo(481,241);

Image1.Canvas.LineTo(501,251);

Image1.Canvas.LineTo(481,261);

for i:=1 to 21 do begin

Image1.Canvas.MoveTo(i*25+1,246);

Image1.Canvas.LineTo(i*25+1,254);

Image1.Canvas.TextOut(i*25+1,255,FloatToStr(StrToInt(edit1.Text)/250*(i*25-250)));

Image1.Canvas.MoveTo(246,i*25+1);

Image1.Canvas.LineTo(254,i*25+1);

Image1.Canvas.TextOut(255,i*25+1,FloatToStr(- StrToInt(edit1.Text)/250*(i*25-250)));

end;

Image1.Canvas.TextOut(240,10,'y');

Image1.Canvas.TextOut(480,230,'x');

x:=StrToInt(edit1.Text)/250*(-250);

y:=www(x);

Image1.Canvas.MoveTo(round(X/Strtoint(Edit1.Text)*250+251),

round(-Y/StrToInt(Edit1.Text)*250+251));

fori:=2 to 501 do begin

x:=StrToInt(edit1.Text)/250*(i-251);

y:=www(x);

Image1.Canvas.LineTo(round(X/Strtoint(Edit1.Text)*250+251),

round(- Y/StrToInt(Edit1.Text)*250+251)); end

End

else ShowMessage('введите масштаб');

end;

procedure TForm1.FormCreate(Sender: TObject);

Begin

Image1.Canvas.Brush.Color:=clWhite;

Image1.Canvas.Rectangle(0,0,501,501);

Image1.Canvas.MoveTo(0,251);

Image1.Canvas.LineTo(501,251);

Image1.Canvas.MoveTo(251,0);

Image1.Canvas.LineTo(251,501);

Image1.Canvas.MoveTo(241,20);

Image1.Canvas.LineTo(251,0);

Image1.Canvas.LineTo(261,20);

Image1.Canvas.MoveTo(481,241);

Image1.Canvas.LineTo(501,251);

Image1.Canvas.LineTo(481,261);

Image1.Canvas.TextOut(240,10,'y');

Image1.Canvas.TextOut(480,230,'x');

end;

procedure TForm1.N2Click(Sender: TObject);

begin close; end;

procedure TForm1.N1Click(Sender: TObject);

Begin

MessageDlg('программа рисует функцию, заданную в подпрограмме-функция. В окне масштаб вводится число отрезков на которые разбиваются координатные прямые',mtinformation,[mbok],0)

End; end.

 

Вывод иллюстраций

Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помощи компонента image, значок которого находится на вкладке Additionalпалитры (рис. 10.11).

Рис. 10.11. Значок компонента Image

В табл. 10.8 перечислены основные свойства компонента image.

Таблица 10.8. Свойства компонента image

       
  Свойство Определяет  
  Picture Width, Height   AutoSize   Strech   Visible Иллюстрацию, которая отображается в поле компонента Размер компонента. Если размер компонента меньше размера иллюстрации, и значение свойств AutoSize и strech равно False, то отображается часть иллюстрации Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации Признак автоматического масштабирования иллюстрации в соответствии с реальным размером компонента. Чтобы было выполнено масштабирование, значение свойства AutoSize должно быть False Отображается ли компонент, и, соответственно, иллюстрация, на поверхности формы  
       

Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.

Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Loadокна Picture Editor(рис. 10.12). Чтобы запустить Image Editor, нужно в окне Object Inspectorвыбрать свойство Picture и щелкнуть на кнопке с тремя точками.

Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.

Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция

Form1.Image1.Picture.LoadFromFile('e:\temp\bart.bmp')

загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (image1).

Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).

Следующая программа, ее текст приведен в листинге 10.6, использует компонент image для просмотра иллюстраций, которые находятся в указанном пользователем каталоге. Диалоговое окно программы приведено на рис. 10.13.

Рис. 10.12. Окно Picture Editor

Рис. 10.13. Слайд-проектор

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms,Dialogs, ExtCtrls, StdCtrls, Menu

Type

TForm1 = class(TForm)

Image1: ТImage;

Button1: TButton;

procedureFormActivate(Sender: TObject);

procedureButton1Click(Sender: TObject);

private{ Private declarations }

public{ Public declarations }

end;

Var

Form1: TForm1;

aSearchRec : TSearchRec;

aPath : String;// каталог, в котором находятся иллюстрации

aFile : String;// файл иллюстрации

iw,ih: integer; // первоначальный размер компонента Image

Implementation

{$R *.DFM}

// изменение размера области вывода иллюстрации

// пропорционально размеру иллюстрации

ProcedureScaleImage;

Var

pw, ph : integer; // размер иллюстрации

scaleX, scaleY : real; // масштаб по Х и Y

scale : real; // общий масштаб

Begin

// иллюстрация уже загружена

// получим ее размеры

pw := Form1.Image1.Picture.Width;

ph := Form1.Image1.Picture.Height;

ifpw > iw // ширина иллюстрации больше ширины компонента Image

thenscaleX := iw/pw // нужно масштабировать

elsescaleX := 1;

if ph > ih // высота иллюстрации больше высоты компонента

then scaleY := ih/ph // нужно масштабировать

elsescaleY := 1;

// выберем наименьший коэффициент

if scaleX < scaleY

thenscale := scaleX

elsescale := scaleY;

// изменим размер области вывода иллюстрации

Form1.Image1.Height := Round(Form1.Image1.Picture.Height*scale)

Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);

// т. к. Strech = True и размер области пропорционален

// размеру картинки, то картинка масштабируется без искажений

end;

// вывести первую иллюстрацию

procedureFirstPicture;

Var

r : integer; // результат поиска файла

Begin

aPath := 'f:\temp\';

r := FindFirst(aPath+'*.bmp',faAnyFile,aSearchRec);

if r = 0then

begin// в указанном каталоге есть bmp-файл

aFile := aPath + aSearchRec.Name;

Form1.Image1.Picture.LoadFromFile(aFile); // загрузить

// иллюстрацию

ScaleImage; //-установить размер компонентаImage

r := FindNext(aSearchRec); // найти следующий файл

if r = 0 then// еще есть файлы иллюстраций

Form1.Button1.Enabled := True;

end;

end;

// вывести следующую иллюстрацию

ProcedureNextPicture();

Var

r : integer;

Begin

aFile := aPath + aSearchRec.Name;

Forml.Image1.Picture.LoadFromFile(aFile);

ScaleImage;

// подготовим вывод следующей иллюстрации

r := FindNext(aSearchRec); // найти следующий файл

ifr<>0

then// больше нет иллюстраций

Forml.Button1.Enabled := False;

end;

procedureTForm1.FormActivate(Sender: TObject);

Begin

Image1.AutoSize:=False; //запрет автоизменения размера

//компонента

Image1.Stretch := True; // разрешим масштабирование

// запомним первоначальный размер области вывода иллюстрации

iw := Image1.Width;

in := Image1.Height;

Button1.Enabled := False; // сделаем недоступной кнопку Дальше

FirstPicture; // вывести первую иллюстрацию

end;

//щелчок на кнопке Дальше

procedureTForm1.Button1Click(Sender: TObject);

Begin

NextPicture;

end;

End.

Программа выполняет масштабирование выводимых иллюстраций без искажения, чего нельзя добиться простым присвоением значения True свойству strech. Загрузку и вывод первой и остальных иллюстраций выполняют соответственно процедуры FirstPicture и NextPicture. Процедура FirstPicture использует функцию FindFirst для того, чтобы получить имя первого BMP-файла. В качестве параметров функции FindFirst передаются:

Если в указанном при вызове функции FindFirst каталоге есть хотя бы один BMP-файл, значение функции будет равно нулю. В этом случае метод LoadFromFiie загружает файл иллюстрации, после чего вызывается функция ScaleImage, которая устанавливает размер компонента пропорционально размеру иллюстрации. Размер загруженной иллюстрации можно получить, обратившись к свойствамForm1.Image1.Picture.Width и Form1.Image1.Picture.Height, значения которых не зависят от размера компонента Image.

Глава 10

Графические возможности Delphi

Например, инструкция Form1.Canvas.Rectangle (10,10,100,100) вычерчивает в окне программы прямоугольник.

Холст

canvas — это объект типа TCanvas

.

Рис. 10.1. Координаты точек холста

Height и width ClientHeight и Clientwidth.

Карандаш и кисть

Реn (карандаш) и Brush (кисть), которые представляют собой объекты типа TPеп и TBrush, соответственно.

Карандаш

Таблица 10.1. Свойства объекта треп (карандаш)

       
  Свойство Определяет  
  Color Цвет линии  
  Width Толщину линии  
  Style Вид линии  
  Mode Режим отображения  
       

Таблица 10.2. Значение свойства Color определяет цвет линии

           
  Константа Цвет Константа Цвет  
  clBlack Черный clSilver Серебристый  
  clMaroon Каштановый clRed Красный  
  clGreen Зеленый clLime Салатный  
  clOlive Оливковый clBlue Синий  
  clNavy Темно-синий clFuchsia Ярко-розовый  
  clPurple Розовый clAqua Бирюзовый  
  clTeal Зелено-голубой clWhite Белый  
  clGray Серый      
           

Таблица 10.3. Значение свойства Реn. Style определяет вид линии

       
  Константа Вид линии  
  psSolid Сплошная линия  
  psDash Пунктирная линия, длинные штрихи  
  psDot Пунктирная линия, короткие штрихи  
  psDashDot Пунктирная линия, чередование длинного и короткого штрихов  
  psDashDotDot Пунктирная линия, чередование одного длинного и двух коротких штрихов  
  psClear Линия не отображается (используется, если не надо изображать границу области, например, прямоугольника)  
       

Таблица 10.4. Значение свойства Реп. Mode влияет на цвет линии