Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа 7. Графические компоненты



2020-02-04 268 Обсуждений (0)
Лабораторная работа 7. Графические компоненты 0.00 из 5.00 0 оценок




Цель: изучить основные графические возможности.

Многие компоненты Delphi, включая саму форму, имеют средства рисования. Однако есть специальные средства, предназначенные либо непосредственно для рисования, либо для отображения уже готовых рисунков, либо для того и другого. Для рисования компоненты могут включать свойства определенного класса: TPen, TBrush, TCanvas и класс, который определяет цвет. Рассмотрим их более подробно.

Класс TColor позволяет выбирать цвет из таблицы стандартных цветов Windows (clWhite, clRed, …). Однако могут использоваться и нестандартные цвета. В этом случае учитывая, что свойство данного типа хранит четырехбайтовое значение, каждый байт которого (нумерация байтов происходит слева направо) имеет следующее значение:

1 — указатель формата цвета;

2, 3, 4 — интенсивность, соответственно, синей, зеленой и красной
составляющей.

Старший байт указывает, каким способом будут использоваться
остальные байты значения. Если он равен 0, то оставшиеся байты определяют RGB — цвет. Например, значение $00000000 задает черный цвет,
а $00FF0000 — чисто синий цвет, $00FFFFFF — белый цвет. Если старший байт равен 1, то два последних байта определяют один из 65536 возможных логических палитр. Наконец, если старший байт равен 2, то оставшиеся байты задают относительный цвет. Выбор цвета также можно осуществлять посредством диалога. В этом случае используется компонент ColorDialog со страницы Dialogs, который возвращает выбранный из палитры цвет в свойстве Color.

Пример 1

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

Поместим на форму компоненты ColorDialog, Panel, Label и Button. При нажатии на кнопку будет вызываться диалоговое окно, после закрытия которого, данным цветом будет закрашиваться компонент Panel, а в компоненте Label будет выдаваться шестнадцатеричное представление данного цвета. Компонент Panel со стандартной панели инструментов используется просто для демонстрации. Никакими дополнительными свойствами, кроме возможности объединять другие компоненты, он не обладает. Для нас интересно только то, что имеется свойство Color и может менять цвет. В этом случае процедура обработки нажатия на кнопку вызывает диалоговое окно выбора цвета и окрашивает компонент Panel
в выбранный цвет, при этом также отображается шестнадцатеричное представление данного цвета.

procedure TForm1.Button1Click(Sender: TObject);

begin

 if ColorDialog1.Execute then

 begin

 Panel1.Color:=ColorDialog1.Color;

 Label1.Caption:=IntToHex(ColorDialog1.Color,8)

 end;

end;

Теперь рассмотрим обратную задачу, а именно будем задавать самостоятельно шестнадцатеричное представление цвета. Поскольку нет стандартной функции, переводящей символьное представление шестнадцатеричной константы в число, создадим функцию H exStrToHex, которая будет выполнять данную работу. Программа будет иметь вид:

function HexStrToInt(s:string):integer;

 function hex(c:char):integer ;

 begin

 case c of

 '0'..'9':Result:=ord(c)-ord('0');

 'A'..'F':Result:=ord(c)-ord('A')+10;

 end;

 end;

Var i:integer;

begin

result:=0;

if s[1]='$' then delete(s,1,1);

 For i:=1 to length(s) do

 Result:=result*16+hex(s[i]);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 Panel2.Color:=HexStrToInt(Edit1.Text);

end;

Класс TPen задает характеристики карандаша, с помощью которого изображаются различные линии. У этого класса есть свойства Color — для задания цвета линии, Mode — для задания стиля рисования, который заключается в выборе одного или нескольких цветов рисования линии, Style — свойство, определяющее стили рисования (штриховая, пунктирная, штрихпунктирная), Width — свойство целого типа, определяющее толщину линии.

Класс TBrush задает характеристики кисти, которой закрашивается поверхность изображения. Свойство Bitmap задает собственное заполнение раскрашиваемой поверхности и представляет собой изображение 8×8 пикселей, Style — свойство, определяющее орнамент кисти (горизонтальные, вертикальные или диагональные линии).

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

TCanvas представляет собой наиболее сложный класс и является поверхностью, на которой размещается созданное изображение. К свойствам данного класса относятся свойство Pen класса Tpen, свойство Brush класса TBrush. Большое количество методов предназначено для отображения геометрических фигур. При отображении фигур контур изображается карандашом Pen с установленными в нем характеристиками. Если фигура является замкнутой и необходимо произвести ее закраску, то будут использоваться значения свойства класса Brush. Для доступа к каждой точке имеется свойство Pixel, которое является двухмерным массивом, содержащим цвет каждой точки.

В данном классе имеется ряд методов, которые позволяют строить
линию — LineTo, эллипс — Ellipse, дугу — Arc, многоугольника — PolyLine.

Методы для вывода картинок на канву — Draw и StretchDraw. В качестве параметров указываются прямоугольник и графический объект для вывода (это может быть TBitmap, TIcon или TMetafile). StretchDraw отличается тем, что растягивает или сжимает картинку так, чтобы она заполнила весь указанный прямоугольник.

Методы для вывода текста — TextOut и TextRect. При выводе текста используется шрифт (Font) канвы. При использовании TextRect текст выводится только внутри указанного прямоугольника. Длину и высоту текста можно узнать с помощью функций TextWidth и TextHeight.

У объектов из библиотеки визуальных компонентов TBitmap, TComboBox, TDrawGrid, TForm, TImage, TPaintBox, TStringGrid есть свойство Canvas (канва), которое предоставляет простой путь для рисования на них.

На странице System палитры компонентов есть объект TPaintBox, который можно использовать для построения приложений типа графического редактора. Никаких ключевых свойств, кроме Canvas, данный компонент не имеет, собственно, этот объект является просто канвой для рисования.

Рассмотрим некоторые примеры использования графических компонентов и возможности рисования.

Пример 2

При перемещении курсора мыши по форме все пиксели формы закрашиваются в красный цвет. Поскольку пиксели необходимо закрашивать при перемещении мыши, можно использовать событие MouseMove.
В процедуре необходимо просто закрашивать точки формы.

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

 Y: Integer);

begin

Form1.Canvas.Pixels[x,y]:=clRed;

end;

Пример 3

Строятся части прямых линий, которые задаются при перемещении мыши. При первом событии происходит смещение в точки, при следующем эта линия строится. Для решения никаких дополнительных компонентов помещать не будем, поскольку само построение происходит на форме. Необходимо только ввести новую переменную и считать количество нажатий на кнопку. Программа будет иметь следующий вид:

var i:Integer;

procedure TForm1.FormCreate(Sender: TObject);

begin

 i:=1;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

i:=i+1;

if odd(i) then

 Form1.Canvas.LineTo(x,y)

else

 Form1.Canvas.MoveTo(x,y);

end;

Эту задачу можно решить и другим способом. Обрабатывать отдельно нажатие на кнопку мыши и ее отпускание. В одном случае осуществлять перемещение, а во втором — строить данную линию.

Var x1,y1:integer;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

Form1.Canvas.LineTo(x,y);

end;

 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

Form1.Canvas.MoveTo(x,y);

end;

Построение линии подобным образом выглядит не совсем красиво, поскольку она появляется только один раз и остается на этом же месте. При работе с современными графическими редакторами процесс построения линии, да и любого другого объекта, несколько иной. А именно — после фиксации начального положения можно перемещать мышь, при этом появляется динамический характер данного объекта. И только после отпускания кнопки мыши объект фиксируется. Данный эффект принято называть «резиновой линией». Для подобных построений необходимо использовать внутренние функции Windows, т. е. функции API. Изложение данных функций выходит за пределы пособия, однако хочется надеяться, что познавательный интерес возьмет верх и позволит вам разобраться в программе.

Пример 4. Построение «резиновой линии».

type

 TForm1 = class(TForm)

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

procedure FormMouseMove (Sender:TObject; Shift:TShiftState; X,Y: Integer);

procedure FormMouseUp (Sender:TObject;Button:TMouseButton;Shift: TShiftState; X,Y:Integer);

procedure FormCreate(Sender: TObject);

 private

 LineDrawing:Boolean; {Эта переменная равна True, если программа находится в режиме рисования}

 BegX,BegY:Integer; {Начала "резиновой" линии}

 OldX,OldY:Integer; {Последняя точка "резиновой" линии.}

 procedure Line(X1,Y1,X2,Y2:Integer);

 end;

procedure LineDrawRandom(X,Y:Integer;Canvas:TCanvas);stdcall;

 begin

 Canvas.Pixels[X,Y]:=RGB(Random(256),Random(256),Random(256))

end;

{Процедура LineDrawXXX - это функции косвенного вызова (callback-функции) для LineDDE.}

procedure TForm1.Line;

 begin

 LineDDA(X1,Y1,X2,Y2,@LineDrawRandom,Integer(Canvas));

 end;

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

 begin

 if Button=mbLeft then

 begin

 MouseCapture:=True;

 OldX:=X; OldY:=Y;

 BegX:=X; BegY:=Y;

 LineDrawing:=True

 {При нажатии на левую кнопку мыши начинаем рисовать "резиновую" линию. Инициализируем все переменные и захватываем мышь в монопольное пользование.}

 end

 end;

procedure TForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);

 begin

 if LineDrawing and ((X<>OldX) or (Y<>OldY)) then

 with Canvas do

 begin

 SetROP2(Handle,R2_Not);

 Line(BegX,BegY,OldX,OldY); {Стираем старую линию}

 Line(BegX,BegY,X,Y); {Рисуем новую}

 OldX:=X;

 OldY:=Y

 end

 end;

procedure TForm1.FormMouseUp(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);

 begin

 if (Button=mbLeft) and LineDrawing then

 begin

 Line(BegX,BegY,X,Y);

 LineDrawing:=False;

 MouseCapture:=False

 end

 end;

procedure TForm1.FormCreate(Sender: TObject);

 begin

 LineDrawing:=False;

end;

Пример 5

Рассмотрим пример построение графика произвольной функции. Данная задача может быть решена различными способами. Остановимся на варианте, когда определяется массив точек, а затем строится график функции, используя метод Polyline. Точка определяется типом TPoint, который является записью и содержит два поля: соответственно координату x и y.

Function f(x:real):Real;

Begin

 f:=sin(x);

End;

procedure TForm1.Button1Click(Sender: TObject);

 var

 gr:array[1..50] of TPoint;  {График — ломаная линия}

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

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

 i: integer;

begin

 x0:=10; y0:=200; dx:=5; dy:=5;

 for i:=1 to 50 do     {Заполним массив gr }

 begin

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

 gr[i].y:=y0-Round(f(gr[i].x))*dy;

 end;

 with form1.Canvas do

 begin

 MoveTo(x0,y0); LineTo(x0,10); {Ось Y}

 MoveTo(x0,y0); LineTo(200,y0); {Ось X}

 Polyline(gr);              {График }

 end;

end;

Теперь рассмотрим компоненты для создания изображений.

Компонент TShape с закладки Addition представляет собой простейшие графические объекты на форме типа круг, квадрат и т. п. Вид объекта указывается в свойстве Shape. Свойство Pen определяет цвет и вид границы объекта, Brush задает цвет и вид заполнения объекта. Эти свойства можно менять как во время дизайна, так и во время выполнения программы. TBevel — компонент с той же закладки, является объектом для украшения программы, может принимать вид рамки или линии. Объект предоставляет меньше возможностей по сравнению с TPanel, но не занимает ресурсов. Внешний вид указывается с помощью свойств Shape и Style.

Помимо простейших построений имеется возможность обрабатывать более сложные изображения. Для работы с такими изображениями используются специальные объекты. Обычно изображения хранятся отдельно от обрабатывающего объекта в соответствующем файле или потоке.

Вначале рассмотрим классы, которые позволяют обрабатывать изображения. TBitmap (класс — растровые изображения), TIcon (класс — пиктограммы Windows), TMetafile (класс — векторное изображение или метафайлы). Все эти классы являются потомками абстрактного класса TGraph, который не имеет возможности работать с графическими изображениями, но содержит все ключевые свойства и методы, например: свойства Height, Width задающие высоту и ширину содержащегося в данном классе изображения, логические свойства Empty и Modified, первое из которые определяет, содержит ли объект графическое изображение, а второе — было ли модифицировано изображения. Методы LoadFromFile(FileName: String) и SaveToFile(FileName: String) соответственно загружают изображение из файла или сохраняют его в файле. Данные методы перекрываются
в каждом дочернем классе. Имеется возможность описывать переменные рассмотренных выше классов, но нельзя просматривать их содержимое, поскольку нет соответствующих методов.

Любое графическое изображение должно быть помещено в объект класса TPicture, который является надстройкой над изображением и дает ему новые возможности. Являясь надстройкой, сам класс не имеет никаких графических средств и не может самостоятельно обрабатывать включенное в него изображение. Но у него есть несколько особых свойств, например: Graphic — типа TGraphic, которые определяют тип включенного изображения и свойства Bitmap, Icon, MetaFile соответствующих классов, которые определяют вид включенного изображения. При затребовании объекта другого класса, прежний объект, хранящийся в поле, будет уничтожен.

Компонент Image со страницы Additional позволяет поместить графическое изображение в любое место на форме. Картинку можно загрузить во время проектирования в редакторе свойства Picture (инспектор объектов). В этом случае открывается диалоговое окно, где с помощью кнопки Load можно осуществлять просмотр и выбор изображения, которое должно храниться в файле формата BMP (bitmap), WMF или EMF (Windows Meta File), ICO (icon). Как известно, форматов хранения изображений гораздо больше трех вышеназванных (например, наиболее известны PCX, GIF, TIFF, JPEG). Для включения в программу изображений в этих форматах нужно либо перевести их в формат BMP, либо использовать дополнительные модули.

Следует помнить, что изображение, помещенное на форму во время проектирования, включается в файл проекта и затем при компиляции добавляется к EXE-файлу. Поэтому такой EXE-файл может получиться достаточно большой. Как альтернативу рассмотрим загрузку картинки во время выполнения программы. Для этого у свойства Picture воспользуемся методом LoadFromFile.

Важными являются свойства объекта Image и логические свойства AutoSize, Center и Stretch. Если Center установлено в True, то центр изображения будет совмещаться с центром объекта TImage. Если Stretch установлено в True, то изображение будет сжиматься или растягиваться таким образом, чтобы заполнить весь объект, а если свойство AutoSize будет иметь значение True, то подобным образом будет вести себя сам объект.

Кроме перечисленных выше свойств, объект T I mage обладает свойством Canvas, которое позволяет выполнять построения.

Пример 6

Создать программу, которая в зависимости от переключателя будет либо сжимать до необходимого размера изображение, либо выдавать его в естественном виде. Поместим на форму компоненты CheckBox, Image, OpenPictureDialog, Button и опишем следующую процедуру обработки нажатия на кнопку:

procedure TForm1.Button1Click(Sender: TObject);

begin

If CheckBox1.Checked

 Then

 begin

 Image1.AutoSize:=True;Image1.Stretch:=False;

 end

 Else

 begin

 Image1.AutoSize:=False;Image1.Stretch:=True;

 end;

 OpenPictureDialog1.Filter:=GraphicFilter(TGraphic);

 If OpenPictureDialog1.Execute

 Then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName)

end;

Пример 7

В заключение рассмотрим пример создания простейшего графического редактора. Основная работа, т. е. рисование, будет происходить на компоненте Image, диалоговое окно ColorDialog необходимо нам для выбора цвета, а переключатель с независимой фиксацией RadioGroup будет предназначен для выбора инструмента рисования. Две дополнительные кнопки будут служить для вызова диалогового окна выбора цвета либо для очистки формы. Разместив все необходимые компоненты, получим вид формы, изображенный на рисунке 22.

Рисунок 22

 

Основная программа имеет следующий вид:

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls;

type

 TForm1 = class(TForm)

 Image1: TImage;

 RadioGroup1: TRadioGroup;

 ColorDialog1: TColorDialog;

 Button1: TButton;

 Button2: TButton;

 procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

 procedure FormCreate(Sender: TObject);

 procedure Button1Click(Sender: TObject);

 procedure Button2Click(Sender: TObject);

 private

 { Private declarations }

 public

 { Public declarations }

 x1,y1:integer; i:integer;

 end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 i:=i+1;

 image1.Canvas.Brush.Style:=bsclear;

 case RadioGroup1.ItemIndex of

 0:if odd(i) then

 image1.Canvas.Rectangle(x1,y1,x,y) else

 begin

 x1:=x; y1:=y;

 end;

 1:if odd(i) then

 image1.canvas.Ellipse(x1,y1,x,y)

 else

 begin

 x1:=x; y1:=y;

 end;

 2:if odd(i) then

 image1.canvas.lineto(x,y)

 else

 begin

 x1:=x; y1:=y;

 image1.Canvas.MoveTo(x1,y1);

 end;

 end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

 i:=1;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 if ColorDialog1.Execute

 then image1.Canvas.Pen.color:=colordialog1.color;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 image1.Canvas.Pen.Color:=clwhite;

 image1.Canvas.Brush.Style:=bssolid ;

 image1.canvas.Rectangle(0,0,225,305);

 image1.Canvas.Pen.Color:=clblack;

end;

end.

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

Задания:

1. Проверьте все примеры из лабораторной работы.

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

Лабораторная работа 8. Компоненты-меню
и элементы интерфейса

Цель: изучить возможности при создании меню и дополнительных элементов интерфейса.

Практически все сложные программы в настоящее время обладают системным меню, предназначенным для выбора того или иного пути выполнения программы. Системное меню представляет собой либо древовидную структуру, а следовательно, элемент меню может быть либо подменю, либо командой, либо разделительной линией, если имеется несколько групп. Существуют два различных типа меню: MainMenu (главное меню) и PopurMenu (локальное меню), которые находятся на странице Standart. Если главное меню отождествляется с формой, то локальное меню — с тем или иным компонентом управления. У различных компонентов управления могут быть различные локальные меню, следовательно, на форме может находиться только одно главное меню и несколько локальных меню. Для того чтобы связать любой элемент управления с локальным меню, необходимо свойству PopurMenu задать имя нужного локального меню.

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

Обычно главное и локальное меню формируются на стадии проектирования (однако существуют методы, которые позволяют создавать меню и на стадии выполнения программы). Для создания необходимо воспользоваться свойством Items. При активизации этого свойства открывается конструктор меню, позволяющий набирать элементы меню.

У каждого пункта элемента меню имеются свойства: Caption — свойство типа String, содержащее текст элемента меню (для того чтобы получить разделитель, необходимо данному свойству дать значение –), GroupIndex — свойство целого типа, содержит номер группы, к которой относится элемент меню, ShotCut — свойство целого типа, определяющее код клавиши быстрого доступа.

Компоненты меню могут выполнять роль переключателей с зависимой и независимой фиксацией. Логическое свойство RadioItem определяет, может ли пункт меню выполнять функции переключателя, а Checked — является ли элемент меню отмеченным.

Отдельно отметим свойство Name — имя элемента меню. Если его
не задавать самостоятельно, то оно определяется через значение свойства Caption.

Предположим, что в нашем приложении необходимо создать основное меню, состоящее из пунктов File, Edit, Help. Подчиненное меню для пункта File состоит из разделов Open, Save Save As, для пункта меню Edit — из разделов Copy, Cut, Paste. Для пункта Help — единственный пункт
«О программе».

Добавим на форму компонент MainMenu1 и, произведя двойной щелчок левой клавишей мыши, откроем диалоговое окно формирования данного меню. Теперь можно задавать как основные, так и подчиненный пункты, используя свойство Caption. Заданное меню может выглядеть так, как изображено на рисунке 23.

 

Рисунок 23

 

Описание формы после задания данного системного меню будет иметь следующий вид:

type

 TForm1 = class(TForm)

 MainMenu1: TMainMenu;

 File1: TMenuItem;

 Edit1: TMenuItem;

 Help1: TMenuItem;

 Open1: TMenuItem;

 Save1: TMenuItem;

 Saveas1: TMenuItem;

 Copy1: TMenuItem;

 Cut1: TMenuItem;

 Paste1: TMenuItem;

 N1: TMenuItem;

 private

 { Private declarations }

 public

 { Public declarations }

 end;

Как видно из текста, появился единственный компонент основного меню (тип TMainMenu) и несколько компонентов, определяющих подпункты в меню (тип TMenuItem). Имена практически во всех случаях совпали с теми названиями, которые мы определяли самостоятельно, кроме последнего случая, а когда название было задано русскими буквами, появился компонент с именем N 1. Это стандартное правило, имеющееся
в среде Delphi, для обозначения имен компонентов.

При работе с любым меню определено несколько событий. Среди них необходимо отметить OnClick, которое происходит при выборе элемента меню мышью, клавишами управления клавиатурой или клавишей быстрого доступа. Если воспользоваться предложенным выше меню, то в нашем распоряжение будет 10 процедур, каждая из них вызывается при выборе конкретного пункта меню и задается процедурой вида:

procedure TForm1.Open1Click(Sender: TObject);

begin

end;

Данная процедура будет вызвана при выборе пункта меню File, Open.

Методы, доступные во время выполнения программы, связаны в основном с корректировкой структуры и определения связи между элементами и включают в себя методы: Add(Item) — добавить элемент вменю, Delete(Index) — удалить элемент меню с соответствующим индексом.

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

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

К таким компонентам будем относить строку состояния StatusBar, которая при выполнении программы располагается в нижней части формы
и может содержать основную информацию, характерную для данной программы. Рассмотрим также компонент ToolBar — панель инструментов, используемая в основном для создания кнопок быстрого доступа, панель инструментов CoolBar и компоненты работы со временем — Timer и датой — Calendar.

Панель инструментов ToolBar находится на странице Win 32. На ней могут размещаться кнопки быстрого доступа, причем для панели инструментов разработан специальный класс кнопок ToolButton. Однако данный компонент не представлен в компонентах. Для того чтобы вставить на панель инструментов кнопку, необходимо воспользоваться контекстным меню, в котором выбрать пункт New Button или пункт меню New Separator — для расположения на панели инструментов пустого пространства.

У кнопок типа ToolButton следует отметить свойство Style, которое устанавливает внешний вид и функциональные возможности кнопки и может принимать следующие значения: tbsButton — обычная кнопка, tbsCheck — кнопка с фиксацией, которая после нажатия остается в таком положении до следующего нажатия. В данном случае логическое свойство Down принимает значение True, если кнопка нажата, tbsDivider — разделитель, который представляет собой вертикальную линию, разделяющую визуальные кнопки, tbsSeparator — пустое пространство. Свойства ButtonHigth и ButtonWidth устанавливают размеры кнопок. На каждой кнопке может находиться текст (свойство Caption) и картинка (свойство Image). Свойство List устанавливает расположение относительно друг друга текста и изображения.

Данные кнопки обрабатывают все события, однако событие по умолчанию так и остаются OnClck.

Панель инструментов, как правило, располагается на контейнерах — компонентах CoolBar или ControlBar. CoolBar — это панель, снабженная вертикальной полоской в левой части, за которую ее можно перемещать по форме. Основу данного компонента составляет коллекция панелей (свойство Bands). Чтобы «скомплектовать» новую панель, необходимо выбрать данное свойство и в диалоговом окне с помощью клавиш Add
и Delete создать необходимое число элементов. Нумерация элементов панели начинается с 0.

Каждый элемент панели управления имеет несколько свойств, среди которых свойство Control позволяет связать его с одним из оконных элементов управления, после чего элемент перемещается на отведенную панель.

Форма, содержащая системное меню и панель инструментов, представлена на рисунке 24.

Как правило, панель инструментов содержит те же команды, что и меню. Следовательно, имеет смысл один раз описать процедуру, а затем
в событиях, возникающих на других компонентах, вызывать ее. Для этого в инспекторе объектов на закладке Events в нужном событии надо использовать комбинированное меню, в котором уже находятся все имеющиеся процедуры обработки данного события. Например, если уже написана процедура сохранения, которая выполняется после нажатия на кнопку, и та же процедура должна выполняться из системного меню, описав соответствующий пункт меню, имя обрабатываемой процедуры можно выбрать из списка, представленного на рисунке 25.

Рисунок 24

 

Рисунок 25

 

Если все-таки процедуры должны быть одинаковыми, за исключением некоторых аспектов, которые зависят от элементов управления, ставшего источником события, то можно воспользоваться передаваемым параметром Sender или параметром Tag, присутствующим в каждой процедуре.

Оператор is предназначен для проверки совместимости по присвоению экземпляра объекта с экземпляром данного класса.

Пример 1

Пусть имеется кнопка на форме, панель инструментов и главное меню. Должно происходить одно и то же действие, например запись файла из содержимого компонента RichEdit 1: или после нажатия кнопки формы, или одной из кнопок панели инструментов, или при выборе определенного пункта из главного меню. Следовательно, можно описать одну процедуру, а затем вызывать ее при возникновении всех изложенных выше событий. Создадим процедуру обработки нажатия на кнопки Button 1 Click
и укажем эту процедуру во всех остальных событиях.

Тогда для определения объекта вызвавшего событие будем применять оператор is и, кроме сохранения содержимого в файле, будем выдавать сообщение о объекте, на котором произошло событие.

procedure TForm1.Button1Click(Sender: TObject);

begin

 If SaveDialog1.Execute

 Then RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);

 If Sender is TButton

 then ShowMessage('Нажата кнопка');

 If Sender is TToolButton

 then ShowMessage('Нажата кнопка на панели инструментов');

 If Sender is TMenuItem

 then ShowMessage('Выбран пункт из главного меню');

end;

Оператор as предназначен специально для приведения объектных
типов. С его помощью можно рассматривать экземпляр объекта как принадлежащий к другому совместному классу. Более подробно об этом операторе и о понятии класса будет рассмотрено нами позднее в лабораторной работе 11.

Компонент StatusBar находится на странице Win 32 и при добавлении на форму растягивается на всю длину и смещается к нижней части формы, поэтому из свойств расположения у данного компонента доступно только Heigth — высота. На этапе проектирования можно выделить логическое свойство SimplePanel, определяющее, на сколько частей будет разбита строка состояния. Если данное свойство имеет значение True, то панель
не разбивается и доступ можно получить с помощью свойства SimpleText. Если данное свойство имеет значение False, то панель может содержать несколько частей и необходимо воспользоваться свойством Panels, при выборе которого появляется диалоговое окно, изображенное на рисунке 26. Необходимо отметить, что к появлению этого окна приведет и двойной щелчок на компоненте.

Рисунок 26

 

В диалоговом окне при помощи кнопок задается количество разделов строки состояния. Задать некоторый текст можно посредством свойства Text. На рисунке 27 изображена панель редактирования строки состояния StatusBar, на которой определены три раздела, двум из них уже присвоено значение свойства Text.

Рисунок 27

 

Обращаться к каждой части панели можно таким образом StatusBar1.Panels[<номер>]. Среди других свойств каждой панели отметим следующие: Bevel — вид рамки, Width — свойство целого типа, определяющее горизонтальный размер, Style — свойство, определяющее вид информации, размещенной в панели. Последнее из них может принимать значения psText — задается текст, psOwerDraw — содержимое, определяющее обработчиком события OnDrawPanel.

Пример 2

Создать программу, у которой в строке состояния будут выдаваться координаты курсора мыши.

Для решения данной задачи поместим на форму компонент StatusBar, для которого с помощью свойства Panels зададим две части, текст первой будет содержать строку 'X=', а текст второй — строку 'Y='. Затем для объекта Form 1 на закладке Events выберем событие onMouseMove, которое возникает при любом перемещении мыши. В этой процедуре будем обращаться последовательно к каждой панели и, используя свойство Text, формировать необходимую нам строку, которая состоит из двух частей. Первая — это фиксированная строка, вторая — это функция, переводящая значения X и Y — точки, в которой произошло смещение, в строку. Данная процедура может иметь следующий вид:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

begin

 StatusBar1.Panels[0].Text:='X='+IntToStr(x);

 StatusBar1.Panels[1].Text:='Y='+IntToStr(y);

end;

Компонент Timer со страницы System предназначен для формирования интервалов времени. Прежде всего, отметим событие, которое связано
с данным компонентом — это onTime — событие, которое возникает всякий раз по истечению заданного интервала времени.

Основные свойства — это логическое свойство Enabled, определяющее, реагирует ли таймер на собственные события (если значение True — то реагирует), и свойство Interval, определяющее временной интервал, через которое произойдет событие OnTime, в миллисекундах.

Задания:

1. Создайте текстовый редактор с системным меню.

2. Создайте графический редактор с системным меню

3. Создайте приложение, которое содержит такие элементы интерфейса, как системное меню, строка подсказки и таймер для выполнения определенной работы.

Лабораторная работа 9. Отображение
мультимедийной информации

Цель: изучить компоненты, позволяющие обрабатывать звуковую
и видеоинформацию.

В современной компьютерной технике существует немало звуковых
и мультимедиа файлов. Коротко охарактеризуем эти группы файлов в данной работе, чтобы иметь хоть какое-то представление о том, с чем предстоит работать. Так как файлы мультимедиа часто содержат звуковую дорожку, было бы не очень правомерно не упомянуть звук в мультимедиа.

Наиболее простым звуковым файлом является волновой файл .wav.
В нем записано цифровое представление информации о волновой форме электрического сигнала, соответствующего каждому звуку. Волновой файл «не знает» ничего о том, что такое звук и что он означает. Поэтому для хранения звукового клипа приходится запоминать массу информации.

Другими, часто применяемыми типами звуковых файлов являются файлы цифрового интерфейса музыкальных инструментов (MIDI). В них звук хранится в виде данных о том, на каких инструментах исполняются определенные ноты и как долго они звучат. Если вы знакомы с музыкой, то можете рассматривать содержимое такого файла как цифровой эквивалент дирижерской партитуры. Одним из главных преимуществ MIDI является то, что файлы получаются сравнительно небольшими.

Волновые и MIDI-файлы могут хранить только звук или музыку. Для хранения видеоинформации разработан ряд форматов. Отметим среди них файлы AVI и MPEG. Большинство видеофайлов поддерживают также хранение звуковой дорожки, так что звук воспроизводится синхронно
с картинкой.

Имеется несколько процедур для воспроизведения звуков — это процедуры Веер, MessageBeep и PlaySound.

Наиболее простой процедурой, управляющей звуком, является процедура Beep. Она не имеет параметров и воспроизводит стандартный звуковой сигнал, установленный в Windows, если компьютер имеет звуковую карту и стандартный сигнал задан. Если звуковой карты нет или стандартный сигнал не установлен, звук воспроизводится через динамик компьютера просто в виде короткого щелчка.

Откройте новое приложение, введите в него кнопку, в обработчике щелчка которой напишите одно слово:

procedure TForm1.Button1Click(Sender: TObject);

begin

 Beep;

end;

Можете запустить приложение, щелкнуть по кнопке и прослушать стандартный звук Windows или просто щелчок, если стандартный звук
не установлен.

Более серьезной является логическая функция MessageBeep. Она имеет параметр uType, указываюий воспроизводимый звук как идентификатор раздела реестра [sounds], в котором записаны звуки, сопровождающие те или иные события Windows. Значения параметра uType представлены
в таблице 4.

Таблица 4. Значение п араметра fdwSound

MB _ ICONASTERISK SystemAsterisk — звездочка
MB _ ICONEXCLAMATION SystemExclamation — восклицание
MB_ICONHAND SystemHand — критическая ошибка
MB_ICONQUESTION SystemQuestion — вопрос
MB _ OK SystemDefault — стандартный звук

После запроса звука, функция MessageBeep возвращает управление вызвавшей функции и воспроизводит звук асинхронно. Во время воспроизведения приложение может продолжать выполняться.

Если невозможно воспроизвести указанный в функции звук, делается попытка воспроизвести стандартный системный звук, установленный по умолчанию. Если и это невозможно, то воспроизводится стандартный сигнал через динамик. При успешном выполнении возвращается ненулевое значение, что соответствует значению True. При аварийном завершении возвращается нуль или значение False. Поместим на форму одну кнопку и напишем для нее обработчик:

procedure TForm1.Button1Click(Sender: TObject);

begin

 MessageBeep(МВ_ICONHAND);

end;

После нажатия на кнопку будет слышен тот же стандартный звук Windows, что и при критической ошибке, или если стандартный звук
не установлен, услышите тихий щелчок.

Функция PlaySound позволяет воспроизводить не только звуки событий Windows, но и любые волновые файлы. Функция PlaySound определена сл



2020-02-04 268 Обсуждений (0)
Лабораторная работа 7. Графические компоненты 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа 7. Графические компоненты

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (268)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.011 сек.)