Теория / Конспект Лекций
.pdfПроцедуру можно создавать «вручную», при этом необходимо добавить её название в секцию 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