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

лекции delphi 1часть

.pdf
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
814.86 Кб
Скачать

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

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

Вызов деструктора для несуществующего объекта недопустим, если это сделать, то произойдёт ошибка. Чтобы освободить программиста от необходимости контролировать наличие объекта и его состояние (равен или нет nil), ввели предопределённый метод Free,

который следует вызывать вместо деструктора. Метод Free сам вызывает Destroy, но только если значение объекта не равно nil.

DiskGauge.Free;

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

Constructor TMyClass.Create(mmm:byte);

begin

inherited Create;

intfield:=mmm;

end;

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

abstract – абстрактный;

virtual – виртуальный;

dynamic – динамический;

override – перекрывающий;

Методы принято разделять на обычные (статические) и динамические. При обращении к обычному методу компилятор точно знает класс, которому данный метод принадлежит.

В Object Pascal чаще используется динамическое замещение методов на этапе выполнения программы. Для этого метод, замещаемый в родительском классе, должен объявляться как динамический (с директивой dynamic) или виртуальный (virtual). В

производных классах (потомках) виртуальный и динамический методы перекрываются с использованием слова override. Перекрывающий метод должен иметь точно такой же список параметров, что и перекрываемый. Суть динамического замещения методов в том,

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

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

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

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

(Dinamic Method Table) или VMT (Virtual Method Table) и помещает в неё адреса точек входа соответственно динамического или виртуального методов. При каждом обращении к замещаемому методу компилятор вставляет код, позволяющий извлечь адрес точки входа в подпрограмму из той или иной таблицы. Когда в классе-потомке встречается метод, объявленный с директивой override, компилятор создаст код, который на этапе прогона программы поместит в родительскую таблицу точку входа метода класса-

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

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

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

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

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

Абстрактный метод подразумевает конкретное действие, а не способ его реализации.

Реализацию такие методы получают в наследниках.

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

Например, для разных геометрических фигур можно определить единые методы show, hide, moveto и абстрактный метод draw. Метод draw для каждой фигуры реализуется по-разному.

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

Существует три типа пользователей класса:

сам класс (методы класса могут обращаться к другим методам и данным класса);

обычные пользователи, то есть программы пользователя;

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

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

объявленные в секции private, имеют самую ограниченную область действия. Они доступны только внутри методов данного класса и подпрограмм, находящихся в том же модуле. Элемент, объявленный как private, недоступен даже ближайшим потомкам класса,

если они размещены в других модулях. Обратите внимание, что приватные данные видимы, но недоступны. Такой контроль введен для предотвращения случайного доступа к данным или внутренним функциям, то есть в целях уменьшения ошибок при разработке программ, но не для предотвращения «взлома».

Ко всему, что объявлено в секции public, разрешен неограниченный доступ. В

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

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

Кроме перечисленных выше секций есть ещё одна – published. Правила видимости у этой секции такие же, как у public. Особенность в том, что для элементов, помещённых в эту секцию, генерируется информация, позволяющая превращать их в компоненты. Те свойства, которые должны быть доступны в Инспекторе объектов, обязательно надо поместить в эту секцию. Секция published используется при разработке компонентов.

По умолчанию (без указания типа секции) секция считается объявленной как published. Такая секция помещается в самом начале объявления класса любой формы и

продолжается до первой объявленной секции, в неё Object Pascal помещает описания

расположенных на форме компонентов.

3.РАЗРАБОТКА ПРИЛОЖЕНИЙ В СРЕДЕ ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ DELPHI

3.1. Проект и управление проектом

3.1.1. Проект Delphi

Всреде Delphi разрабатывается проект – набор файлов, из которых состоит

приложение. Рекомендуется файлы, относящиеся к проекту, хранить в отдельной папке.

В любой проект входит, по крайней мере, шесть файлов:

project1.dpr – главный файл проекта, формируется системой при создании нового приложения;

unit1.pas – первый модуль (unit) программы, который автоматически появляется в начале работы;

unit1.dfm – файл описания формы, используется для сохранения информации о внешнем виде главной формы;

project1.res – файл ресурсов, в нём хранятся иконки, растровые изображения,

курсоры. Как минимум, содержит иконку приложения;

project1.dof – файл опций, является текстовым файлом для сохранения установок,

связанных с данным проектом (например директив компилятора);

project1.cfg – файл конфигурации, содержит информацию о состоянии среды.

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

звуками, файлы справочной системы и т.п. Однако перечисленными элементами управляет сам программист. Если сохранить проект под другим именем, то кроме файла проекта изменят название и файлы с расширением res, dof и cfg. Если изменить имя файла модуля (.pas), то изменится и имя файла описания формы ( .dfm ).

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

После компиляции программы получаются файлы с расширениями: dcu – скомпилированные модули;

exe – исполняемый файл;

~pas, ~dfm и т.п. – backup файлы (предыдущие версии).

Помимо модулей, связанных с формой, можно создавать отдельные модули, которые оформляются по обычным правилам языка Object Pascal (Delphi), сохраняются в

отдельных файлах. Имена этих модулей указываются в разделе uses проекта или тех модулей, в которых они используются.

Главный файл проекта представляет собой текстовый файл, содержащий программный код, записанный на языке Object Pascal. Этот файл подключает все используемые программные модули и содержит операторы для запуска приложения. При создании нового приложения Delphi автоматически создаёт файл проекта. Код файла проекта, содержащего одну форму, приведён ниже.

program Project1;

uses

Forms,

Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

В разделе uses подключается системый модуль Forms и модуль формы Unit1.

Название формы приводится в фигурных скобках. Директива компилятора {$R *.res}

подключает к результирующему exe-файлу ресурсы.

Тело программы содержит операторы, которые готовят приложение к работе

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

Чтобы увидеть код файла проекта, надо выполнить команду View|Unit через меню или с помощью кнопки на панели инструментов, а затем в диалоговом окне выбрать

Project1. Окно ViewUnit используется для вывода на экран кода файла проекта и входящих в него модулей.

При создании приложения Delphi генерирует пустую форму, текст модуля которой приведён ниже.

unit Unit1;

interface

uses

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

type

TForm1 = class(TForm)

private

{ Private declarations }

public

{ Public declarations } end;

var

Form1: TForm1;

implementation

{$R *.dfm}

end.

Модуль начинатся с зарезервированного слова unit, после которого пишется имя модуля. Имя модуля совпадает с именем файла, в котором он сохранён.

В интерфейсной секции описываются программные элементы (типы, переменные,

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

заголовок;

секция интерфейсных объявлений interface;

секция реализации implementation;

секция инициализации initialization;

секция завершения finalization;

терминатор end.

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

выполняемые только один раз при любом завершении программы: нормальном или аварийном. Раздел finalization вводится в программу только при наличии секции initialization.

3.1.2.Управление проектом

При старте Delphi автоматически создаёт новый проект. При загрузке другого проекта (нового или имеющегося на диске) открытый ранее проект закрывается. Для создания нового проекта надо выполнить команду File|New|Application, а для загрузки

существующего – File|Open Project. Рекомендуется, создав новый проект, сразу сохранить его в отдельной папке и в дальнейшем регулярно выполнять сохранение всех файлов проекта.

Менеджер проекта Project Manager предназначен для управления проектами и составными частями разрабатываемого приложения. Его можно вызвать командой

View|Project Manager. Менеджер проектов позволяет работать с группой проектов: можно просматривать, добавлять и удалять проекты и их составные части. Если необходимо одновременно работать с несколькими проектами, то их целесообразно объединить в группу.

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

В группе только один проект является активным. Активизировать проект можно выбрав его в раскрывающемся списке или с помощью кнопки Activate.

Некоторые из предусмотренных в менеджере проектов операции можно выполнить другим способом. Так, команда Project|Add to Project добавляет к проекту новую форму, а

команда Project|Remove from Project позволяет удалить существующую форму.

Обозреватель проекта Project Browser позволяет перемещаться по иерархии классов,

глобальных элементов и модулей проекта. Окно Обозревателя Exploring открывается командой View|Browser. Оно разделено на две части: Inspector pane (Панель просмотра) и

Details pane (Детальная панель). Кнопками можно задать один из трёх доступных для просмотра объектов: глобальные элементы Globals, классы Classes или модули Units.

Получить доступ к параметрам обозревателя проекта можно также через окно Environment Options (Параметры среды), в котором параметры обозревателя проекта находятся на вкладке Explorer.

Репозиторий

Delphi позволяет многократно использовать одни и те же объекты в качестве шаблонов при дальнейшей разработке приложений. Для хранения таких объектов используется специальное хранилище Repository. При разработке приложения можно добавить в него объект из репозитория через окно New Items, которое вызывается командой File|New|Other. Большое количество объектов, находящихся в хранилище,

распределено по нескольким страницам: New (базовые элементы), Forms (формы), Projects

(проекты), Dialogs (диалоги), Data Modules (модули данных) и др. Кроме того,

пользователь может помещать в репозиторий свои заготовки.

Для добавления объекта к проекту необходимо выбрать страницу и указать объект.

Объекты можно добавлять к проекту различными способами, в зависимости от состояния переключателя в нижней части окна:

Copy – копирование объекта. Изменения, внесённые в проекте в копию объекта, не влияют на оригинал;

Inherit – от объекта в хранилище порождается новый объект, который добавляется к проекту;

Use – использование объекта из хранилища. Изменение этого объекта в проекте приводит к изменению объекта в хранилище и во всех проектах, использующих этот объект аналогичным образом (как Use).

Для помещения формы в репозиторий, следует сохранить её в папке ObjRepos. Затем выполнить команду Add to Repository через контекстное меню. Если использовать команду Project|Add to Repository, то в репозиторий будет добавлен проект, а не форма.

Проекты из репозитория копируются целиком, с родительскими классами, что замедляет работу и увеличивает объём памяти. В диалоговом окне Add to Repository надо записать сведения о помещаемой в архив форме: название, пояснения, имя автора разработки,

название страницы хранилища.

3.1.3. Настройка параметров проекта

Установить параметры проекта можно двумя способами:

в окне Project Options,

программно.

Проще всего воспользоваться окном задания параметров объекта, которое открывается командой Project|Options. На странице Forms можно назначить главную форму приложения и в списке Auto-create forms выбрать формы, которые будут создаваться одновременно с главной. Главная форма открывается первой, и её закрытие приводит к закрытию всего приложения.

На странице Application задают название и иконку, которые будут отображаться в среде Windows на панели задач, а также файл справки, подключаемый к проекту. На страницах Compiler и Linker устанавливают директивы компилятора и компоновщика

(редактора связей).

Заданные параметры Delphi автоматически заносит в соответствующие файлы проекта.

Программное задание параметров (использованием свойств объекта Application или включением в код директив компилятора и компоновщика) обладает приоритетом.

3.1.4.Компиляция и выполнение проекта

Компиляция проекта выполняется командой Project|Compile ProjectName или использованием комбинации клавиш Ctrl+F9. При этом компилируются все исходные модули, содержимое которых изменялось после последней компиляции: для каждого программного модуля создаётся файл с расширением dcu. Затем компилируется файл проекта и компонуется (собирается) из dcu-модулей исполняемый файл, имя которого совпадает с именем файла проекта. Готовый к использованию файл может быть приложением (*.exe) или динамически загружаемой библиотекой (*.dll).

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

Кроме обычной компиляции, можно командой Project|Build ProjectName выполнить сборку (построение) проекта. В этом случае перекомпилируются все модули проекта, для которых доступны исходные тексты.

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

Windows. Выполнение приложения из среды Delphi задаётся командой Run|Run (клавишей

F9 или кнопкой с зелёным треугольником) и имеет следующие особенности:

нельзя запустить несколько копий приложения;

при возникновении исключительных ситуаций сначала выводятся сообщения

Delphi, а затем – приложения;

для аварийного завершения приложения (например, при зацикливании) необходимо выполнить команду Run|Program Reset;

для продолжения разработки проекта приложение надо закрыть.

3.2.Создание приложения

3.2.1.Этапы создания приложения

Разработка приложения Delphi состоит из двух этапов: создания интерфейса приложения и определения его функциональности.

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

происходящих при действиях пользователя. При создании приложения необходимо:

уяснить задачу, которую надо решить;

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

написать сценарий работы будущей программы;

разработать (при необходимости) алгоритмы процедур, реализующих предусмотренные в сценарии действия;

реализовать проект;

выполнить тестирование и отладку;

подготовить проект к распространению.

3.2.2.Создание интерфейса приложения

Интерфейс приложения определяется компонентами, которые разработчик выбирает из палитры компонентов и помещает на форму. При проектировании интерфейса приложения действует принцип WYSIWYG (What You See Is What You Get) – что видите,

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

Для того чтобы поместить компонент на форму, необходимо перейти на нужную страницу, щёлкнуть мышью по выбранному компоненту в палитре, а затем – в нужном месте формы. Другой способ задания компонента предполагает использование общего перечня всех компонент, который открывается командой View|Component List.

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

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

Работать с компонентами можно через буфер. Предварительно нужные компоненты следует выделить, а затем применить команды меню Edit. Другой способ работы с компонентами предлагает окно Object TreeView, которое впервые появилось в Delphi 6.

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

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

При размещении компонента на форме Delphi автоматически вносит изменения в файл модуля и в файл описания формы. В файле модуля в описании класса формы добавляется строчка с описанием типа компонента. Описания всех типов начинаются с