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

практика

.pdf
Скачиваний:
18
Добавлен:
13.03.2015
Размер:
665.99 Кб
Скачать

{задаем стиль заливки}

Form1.Canvas.Pen.Color:=clGreen;

{задаем цвет линий}

Form1.Canvas.Pen.Width:=5;

{задаем толщину линий}

Form1.Canvas.Rectangle(0,0,50,100);

{рисуем прямоугольник}

Задача 2: по нажатию кнопки изобразить на форме круг произвольного размера с синим контуром толщиной 2 пикселя и синей заливкой в косую клетку.

Задача 3: по нажатию кнопки изобразить на форме 10 кругов небольшого размера с синим контуром толщиной 2 пикселя и синей заливкой в косую клетку.

Задания для самостоятельного выполнения

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

Цвет линий и заливки определяет пользователь по нажатию кнопок. Каждая фигура рисуется по нажатию отдельной кнопки.

Лабораторная работа 16 Проект «Графический редактор»

Задача: создать простейший графический редактор, позволяющий рисовать фигуры, а также сохранять и открывать файлы типа *.bmp.

31

Рис. 12

Впроекте использованы:

главная форма приложения – объект класса TForm;

поле для рисования – объект класса TImage (вкладка Additional);

радиокнопки – объекты класса TRadioButton (вкладка Standard);

главное меню, фигуры (Shape), надписи, диалоги (см. предыдущие лаб. работы).

Порядок выполнения работы

1.Подготовьте нужные объекты на форме, как показано на рис. 12.

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

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

fig := 1; {выбрано рисование линии} end;

3. Для рисования различных фигур вам потребуется использовать события

OnMouseDown, OnMouseUp для объекта Image1.

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

X, Y: Integer); begin

x1:=x; y1:=y; {запомнили координаты начала рисования} draw:=true; {запомнили, что рисование начато} Image1.Canvas.MoveTo(x,y);

{переместили пишущий узел к началу рисования} end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;

32

X, Y: Integer); begin

with Image1.Canvas do begin case fig of

1 : begin MoveTo(x1,y1); LineTo(x,y); end;

2 : Rectangle(x1,y1,x,y);

3 : Ellipse(x1,y1,x,y); end; {нарисовали выбранную фигуру}

end;

draw := false; {запомнили, что рисование окончено}

end;

Описание всех использованных переменных в блоке var выполните самостоятельно.

4. Для рисования с помощью карандаша вам потребуется использовать со-

бытие OnMouseMove для объекта Image1.

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

begin

if (fig = 4) and draw

{если выбран карандаш и нажата кнопка мыши} then Image1.Canvas.LineTo(x,y);

{соединяем линиями все точки по ходу курсора мыши} end;

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

Задания для самостоятельного выполнения

1.Снабдите Редактор возможностями работы с файлами с помощью меню, аналогично приложению Блокнот.

2.Обеспечьте возможность установки цвета линий и заливки фигур.

3.*Добавьте к вашему Редактору возможность заливать выбранным цветом произвольные фигуры.

Для этого существует метод FloodFill(x,y,color,type). Заливка области производится, начиная от точки (x;y). Параметр type может принимать значение:

fsBorder (заливается область до границы, цвет которой определяется параметром color);

fsSurface (заливается область, цвет которой определяется параметром color до границы другого цвета).

33

Например: заливка красным цветом области от точки (100;50) до границы черного цвета

Image1.Canvas.Brush.Color:=clRed;

Image1.Canvas.FloodFill(100,50,clBlack,fsBorder);

заливка красным цветом белой области от точки (100;50).

Image1.Canvas.Brush.Color:=clRed;

Image1.Canvas.FloodFill(100,50,clWhite,fsSurface);

Лабораторная работа 17

Проект «Ежедневник»

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

Задача разбивается на две части:

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

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

Рассмотрим первую часть проекта.

Рис. 13

Впроекте использованы:

главная форма приложения – объект класса TForm;

календарь – объект класса TMonthCalendar (вкладка Win32, этот класс объектов не описан в лекции, но его смысл и назначение интуитивно понятны; единственное его свойство, которое вам потребуется – Date – содержит выбранную пользователем дату );

34

два скрытых объекта класса TListBox (вкладка Standard);

текстовое окно, кнопка (вкладка Standard).

Порядок выполнения работы

1.Подготовьте нужные объекты на форме, как показано на рис. 13. Для того чтобы скрытые объекты были не видны, установите для их свойства Visible значение false. Однако рекомендуется сделать это после отладки программы, чтобы легче было увидеть возможные ошибки.

2.Объекты ListBox1 и ListBox2 предназначены для хранения списка дат и содержания намеченных мероприятий в хронологическом порядке. Чтобы этот порядок не нарушался при вводе нового элемента, код программы, выполняемой при нажатии кнопки Принять должен выглядеть так:

date1 := MonthCalendar1.Date;

{переменной типа TDateTime присваивается дата, выбранная на календаре}

i:=0;

while date1 > StrToDate(ListBox1.Items[i]) do i:=i+1;

{пропускаем записи, намеченные на более ранние даты} ListBox1.Items.Insert(i,DateToStr(Date1)); {вставляем в нужную позицию новую дату} ListBox2.Items.Insert(i,Edit1.Text);

{вставляем в соответствующую позицию новое мероприятие}

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

3. Вводимая информация в промежутках между сеансами работы должна храниться во внешних файлах. Для этого следует при закрытии приложения (событие OnClose для объекта Form1) выполнить следующий код:

ListBox1.Items.SaveToFile('даты.txt');

ListBox2.Items.SaveToFile('дела.txt');

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

35

Лабораторная работа 18 Проект «Ежедневник» (продолжение)

Перейдем ко второй части проекта.

Кроме главной формы приложения здесь потребуются только три объекта класса TListBox (два скрытых и один видимый).

Порядок выполнения работы

1.Подготовьте нужные объекты.

2.Все необходимые действия должны выполняться сразу при запуске приложения, поэтому весь код программы привязан к событию OnCreate для главной формы приложения (Form1).

ListBox1.Items.LoadFromFile('даты.txt'); ListBox2.Items.LoadFromFile('дела.txt'); {загружаем информацию из файлов}

i := 0;

while i < ListBox1.Items.Count-1 do {просматриваем список дат}

begin

if StrToDate(ListBox1.Items[i]) = date then {если дата совпадает с текущей}

ListBox3.Items.Add(ListBox2.Items[i]); {добавляем мероприятие в видимый список}

i := i + 1; end;

Проверьте правильность работы второй части приложения. Ваш Ежедневник должен показать записи файла «дела.txt», относящиеся к текущей дате (рис. 14).

Рис. 14

36

Задания для самостоятельного выполнения

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

2.Заметим, что ваша разработка имеет существенный недостаток. Если пользователь по каким-либо причинам в один из дней не запустил программу, о намеченных на этот день делах он не получит напоминания уже никогда. Полагая, что «лучше поздно, чем никогда», измените программу так, чтобы каждое напоминание однажды обязательно появлялось на экране, пусть и позднее нужной даты.

Лабораторная работа 19

Динамическое создание объектов

Задача 1. По каждому нажатию кнопки на форме в произвольном месте должна появляться новая фигура (объект класса TShape).

Для решения задачи нам потребуется создавать компоненты динамически в ходе работы программы, а не вручную до ее запуска, как мы делали до сих пор. Каждый класс объектов имеет в своем составе методы конструктор (Create) и деструктор (Destroy) для динамического создания и уничтожения объекта. Рассмотрим на примере, как воспользоваться конструктором.

В блок описания переменных (var) следует добавить описание переменной нужного класса:

plita: Tshape;

Затем опишем действия, происходящие при нажатии кнопки:

plita:=TShape.Create(self); plita.parent:=self; {вызываем метод-конструктор} plita.Left:=random(Form1.Width); plita.Top:=random(Form1.Height);

{придаем вновь созданному объекту случайные координаты}

Отметим, что доступным для изменения остается лишь последний созданный объект.

37

Задача 2. Поместите на форму заданное пользователем количество одинаковых прямоугольных плиток в ряд.

В блоке описания переменных (var) опишем одномерный массив объектов нужного класса:

plit : array[1..100] of TShape;

При нажатии соответствующей кнопки должна выполниться следующая программа:

for i:=1 to spinEdit1.Value do begin plit[i]:=TShape.Create(self); plit[i].parent:=self; plit[i].top:=100; plit[i].Left:=i*plit[i].Width;

end;

Задача 3. Смените цвет у плитки, номер которой задает пользователь.

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

plit[SpinEdit3.Value].Brush.Color:=clBlue;

Задача 4. Удалите нажатием кнопки все созданные предыдущей программой плитки. Для удаления объектов используем деструктор

for i:=1 to spinEdit1.Value do plit[i].Destroy;

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

Задания для самостоятельного выполнения

1.По нажатию кнопки «замостите» плитками прямоугольный участок с размерами, заданными пользователем.

2.Смените цвет у плитки, местоположение которой задает пользователь.

3.Удалите нажатием кнопки все созданные предыдущей программой плитки.

38

Лабораторная работа 20

Создание новых классов

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

Для решения задачи нам потребуется создать новый класс компонентов с нужным поведением на базе класса TShape. Новый класс унаследует все свойства и методы класса-предка и получит ряд новых. Рассмотрим на примере, как это делается.

После описания класса TForm и перед блоком описания переменных вставьте описание нового класса – потомка TShape, указывая, какие методы будут перекрыты.

TFishka = class(TShape) public

constructor Create(AOwner:Tcomponent); override; destructor Destroy; override;

procedure MouseDown(Button: TMouseButton;

Shift: TShiftState; X, Y: Integer); override;

end;

Затем после строк implementation {$R *.dfm}

описываем перекрытые методы:

constructor TFishka.Create(AOwner:Tcomponent); begin

inherited create(AOwner); {вызов конструктора предка} Shape:=stCircle; width:=20; height:=20;

end;

destructor TFishka.Destroy; begin

inherited Destroy; end;

procedure TFishka.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

39

if Brush.Color = clWhite

then Brush.Color := clBlack else Brush.Color := clWhite

end;

Затем в блоке описания переменных объявляем двумерный массив fishka : array[1..20,1..20] of TFishka;

И наконец, пишем программу обработки нажатия кнопки: for i:=1 to SpinEdit1.Value do begin

for j:=1 to SpinEdit2.Value do begin fishka[i,j]:=TFishka.Create(self); fishka[i,j].parent:=self; fishka[i,j].top:=100+j*fishka[i,j].Height; fishka[i,j].Left:=i*fishka[i,j].Width;

end;

end;

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

for i:=1 to a do

for j:=1 to b do

fishka[i,j].Destroy; {удаляем старое поле} a:=SpinEdit1.Value; b:=SpinEdit2.Value;

{запоминаем размеры нового, чтобы потом его удалить}

Задания для самостоятельного выполнения

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

HorizScrollBar.Visible и VertHorizScrollBar через Object Inspector.

2.Измените первоначальный цвет элементов.

3.Добавьте еще один цвет элементов.

Библиографический список

1.Данилина И.И. Технология программирования. – Екатеринбург: УрГУПС, 2008.

2.Дарахвелидзе П.Г., Марков Е.П. Delphi – среда визуального программирования. – СПб.:BHV – Санкт-Петербург, 1996. – 352с.

3.www.bspu.secna.ru

4.www.delphiclub.ru

40