Delphi и Lazarus: быстрый старт. Т.В. Гурьянова

Borland Delphi и FreePascal project Lazarus:  быстрый старт

Т. В. Гурьянова

Книга доступна по ссылкам: https://vk.com/doc-86363774_371000814 и https://drive.google.com/folderview?id=0B4icNOfw8DwUU0tfMFZIak13Vmc&usp=sharing

Предисловие

Эта брошюра — краткое введение к обширной литературе по Delphi, FreePascal project Lazarus и объектно-ориентированному программированию. В нее вошли теория и задания 30-часового курса по основам Delphi и FreePascal project Lazarus, который читался Т.В. Гурьяновой школьникам 6-8 классов «Юни-центра XXI» ФПМИ БГУ в 2013/2014 учебном году.

Брошюра может быть использована преподавателями на факультативных занятиях по информатике, а также учащимися, умеющими писать простые программы на языке высокого уровня (например, Паскаль). Если вы не написали в своей жизни ни одной программы, но сильно хотите начать изучение С++, попробуйте тогда несколько дней поразобраться со средой scratch (визуальная объектно-ориентированная среда программирования для обучения школьников). Написать там несколько своих программок и изучить написанные другими. Инсталлятор можно скачать здесь:http://info.scratch.mit.edu/ru/Scratch_1.4_Download. Вводный урок можно посмотреть тут: https://www.youtube.com/watch?v=lqwuxs1lHhQ

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

Введение

Читателю предлагается по пунктам выполнять лабораторные работы.

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

Установите на компьютере Delphi или Lazarus. По пунктом выполняйте задания лабораторных работ (Возможно, вам придется заменять кавычки с полиграфических «“» на обычные «’»). Пример выполнения первой лабораторной работы можно посмотреть тут:

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

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

1. Перетащите на Form1 с палитры стандартных (Standart) компонентов:

— Label1 (метка)

— Button1 (кнопка)

2. Выделите Button1, кликнув кнопкой мышки на самой форме.

3. Откройте вкладку Events (События) Object Inspector (Инстпектора Объектов:

— выделите поле OnClik

— кликните дважды по образовавшейся справа пустой ячейке  — откроется окно с кодом.

4. В окне кода, в месте, где окажется курсор,наберите:

Label1.Caption:=’Это мое первое приложение на Lazarus’;

5. Сохраните проект.

6. Откомпелируйте его (В меню Run можно выбрать режим быстрой компиляции  — Quick Compile), исправьте ошибки и еще раз сохраните.

7. Запустите приложени, нажав на зеленый флажок (или Run F9). И посмотрите, как оно работает. Если все выполнено правильно, появится Form1 в немного измененном виде (Без маленьких точечек Grid-сетки).

8. Кликните кнопкой мышки по кнопке на форме  — у Вас в поле Label1 изменится надпись: “Это мое первое приложение на Lazarus” (‘This is my first application in Delphi’).

Исходники лабораторной можно найти здесь:

https://drive.google.com/folderview?id=0B1Nl3PHlshctV2VBbEdJQmYwLTQ&usp=sharing

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

Заготовка к программе «Калькулятор»

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

1. Измените название формы с Form1 на, например, “Калькулятор”. Для этого:

— выделите форму (кликните кнопкой мышки на самой форме)

— напротив свойства Caption замените значение, заданное по умолчанию (Form1) на “Калькулятор”

2.Перетащите на Form1 с палитры стандартных (Standart) компонентов:

— два окна редактирования Edit1 и Edit2

— Panel1 (панел)

— Button1 (кнопка)

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

“TEdit…”, “TButton…”, “TPanel…”

3. Тот же, что в предыдущей лабораторной.

4. В окне кода, в месте, где окажется курсор,наберите:

Panel1.Caption:=Edit1.Text+’+’+Edit2.Text+’ = ‘

+FloatToStr(StrToFloat(Edit1.Text)+StrToFloat(Edit.Text));

5.6.7. Те же, что в предыдущей лабораторной.

8. Введите в поля редактирования Edit1 и Edit2 числа (можно десятичные).

Назовите Button: введите в поле свойства (Propaties) name знак сложения (”+”). Кликните по кнопке.

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

9. Рассмотрите какую-нибудь программу-калькулятор (например, из вкладки “Accesories” Start-up-меню Windows ).

10. Усовершенствуйте калькулятор: добавьте кнопки для каждого арифметического действия (+,-,/,sin,…).

В качестве примера можете рассмотреть калькулятор, который сделал Сергей Анищенко в 14 лет:

https://drive.google.com/folderview?id=0B4icNOfw8DwUcmNFSzlpajlBbGM&usp=sharing

10*. Напишите программу-калькулятор, умножающую и делящую числа “столбиком”

и сконвертируйте на свой мобильный телефон.

Вот код примерный код на паскале для умножения чисел “столбиком”:

program Example_multiply;

uses crt;

var

a,b,c,d,e,f,g,h,i,j,k :longint;

a1,b1,c1 :string;

begin

clrscr;

readln(a,b);

clrscr;

str(a,a1);str(b,b1);

c:=length(a1);

d:=length(b1);

TextColor(15);

gotoxy(44-c,5);

writeln(a);

gotoxy(44-d,6);

writeln(b);

gotoxy(35,5);

TextColor(14);

writeln(‘x’);

gotoxy(34,7);

writeln(‘————-‘);

gotoxy(44-c,8);

g:=8;

textcolor(10);

for h:=d downto 1 do

begin

k:=0;

for i:=c downto 1 do

begin

gotoxy(48+i-g,g);

f:= (Ord(a1[i])-48)* (Ord(b1[h])-48);

e:=f+k;

if i<>1 then

begin

if e>9 then

begin

write(e mod 10);

k:=(e div 10);

end;

if e<10 then write(e);

end;

end;

if i=1 then

begin

if e<10 then write(e) else

begin

gotoxy(47-g+i,g);

write(e);

end;

end;

g:=g+1;

end;

for i:=30 to 50-c do

begin

gotoxy(i,g+1);

textcolor(14);

writeln(‘Ґ’);

end;

textcolor(13);

str(a*b,c1);

gotoxy(44-length(c1),g+2);

writeln(c1);

gotoxy(80,25);

end.

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

Работаем с фреймами

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

Попробуем построить фрейм, который фигурирует в стандартных диалогах

Windows: пользователь может написать имя файла или нажать кнопку «Обзор», которая позволяет выбрать файл в стандартном диалоге открытия файла.

1. Начните новое приложение и выполните команду File/New Frame.

2. Перенесите на фрейм групповую панель GroupBox стандартных компонентов.

3. Перенесите внутрь GroupBox окно редактирования Edit, кнопку Button, диалог OpenDialog из копмонентов-диалогов (Dialogs), а также компонент ApplicarionEvents  — перехватчик событий приложения из Additional

4. Задайте в свройстве Filter диалога OpenDialog фильтр файлов, например, «все файлы»  — *.*. Свойство ShowHint (показать ярлычок подсказки) в компонентах Edit и Button установите в true. В кнопке Button кроме того можете написать текст подстказки Hint, например, «Выбор файла/Выбор файла из

каталога».

5. В обработчик события OnShowHint компонента ApplicationEvents занесите оператор

if HintInfo.HintControl=Edit1

then begin

HintStr:=Edit1.Text;

ApplicationEvents1.CancelDispatch;

end;

Этот оператор в момент, когда должен отображаться ярлычок, проверяет, не является ли источником события HintInfo.HintControl окно редактирования Edit1.

6. Введите в модуль фрейма глобальную переменную FileName типа string (строка), в которой будет отображаться выбранный файл.

var FileName:string;

(вставить перед implementation в unit2)

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

if OpenDialog.Execute

then begin

Edit1.Text:=OpenDialog1.FileName;

FileName:=OpenDialog1.FileName;

end;

8. В обработчик события OnExit компонента Edit1 поместите оператор:

FileName:=Edit1.Text;

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

(или два) описанного вами фрейма. Для этого перетяните значок Frames из стандартной палитры компонентов (Standard) и выберите в ниспадающем меню название вновьсозданного (пп. 1-8 фрейма)  — по умолчанию Frame1.

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

Создаем текстовый редактор. Работаем с палитрой компонентов ActiveX

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

1. Запустите программу Delphi, например, через кнопку «Пуск» (в левом нижнем углу).

2. В меню File выберите New Items (новые элементы), откройте вкладку Projects (проекты) и выберите пиктограмму «Win95/98 Logo Application».

3. Сохраните проект.

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

5. Создайте новое приложение. На новую форму перенесите компонент F1Book из палитры компонентов страницы ActiveX. Можете также расположить рядом компонент Chartfx (и Graph в Lazarus) .

6. Откомпилируйте проект и запустите на выполнение.

7. Попробуйте поменять некоторые свойства этих компонентов и посмотреть, как эти изменения отразятся при перезапуске.

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

Проект

Викторина «Мир животных»

1. Скачайте программы *.pas:

https://drive.google.com/folderview?id=0B1Nl3PHlshctZ3pPc1VYdk5tSk0&usp=sharing

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

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

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

4. Попробуйте переделать часть кода под Ваши требования (мин. 10 вопросов).

и оформить свой проект, используя возможности Delphi (Lazarus).

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

6*. Добавьте в свой проект (перепешите его) зрелищный интерфейс (анимация, видео, звук,… Можно, например, сделать на основании вопросов-ответов обучающий ролик с использованием среды Scratch.

Инсталятор можно скачать здесь:

http://info.scratch.mit.edu/ru/Scratch_1.4_Download

Вводный урок можно посмотреть тут:

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

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

Вставка картинок

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

1. Создайте новое приложение,и перетяните на Form1 компоненты:

— OpenPictureDialog из Dialogs;

— MainManue из Standard;

— Image из Additional;

2. В меню создайте единственный раздел Файл (Картинка),

в обработчик щелчка этого раздела вставьте всего один оператор:

if OpenPictureDialog1.Execute then

Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName);

3. Запустите приложение и попробуйте открыть с помощью меню несколько картинок.

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

4. Установите в компоненте Image1 свойство AutoSize равным true, а оператор пункта 2 допишите:

if OpenPictureDialog1.Execute then begin

Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName);

Form1.ClientHeight:=Image1.Height+10;

Image1.Top:=Form1.ClientRect.Top+(Form1.ClientHeight-Image1.Height)div 2;

Form1.ClientWidth:=Image1.Width+10;

Image1.Left:=Form1.ClientRect.Left+(Form1.ClientWidth-Image1.Width)div 2;

end;

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

Перемещение отдельных компонентов

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

Рассмотрим это на примере перемещения частей картинки по площади формы в среде разработки Delphi.

Для этого:

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

2. В описании переменных добавьте картинку Pict: Pict:TImage; (Добавляем в var после автоматечески созданного Form1: TForm1;)

3. На форму перенесите 4 компонента Image, в которые будут загружаться 4 части этого изображения Pict (Image1,Image2,Image3,Image4).

4. В коде при создании формы OnCreate вставьте следующий код:

Pict:=TImage.Create(Self);

Pict.AutoSize:=true;

Pict.Picture.LoadFromFile(‘C:\Temp\contrstrike.bmp’);

image1.Canvas.CopyRect(image1.ClientRect,Pict.Canvas,Rect(0,0,Pict.Width div 2,Pict.Height div 2));

image2.Canvas.CopyRect(image2.ClientRect,PIct.Canvas,Rect(Pict.Width div 2,0,Pict.Width,Pict.Height div 2));

image3.Canvas.CopyRect(image3.ClientRect,PIct.Canvas,Rect(0,Pict.Height div 2,Pict.Width div 2,Pict.Height));

image4.Canvas.CopyRect(image4.ClientRect,Pict.Canvas,Rect(Pict.Width div 2,Pict.Height div 2,Pict.Width,Pict.Height));

Pict.Free;

Это позволит правильно разбить загружаемое изображение Pict на 4 одинаковые части.

5. Убедитесь, что в C:\Temp есть файл contrstrike.bmp

Либо укажите путь к какой-нибудь картинке (Выберите, например, одну из

заставок Windows и перенесите в C:\Temp\), либо измените путь в строке

Pict.Picture.LoadFromFile(‘C:\Temp\contrstrike.bmp’);

6. После implementation добавте переменные XO,YO, в которых будут записываться коордиатЫ, а также перенную move (“перемещение”, “переместить”), которая может принимать одно из двух значений: либо true (“правда”, “да”), либо false (“ложь”, “нет”)

var move:boolean;

XO,YO:integer;

7. Для каждого из компонентов Image (Image1,…) вставьте соответствующий код в обработчик событий OnMouseMove, OnMouseDown,OnMouseUp.

Так, выбрав на форме компонент Image1, откройте закладку в инспекторе объектов OnMouseDown OnMouseMove, справа двойной щелчек перенесет курсор в соответствующее место программы, где нужно будет дописать:

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

Shift: TShiftState; X, Y: Integer);

begin

if button <> mbLeft then exit;

XO:=X;

YO:=Y;

move:=true;

(sender as Tcontrol).BringToFront;

end;

В код для OnMouseMove допишите:

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

Y: Integer);

begin

if move then with (sender as Tcontrol) do

SetBounds(Left + X — XO,Top + Y — YO, Width,Height)

end;

В код для OnMouseUp допишите:

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

Shift: TShiftState; X, Y: Integer);

begin

move:=false;

end;

На этом этапе код у Вас должен быть примерно такой:

unit Unit1;

interface

uses

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

Dialogs, ExtCtrls;

type

TForm1 = class(TForm)

Image1: TImage;

Image2: TImage;

Image3: TImage;

Image4: TImage;

procedure FormCreate(Sender: TObject);

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

Pict:TImage;

implementation

var move:boolean;

XO,YO:integer;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

Pict:=TImage.Create(Self);

Pict.AutoSize:=true;

Pict.Picture.LoadFromFile(‘C:\Temp\contrstrike.bmp’);

image1.Canvas.CopyRect(image1.ClientRect,Pict.Canvas,Rect(0,0,Pict.Width div 2,Pict.Height div 2));

image2.Canvas.CopyRect(image2.ClientRect,PIct.Canvas,Rect(Pict.Width div 2,0,Pict.Width,Pict.Height div 2));

image3.Canvas.CopyRect(image3.ClientRect,PIct.Canvas,Rect(0,Pict.Height div 2,Pict.Width div 2,Pict.Height div 2));

image4.Canvas.CopyRect(image4.ClientRect,Pict.Canvas,Rect(Pict.Width div 2,Pict.Height div 2,Pict.Width,Pict.Height));

Pict.Free;

end;

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

Shift: TShiftState; X, Y: Integer);

begin

if button <> mbLeft then exit;

XO:=X;

YO:=Y;

move:=true;

(sender as Tcontrol).BringToFront;

end;

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

Y: Integer);

begin

if move then with (sender as Tcontrol) do

SetBounds(Left + X — XO,Top + Y — YO, Width,Height)

end;

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

Shift: TShiftState; X, Y: Integer);

begin

move:=false;

end;

end.

8. Соответствующий код должен быть вставлен также в обработчик событий OnMouseDown, OnMouseMove, и OnMouseUp для каждого из компонентов Image (Image1,…). Код везде одинаковый, отличее только в части названия заголовка процедуры: так в коде программы должны быть четыре одинаковых процедуры:

procedure TForm1.Image1MouseDown,

procedure TForm1.Image2MouseDown,

procedure TForm1.Image3MouseDown,

procedure TForm1.Image4MouseDown,

четыре одинаковых процедуры:

procedure TForm1.Image1MouseMove,

procedure TForm1.Image2MouseMove,

procedure TForm1.Image3MouseMove,

procedure TForm1.Image4MouseMove

и четыре одинаковых процедуры:

procedure TForm1.Image1MouseUp,

procedure TForm1.Image2MouseUp,

procedure TForm1.Image3MouseUp,

procedure TForm1.Image4MouseUp

Код у всех, как написано в пункте 6 + обязательная ссылка на соответствующее место кода из Object Inspector!

Это позволит в готовом приложении перетаскивать с помощью курсора мыши каждую из четырех частей загруженной картинки (Как в детской игре “кубики”).

Лабораторная работа 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),Point(70,150)]);

TextOut(30,170,’PolyGon’);

PolyLine([Point(130,150),Point(140,130),Point(150,140),Point(160,130),Point(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-рисунок размером 8×8, сохраните его под именем 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 — человек шагает вправо, revers=-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.

8. Тестируем приложение и разбираемся в деталях.

Выполненные лабораторные работы частично можно найти тут:

https://drive.google.com/folderview?id=0B1Nl3PHlshctbER1UmVweDNiREU&usp=sharing

Видео части уроков здесь: https://www.youtube.com/channel/UCWH7_rN_ZkP53JNsYBJeWTw

Литература

1. Т. Гурьянова. Программирование: быстрый старт. Язык программирования Паскаль.

Книга 3 части I -III. Мн.: БГУ ФПМИ «Юни-центр XXI», 2013.

2. А. Архангельский. Программирование в Delphi 5. М: Бином, 2000.

3. А. Архангельский. Приемы программирования в Delphi на основе VCL. М: Бином, 2006.

Содержание

Предисловие 1

Введение 1

Лабораторная работа 1 2

Лабораторная работа 2. Заготовка к программе «Калькулятор» 2

Лабораторная работа 3. Работаем с фреймами 4

Лабораторная работа 4. Создаем текстовый редактор. Работаем

с палитрой компонентов ActiveX 5

Проект Викторина «Мир животных» 6

Лабораторная работа 5. Вставка картинок 6

Лабораторная работа 6. Перемещение отдельных компонентов 7

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

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

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

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

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

заданным шаблоном 15

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

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

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

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

Литература 21

 

*******************************************************************************************************

Учебник в разных форматах тут: https://drive.google.com/drive/folders/0B4icNOfw8DwUU0tfMFZIak13Vmc

********************************************************************************************************

Лабораторные по Delphi: https://drive.google.com/folderview?id=0B1Nl3PHlshctbER1UmVweDNiREU&usp=sharing По части лабораторных есть видеоуроки:
1 лабораторная https://www.youtube.com/watch?v=l_lHUd7F8fQ
2 лабораторная https://www.youtube.com/watch?v=1hhDlaU2BeY
3 лабораторная https://www.youtube.com/watch?v=MzJd3WGSnL4
4 лабораторная https://www.youtube.com/watch?v=yfsZofdumFY
5 лабораторная https://www.youtube.com/watch?v=ETpIJfJk5aI
7 лабораторная https://www.youtube.com/watch?v=iUM1TjJJa0g
8 лабораторная https://www.youtube.com/watch?v=OepBLpLqj8s

*************************************************************************************************************

Исходники к классному калькулятору (написал Сергей Анищенко): https://drive.google.com/a/tut.by/folderview?id=0B1Nl3PHlshctazh2Ylp3MjRoTVU&usp=drive_web

*************************************************************************************************************

Вот еще несколько программ на Delphi (написал Сергей Анищенко):

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

методические материалы по информатике