Добавил:
Рыльский филиал МГТУ ГА. Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теория / Конспект Лекций

.pdf
Скачиваний:
0
Добавлен:
29.03.2024
Размер:
851.63 Кб
Скачать

Процедуру можно создавать «вручную», при этом необходимо добавить её название в секцию interface, модуля в котором описывается:

procedure Button1Click(Sender: TObject);

Тема 2.3 Диалоговые и графические компоненты.

2.3.1. Модальные и не модальные диалоговые панели.

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

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

По умолчанию формы приложения открываются в немодальном режиме. Для их отображения достаточно установить свойство Visible в Truu или использовать метод Show.

Чтобы отобразить форму в модальном режиме необходимо вызвать метод ShowModal.

procedure TForm1.Button1Click(Sender: TObject); begin

Form2.ShowModal;

end;

Так как Form2 описана в другом модуле, то его имя добавляют в секцию Uses, модуля из которого вызывают:

Uses unit2;

Диалоговые панели общего назначения.

Стандартные диалоги – это диалоговые окна, общие для большинства приложений операционной системы. Например, когда пользователь сохраняет файл в редакторе Word, он использует диалоговое окно Save As … (Сохранить как …). Когда он сохраняет рабочую книгу в Microsoft Excel, он также использует диалоговое окно Save As …

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

41

В составе Lazarus поставляется 14 диалоговых компонентов. Все они находятся на вкладке Dialogs (Рисунок 10). Эти компоненты являются не визуальными, они присутствуют на форме в виде значков, однако во время выполнения они невидимы.

Рисунок 10 - Компоненты страницы Dialogs

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

Таблица 6. Диалоговые панели общего назначения.

Компонента

Описание

TOpenDialog

открытие файла

TSaveDialog

сохранение файла

TColorDialog

диалог выбора цвета

TFontDialog

диалог выбора шрифта

TPrintDialog

диалог печати

TPrintSetupDialog

настройка печатающего устройства

TFindDialog

диалог поиска

TReplaceDialog

поиск с заменой

TCalendarDialog

диалог выбора даты

TCalculatorDialog

диалог-калькулятор

TOpenPictureDialog

диалог открытия графических файлов

TSavePictureDialog

диалог сохранения графических файлов

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

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

42

Таблица 7. Свойства диалоговых панелей.

Свойство

Назначение

FileName

имя файла

DefaultExt

расширение имени файла по умолчанию

Filter

Список расширений файлов, в соответствии с которыми

 

отбираются имена файлов для отображения в диалоговом

 

окне при открытии файла. При сохранении файла

 

выбранное из списка расширение добавляется к имени

 

файла.

Title

заголовок окна диалога

InitialDir

папка (директория, каталог), используемая по умолчанию

Device

тип устройства

FindText

искомый текст

ReplaceText

заменяющий текст

FilterIndex

порядковый номер строки в списке расширений

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

procedure TForm1.Button1Click(Sender: TObject); begin

if ColorDialog1.Execute then Form1.Color:=ColorDialog1.Color;

end;

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

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

Lazarus предоставляет разработчику три способа отображения графики:

использование заранее созданных графических изображений;

создание изображения с помощью графических компонент;

отображать графические примитивы во время работы программы.

На странице Additional палитры компонент находятся четыре основные графические компоненты: TBevel, TShape, TImage, TPaintBox.

43

Компонента TBevel самая простая, она не занимает ресурсов, может принимать вид рамки или линии. Внешний вид объекта указывается свойствами Shape и Style.

Компонент TShape предназначен для отображения на форме простейшей геометрической фигуры, из ряда предопределённых в множестве TShapeType. Конкретная форма геометрического объекта задается в свойстве Shape. Цвет фигуры определяется кистью объекта (свойство Brush), границы фигуры – пером (свойство Pen). Размеры фигуры соответствуют размерам компонента. Если задан квадрат или круг, а ширина и высота не равны между собой, то сторона или диаметр фигуры будут равны меньшей из сторон.

Компонента TImage позволяет поместить готовое графическое изображение в любом месте на форме. Имя файла с изображением задаётся свойством Picture. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу. Поэтому такой EXE файл может получиться достаточно большой. Как альтернативу можно рассмотреть загрузку картинки во время выполнения программы, для этого у свойства Picture (которое является объектом со своим набором свойств и методов) есть специальный метод LoadFromFile.

Image1.Picture.LoadFromFile(FileName);

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

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

Доступ к графической подсистеме Lazarus открывает объект

TCanvas.

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

Для рисования TCanvas включает в себя шрифт, перо и кисть: Font,

Pen, Brush.

44

При рисовании компонента, обладающего свойством Canvas, сам компонент рассматривается как прямоугольная сетка, состоящая из отдельных точек, называемых пикселями. Положение пикселя характеризуется его вертикальной (X) и горизонтальной(Y) координатами. Левый верхний пиксель имеет координаты(0,0). Вертикальная координата возрастает сверху вниз, горизонтальная слева направо. Общее количество пикселей по вертикали определяется свойством Height, а по горизонтали свойством Weight. Каждый пиксель может иметь свой цвет. Для доступа к любой точке полотна используется свойство Pixels[X,Y]:TColor. Это свойство определяет цвет пикселя с координатами X(integer), Y(integer). Изменить цвета любого пикселя полотна можно с помощью следующего оператора присваивания:

Компонент.Canvas.Pixels [X,Y]:= Color ;

где Color переменная или константа типа TСolor.

Для рисования на Canvas используются методы, приведенные в таблице 8.

Таблица 8. Методы объекта Canvas.

Метод

Описание

Arc

Рисует сегмент эллипса

Chord

Рисует хорду и заливает отсекаемую ею часть эллипса

Ellipse

Рисует и закрашивает эллипс

MoveTo

Перемещает текущее положение пера (свойство PenPos)

 

в точку c заданными координатами

LineTo

Проводит линию текущим пером из текущей точки в

 

заданную

Draw

Осуществляет рисование графического объекта Graphic

StretchDraw

Осуществляет рисование объекта Graphic в заданном

 

прямоугольнике с масштабированием

Polygon

Строит многоугольник, используя массив координат

 

точек Points

Rectangle

Рисует прямоугольник с диагональю заданной

 

координатами

TextOut

Производит вывод строки

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

Рисование осуществляется в обработчике события OnPaint:

procedure TForm1.PaintBox1Paint(Sender: TObject); begin

45

PaintBox1.Canvas.Pen.Color:=clRed;

PaintBox1.Canvas.Pen.Width:=5;

PaintBox1.Canvas.Ellipse (5,5,PaintBox1.Width-5,PaintBox1.Height-5); end;

Приведённый метод отобразит в области компоненты PaintBox красную окружность с толщиной в 5 пикселей.

Создание анимационных эффектов.

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

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

Timer и ldleTimer (Рисунок 11).

Рисунок 11Компонент Timer.

Компонент Timer может выполнять некоторый код через регулярные промежутки времени. Размещённый на форме, он остается невидимым во время работы приложения. Через установленный интервал времени, таймер срабатывает событием OnTimer. Все заданные операции записываются в обработчике этого события.

Основным свойством таймера является свойство Interval. Оно определяет (в миллисекундах), как часто наш компонент будет генерировать событие OnTimer. Например, если мы установим его значение в 1000, то событие OnTimer будет генерироваться раз с секунду, а если установим в 500 - то 2 раза в секунду. Свойство Interval компонента Timer можно задавать во время разработки или во время выполнения программы.

Чтобы отключить таймер, нужно присвоить свойству Enabled значение False или свойству Interval – значение 0.

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

procedure TForm1.Timer1Timer(Sender: TObject); begin

PaintBox1.left:= PaintBox1.left+10;

46

end;

В приведённом примере, каждый раз по истечению заданного времени, объект PaintBox1 будит сдвигаться влево на 10 пикселей относительно предыдущего положения.

Тема 2.4. Классы и объекты.

2.4.1. Основные понятия классов и объектов.

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

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

Объект - это переменная пользовательского типа «класс». Часть данных определяется как собственность объекта, которая недоступна извне (частные элементы объекта). Т.о. объект обеспечивает их защиту против случайного изменения или некорректного использования.

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

Var Form1: TForm1; {форма 1 является экземпляром класса TForm1}

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

Все объектно-ориентированные языки имеют три общие концепции: инкапсуляцию, наследование и полиморфизм.

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

Type TForm1=class(TForm) {определяется новый класс TForm1,

который создан по образцу стандартного класса TForm}

Класс TForm описывает пустое окно, а TForm1 окно с размещенными на нём компонентами, представленными ниже в объявлении класса.

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

47

содержит (инкапсулирует) всё необходимое для создания окна, TMemo простой текстовый редактор, и т.д.

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

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

Type TForm1=class(TForm) { TForm1 дочерний класс от родителя TForm}

Все классы Object Pascal порождены от единственного родителя класса TObject, обеспечивающего весь жизненный цикл любых объектов от их создания до уничтожения. Каждый потомок дополняет возможности своего класса родителя новыми и передаёт их своим потомкам.

Полиморфизм - это механизм, который позволяет использовать один и тот же интерфейс при реализации целого класса различных действий (“один интерфейс – множество методов”). Выбор того, какое именно действие будет совершено, определяется конкретной ситуацией.

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

Составляющие класса. Поля, методы, свойства.

Классы – специальные типы, которые содержат поля, методы и свойства.

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

Поле - это переменная, объявленная внутри класса.

Как правило, поля объявляются с модификаторами доступа private либо protected, чтобы запретить прямой доступ к ним.

48

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

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

Свойства объявляются с помощью зарезервированных свойств:

Property, real и write.

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

или write.

property Color: TColor read GetColor write SetColor;

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

Классы могут наследовать методы и свойства от других классов Любой вновь создаваемый класс может содержать секции (разделы),

определяемые зарезервированными словами: public, protected, private. Свойства и методы с директивой public (общие) позволяют получить

доступ к ним где угодно, как внутри класса, так и вне класса.

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

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

type

 

TMemoryStream = class(TCustomMemoryStream)

 

private

 

FCapacity: Longint;

{поле класса}

procedure SetCapacity(NewCapacity: Longint);

{метод}

protected

 

function Realloc(var NewCapacity: Longint): Pointer;

virtual;

 

property Capacity: Longint read FCapacity

{свойство}

write SetCapacity;

 

end;

 

49

 

В данном примере класс Classes.TMemoryStream происходит от

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

50

Соседние файлы в папке Теория