Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

_book4_part2_Deilphi

.pdf
Скачиваний:
15
Добавлен:
29.02.2016
Размер:
297.54 Кб
Скачать

Лабораторная работа 7 Cоздание кнопки

Видео с выполнением лабораторной: https://www.youtube.com/watch?v=iUM1TjJJa0g

1. Откройте Редактор Изображений (выберите в Tools ImageEditor), выполните команду

File|New|BitMap File (.bmp), задайте размер 64X16. Разбейте изображение на 4 квадрата,

разделенных белыми рамками в 1 пиксель и закрасьте их разными цветами.

Сохраните созданный файл, например под именем Кнопка.bmp

2. Создайте простое приложение, чтобы посмотреть Ваши пиктограммы в работе.

Для этого перенестие на форму три разные кнопки: Button из Standart, BitBtn и SpeedButton из Additional. (Можете поменять для каждой из кнопок свойство Caption.)

3.В свойстве Gliph кнопок BitBtn и SpeedButton загрузите Вами созданный файл пиктограмм (Кнопка.bmp). Заметьте, что в свойствах NumGliphs значение установится равным 4.

4.Попробуйте в свойствах Margin и Spacing поустанавливать разные значения.

5.Для кнопки SpeedButton установите свойство GroupIndex равным 1, а свойство AllowAllUp

равным true.

6.В обработчик щелчка OnClick кнопки Button вставьте код:

SpeedButton1.Enabled:=not SpeedButton1.Enabled;

BitBtn1.Enabled:=not BitBtn1.Enabled;

7. Запустите приложени, нажав на зеленый флажок (или Run F9). И посмотрите, как оно работает.

Лабораторная работа 8 ToolBars и CoolBars

Видео с выполнением лабораторной: https://www.youtube.com/watch?v=OepBLpLqj8s

1.Создайте новое приложение.

2.Переместите на форму компонент ControlBar (из Aditional) размером примерно 400х400. В ней может применяться техника перетаскивания и встраивания Drag&Doc (помните

лабораторную “детские кубики”?)

3.Впишите в него 8 одинаковых компонент ToolBar (из Win32) размером примерно 120х120.

Каждый компонент, попадая на ControlBar, получает полосу захвата, свойственную технологии

Drag&Doc. Можете разукрасить компоненты в разные цвета.

4.Установите у компонентов, размещенных на ControlBar, свойство DragMode=dmAutomatic

и DragKind=dkDoc. Как изменится после этого поведение этих компонентов при работе

приложения?

5.Поизменяйте значения свойств RowSize и RowSnap. На что они влияют?

6.Попереключайте значение свойства AutoDrag.

Подсказка. Это свойство определяет, можно ли (при значении true), или нельзя простым

перетаскиванием вынести полосу за пределы ControlBar.

7.Выберите одну из компонент ToolBar (выделите ее с помощью указателя мыши). Затем,

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

перенеситена эту компоненту кнопку Button1 из стандартной палитры компонентов (так как Вы это неоднократно делали). Чем отличаются в работе эти кнопки?

8.Что можно добавить действием, аналогичным описанным в предыдущем пункте, на компо-

нент CoolBar?

Можете ли Вы теперь запрограммировать детскую игру логическую игру “пятнашки”?

Лабораторная работа 9 Построение графиков функций

Графичесие компоненты Image, PaintBox,... имеют свойство Canvas(канва, холст) — область

компонента, на которой можно рисовать или отображать готовые изображения. Графики функцийможнорисоватьразнымиспособами.Одинизвариантов—поточкам(пикселям).Для

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

который отвечает за цвета канвы. Так, элементу этого массива Canvas.Pixels[10,30] (10-я точка слева, 30-я сверху) можно задать цвет:

clBlack, clAqua, clBlue, clFuchsia, clGreen, clLime, clMaroon, clRed, clYellow, clWhite,...

Так, оператор Canvas.Pixels[10,30]:=clBlack; или Canvas.Pixels[10,30]:=0; (“ноль”-степень яркости).

Другим способом рисовать можно используя перо Pen. Перемещение пера производится

при помощи метода канвы MoveTo(X0,Y0). Здесь X0,Y0 — координаты точки, в которую

переносится перо. Эта текущая точка становится началом линии, которая прорисовыавется с помощью метода LineTo(X1,Y1) и заканчивается точкой с координатами X1,Y1.

Нарисуем два графика функции y=sin(x): один по точкам, другой с помощью линии. Для этого:

1.Cоздадим новое приложение.

2.Перенесем на форму два компонента Image и кнопку Button, при нажатии на которую будут прорисовываться графики в экземплярах объекта TImage: Image1 и Image2.

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

координат:

var

X,Y: real; PX,PY: longint;

4. В обработчик щелчка кнопки вставим код:

procedure TForm1.Button1Click(Sender: TObject); begin

Image2.Canvas.MoveTo(0,Image2.Height div 2);//для 2-го рисунка for PX:=0 to Image1.Width do

begin

X:=PX*4*Pi/Image1.Width;

Y:=Sin(X); PY:=trunc(Image1.Height-(Y+1)*Image1.Height/2); Image1.Canvas.Pixels[PX,PY]:=0;

//clBlack — черный цвет или яркость=0;

Image2.Canvas.LineTo(PX,PY); //для 2-го рисунка end; end;

Pi — это число пи, поскольку синус — функция периодическая (то есть рисунок повторяется

через определенное количество шагов вдоль оси координат Ox, а именно через 4 пи — 2

периода в радианах). Значение y фукции sin(x) изменяется от -1 до 1 вдоль оси координат OY.

На рисунке мы изображаем линию графика от нижнего края картинки до верхнего (это вдоль

OY) и от левого края до правого (это вдоль оси Ox). Причем ширина линии на первом рисунке может оличаться от ширины линии на правом рисунке. Почему?

Каксделатьтак,чтобыинавторомрисункелинияпрорисовываласьотлевогокраядоправого,

а не заканчивалась раньше, если ширина второго рисунка больше, чем первого?

Итоговый файл лабораторный должен выглядеть примерно так:

unit Unit1; interface uses

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

type

TForm1 = class(TForm) Image1: TImage; Image2: TImage; Button1: TButton;

procedure Button1Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; Image1,Image2:TImage; X,Y: real;

PX,PY: longint; implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); begin

//Image2.Canvas.MoveTo(0,Image2.Height div 2);//для 2-го рисунка for PX:=0 to Image1.Width do

begin

X:=PX*4*Pi/Image1.Width;

Y:=Sin(X); PY:=trunc(Image1.Height-(Y+1)*Image1.Height/2); Image1.Canvas.Pixels[PX,PY]:=0;

end;

Image2.Canvas.MoveTo(0,Image2.Height div 2);//для 2-го рисунка for PX:=0 to Image2.Width do

begin

X:=PX*4*Pi/Image2.Width;

Y:=Sin(X); PY:=trunc(Image2.Height-(Y+1)*Image2.Height/2); Image2.Canvas.LineTo(PX,PY); //dlia 2-go risunka

end;

end;

end.

Можно немного переделать программу, и на втором рисунке появится «3-D» изображение:

unit Unit1; interface uses

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

type

TForm1 = class(TForm) Image1: TImage; Image2: TImage; Button1: TButton;

procedure Button1Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; X,Y: real; PX,PY: longint; implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); begin

for PX:=0 to Image1.Width do begin X:=PX*4*Pi/Image1.Width; Y:=Sin(X);

PY:=trunc(Image1.Height-(Y+1)*Image1.Height/2); Image1.Canvas.Pixels[PX,PY]:=0; Image2.Canvas.MoveTo(0,Image2.Height div 2);//для 2-го рисунка Image2.Canvas.LineTo(PX,PY);

end;

end;

end.

Лабораторная работа 10 Используем перо для рисования фигур

1.Создайте новое приложение, перенесите на форму два объекта Image1 и Image2, а также

две кнопки Button.

2.В обработчик первой кнопки в процедуру TForm1.Button1Click() вставьте следующий код:

with Image1.Canvas do begin Font.Style:=[fsBold]; Arc(10,10,90,90,90,50,10,50); TextOut(40,60,’Arc’); Chord(110,10,190,90,190,50,110,50); TextOut(135,60,’Chord’);

Ellipse(210,10,290,50);

TextOut(230,60,’Elipse’);

Pie(310,10,390,90,390,30,310,30);

TextOut(360,60,’Pie’);

PolyGon([Point(30,150),Point(40,130),Point(50,140),Point(60,130),Poi

nt(70,150)]);

TextOut(30,170,’PolyGon’);

PolyLine([Point(130,150),Point(140,130),Point(150,140),Point(160,130),Po

int(170,150)]);

TextOut(130,170,’PolyLine’);

Rectangle(230,120,280,160);

TextOut(230,170,’Rectangle’);

RoundRect(330,120,380,160,20,20);

TextOut(325,170,’RoundRect’);

end;

Запустите приложение, нажмите кнопку Button1.

3. Используя канву второго рисунка Image2 и фигуры, полученные в предыдущем пункте,

создайте приложение, которое бы при нажатии на вторую кнопку на втором рисунке рисовало

бы “пейзаж”: домик, дорогу, человечка, дерево, машину...

Лабораторная работа 11 Рисуем кистью: нестандартное заполнение заданным шаблоном

У канвы есть свойство Brush (кисть). Это свойство определяет фон и заполнение замкнутых фигур на канве.

В этом примере создается объект Bitmap типа TBitmap и в него закружается битовая матрица

из файла с именем MyBitmap.bmp

1.Нарисуйте bmp-рисунок размером 8x8, сохраните его под именем MyBitmap.bmp.

2.Создайте новое приложение, поместите на форму объекты Image и Button.

3.В описание переменных var добавьте Bitmap:TBitmap;

4.Сохраните проект в отдельной папке, переместите туда файл, созданный в п.1.

5.В обработчик кнопки вставьте код:

Bitmap:=TBitmap.Create; try

Bitmap.LoadFromFile(‘MyBitmap.bmp’);

Image1.Canvas.Brush.Bitmap:=Bitmap;

With Image1.Canvas do FillRect(Rect(0,0, Width,Height)); finally

Image1.Canvas.Brush.Bitmap:=nil;

Bitmap.FreeImage;

end;

Свойство кисти Color определяет цвет заполнения.

6.Поместите на форму еще два объекта Image2 и Button2.

7.В обработчик щелчка второй кнопки вставьте код:

Bitmap:=TBitmap.Create;

try

Image2.Canvas.Brush.Color:=clGreen;

Image2.Canvas.Brush.Style:=bsCross; With Image2.Canvas do FillRect(Rect(0,0, Width,Height)); finally

Image2.Canvas.Brush.Bitmap:=nil;

Bitmap.FreeImage;

end;

8. Попробуйте менять свойство Color на

clBlack, clAqua, clBlue, clFuchsia, clGreen, clLime, clMaroon, clRed, clYellow, clWite;

а свойство Style на

bsSolid, bsClear, bsBDiagonal, bsFDiagonal, bsDiagCross, bsHorizontal, bsVertical.

Лабораторная работа 12 Хранилище документов

С технологией Drag&Doc мы познакомились, выполняя лабораторные работы с

перетаскиванием “кубиков” и “пятнашек”. В этой работе мы постараемся создать что-либо

“более полезное”, чем игра панелями и частями изображения — многооконный редактор текстов, имеющий хранилище, в которое можно помещать документы на хранение и затем

извлекать из него нужные документы.

1.Создайте новое приложение, назовите форму Fmain (прописывается в свойстве Name)

2.Разместите на форме компонент MainMenu и задайте в нем всего один пункт — “Новый”

(свойство Caption) — с помощью него мы будем создавать новые документы.

3.Перенесите на форму панель “Хранилище документов” (указывается в свойстве Caption), задав свойство Align=alTop.

4.Поместите на форму компонент PageControl (из Win32) и задайте Align=alClient, чтобы он занимал всю площадь окна, кроме полосы,занятой панелью Хранилище документов. Задайте

в нем свойство DockSite равным true. Этот компонент будет служить приемником документов.

5.Добавьте в проект еще одну форму (File\New Form), назовите ее FDoc (прописывается в свойстве Name). Установите свойство DragKind=dkDoc, DragMode=dmAutomatic. Эта форма будет служить клиентом компонента TPageControl на форме Fmain.

6.Поместите на форму FDoc компонент Memo (ИЗ Standart), задайте в нем Align=alClient,

чтобы он занял всю форму и сотрите на нем текст Memo1 (свойство Lines, двойной щелчок

по троеточию). Свойство “Visible” установите в значении “True”.

7.Выполните команду Project\Options и перенестите форму FDoc из окна Auto-create forms

в окно Avaliable forms, поскольку она должна создаваться не автоматически, а при выборе

пользователем раздела меню “Новый” (кликнув знак “>” между окнами и “ОК”)

8.Сохраните проект, назвав модуль первой формой Umain, а второй — UDoc.

9.В разделе Implementation модуля Umain опишите операторы:

uses UDoc;

var LDoc:TList;//список, в котором будут храниться указатели на создаваемые пользователем формы документов.

10. В обработчик события OnCreate формы Fmain запишите оператор

LDoc:=TList.Create;// создается список TList

11. В обработчик события OnDestroy формы Fmain запишите оператор

LDoc.Free;// освобождается память при закрытии приложения

12. В обработчик щелчка меню “Новый” вставьте код:

procedure TFmain.N1Click(Sender: TObject); var New:TFDoc;

begin New:=TFDoc.Create(FMain); LDoc.Add(New);

New.Caption:=’Документ’+IntToStr(LDoc.Count); end;

Отладьте проект. С каждым новым выбором пункта меню “новый” будут создаваться

новые документы, в которые можно заносить информацию, и складывать из в “Хранилище

документов” перетаскиванием мышью.

Лабораторная работа 13 Компонент Shape

1.Создайте новое приложение

2.Перенесите на него компоненты Image, Button и Shape (форма)

3.Вобработчик щелчка кнопки вставьте код:

with Image1.Canvas do begin Pen.Color:=clAqua; MoveTo(0,0); Pen.Width:=30;

Shape1.Brush.Style:=bsCross; Shape1.Brush.Color:=clWhite; //clGreen,...

Shape1.Shape:=stCircle;//stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse

Shape1.Brush.Style:=bsCross;

LineTo(100,100);

4.Поменяйте Shape: stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse

5.Поменяйтецвет (Color): clBlack, clAqua, clBlue, clFuchsia, clGreen,clLime, clMaroon, clRed,clYellow.

6.ПоменяйтеBrush.Style: bsSolid, bsClear, bsBDiagonal, bsFDiagonal, bsDiagCross, bsHorizontal, bsVertical.

Лабраторная работа 14 Создаем мультфильм

Создадим изображение человечка, шагающего и бьющего в литавры. Для этого

1.Перенесите на форму компоненты Image и таймер Timer (из System), а также кнопку Button.

2.Таймер будет задавать темп смены кадров. В нашем приложении будет всего два кадра,

поэтому установите значение cвойства Interval=500 (миллисекунд = 0,5 сек.), а значение свойства Enabled = false: таймер у нас будет управляться кнопкой.

3.В тексте программы после implementation опишите следующие переменные:

const

num:word=0;

H=20;

//шаг

Xpos:word=2*H;

//координаты туловища

Ypos=120;

//дорожка

Hmen=30;

//высота туловища

Rhead=10;

//радиус головы

Rhead2=Rhead div 2;

//радиус литавров

revers: integer=1;

//направление двищения

L=trunc(H*1.41);

//длина ноги

4. Выделите саму форму и щелкните мышкой напротив события (Events) OnCreate.

в тело процедуры вставьте код:

procedure TForm1.FormCreate(Sender: TObject); begin

with Image1.Canvas do begin MoveTo(0,Ypos+3); Pen.Width:=4; LineTo(ClientWidth,Ypos+3); Pen.Width:=1; Pen.Mode:=pmNotXor;

end;

Draw1;

end;

В этой процедуре будет рисоваться линия, изображающая “землю”, по которой будет ходить

человечек. Затем устанавливается режим пера pmNotXor. Этот режим означает, что если нарисоватьнафонекакую-тофигуру,азатемнарисоватьэтуфигуруповторно,тонарисованная фигура исчезнет и каждый пиксел вернется к своему первоночальному цвету.

Draw1;

Вызывет процедуру, которая рисует исходное положение человечка (описание см в пункте).

5.В обработчик щелчка кнопки вставьте код:

procedure TForm1.Button1Click(Sender: TObject); begin

Timer1.Enabled:=not Timer1.Enabled; end;

который активизирует таймер (значение свойства Enabled изменится с false на true.

6. Вставьте код в обработчик события OnTimer таймера:

procedure TForm1.Timer1Timer(Sender: TObject); begin

Draw1;

if (Xpos>=Image1.Width-H)or(Xpos<=H)then revers:=-revers; Xpos:=Xpos+revers*H;

num:=1-num; Draw1;

end;

События OnTimer наступают в нашем приложении с периодичностью, заданной свойством

Interval (cм. пункт 2).

При возникновении очередного события надо стереть прежний кадр и нарисовать новый.

Сначала вызывается процедура Draw1; (описание см. пункт 7).

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

человечек будет рисоваться по тому же самому месту, по которому рисовался предыдущий кадр. Следовательно,предыдущий рисунок сотрется (см. конец пункта 4)

Затем анализируется позиция человечка Xpos. Если эта позиция отстоит от какого-либо конца

холста Image1 на величину, меньшую шага H, то изменяется на обратный знак переменной revers, характеризующей направление движение (revers=1 — человек шагает вправо, re- vers=-1 — человек шагает влево).

Затем позиция Xpos изменяется на величину revers*H, то есть на шаг вправо или влево.

Изменяется переменная num, которая указывает номер высвечиваемого кадра: 0 или 1. После этого вызывается процедура Draw1, которая рисует указанный кадр в указанной

позиции.

7. Вот процедура Draw1;

Procedure Draw1;

var Yhead:word; //координаты низа головы (подбородка) begin

with Form1.Image1.Canvas do begin

Brush.Color:=clGreen;//цвет (зеленый) case num of

0: begin Yhead:=Ypos-H-Hmen; MoveTo(Xpos-H,Ypos);

LineTo(Xpos,Ypos-H); //нога LineTo(Xpos+H,Ypos); //другая нога MoveTo(Xpos,Ypos-H); LineTo(Xpos,Yhead); //туловище MoveTo(Xpos+revers*H,Yhead-H); LineTo(Xpos,Yhead+4); //рука

Ellipse(Xpos+revers*H-Rhead2,Yhead-H-Rhead2, Xpos+revers*H+Rhead2,Yhead-H+Rhead2); LineTo(Xpos+revers*H,Yhead+H); //другая рука Ellipse(Xpos+revers*H-Rhead2,Yhead+H-Rhead2, Xpos+revers*H+Rhead2,Yhead+H+Rhead2);

Ellipse(Xpos-Rhead,Yhead, Xpos+Rhead,Yhead-2*Rhead);

Rectangle(Xpos-Rhead,Yhead-2*Rhead-1, Xpos+Rhead,Yhead-2*Rhead-4); //шляпа

end; 1: begin

Yhead:=Ypos-L-Hmen;

MoveTo(Xpos,Ypos);

LineTo(Xpos,Yhead);

MoveTo(Xpos,Yhead+4);

LineTo(Xpos+revers*L,Yhead+4); Ellipse(Xpos+revers*L-Rhead2,Yhead+H-Rhead2, Xpos+revers*L+Rhead2,Yhead+4+Rhead2); Ellipse(Xpos-Rhead2,Yhead,Xpos+Rhead,Yhead-2*Rhead);

Rectangle(Xpos-H div 2,Yhead-2*Rhead-1,

Xpos+H div 2,Yhead-2*Rhead-4); end; end; end;end;

8. Попробуйте изменить что-либо в изображении человечка: сделать, например, ему шляпу-

цилиндр или (и) подрисовать штаны.

Лабораторная работа 15 Воспроизведение avi-видео (без звука)

1.Создаем новое приложение.

2.Переносим на форму компонент AnimateизWin32

3.Добавляем три кнопки и OpenDialogиз Dialogs.

4.Объявляем переменную vari: word;

5.В обработчики щелчка кнопок записываем код:

1)Button1:

Animate1.Visible:=true;

i:=1;

Animate1.CommonAVI:=aviFindFolder;

Animate1.Active:=true;

2)Button2:

Animate1.Stop;

3)Button3:

if OpenDialog1.Execute then with Animate1 do begin i:=9;

FileName:=OpenDialog1.FileName;

Visible:=true;

Active:=true;

6. В обработчик(event) OnStop компонента Animate1 вставляем код:

Inc(i);

with Animate1 do begin casei of

2:CommonAvi:=aviFindFile;

3:CommonAvi:=aviFindComputer;

4:CommonAvi:=aviCopyFiles;

5:CommonAvi:=aviCopyFile;

6:CommonAvi:=aviRecycleFile;

7:CommonAvi:=aviEmptyRecycle;

8:CommonAvi:=aviDeleteFile;

end;

ifi<9 then Active:=true elseVisible:=false; end;

7. Проверяем, чтобы следующие свойства (Properties) компонента Animate1были:

Visible=false,

Repetitions=0,

Active=false,

Желательно: Autosize=false, Center=true.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]