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

Часть 2-Основы программирования (Delphi)

.pdf
Скачиваний:
65
Добавлен:
09.06.2015
Размер:
1.93 Mб
Скачать

ВВЕДЕНИЕ

Назначение и возможности Delphi

Delphi представляет собой систему программирования. Как любая подобная система, Delphi предназначена для разработки программ и имеет две характерные особенности: создаваемые с ее помощью программы могут работать не только под управлением Windows, а сама она относится к классу инструментальных средств ускоренной разработки программ (Rapid Application Development, RAD).

Первый инструмент RAD создан корпорацией Microsoft и называется Visual Basic. Среда Delphi, созданная тремя годами позже, вместе с такими продуктами как

Visual C++, C++ Builder, JBuilder, PowerBuilder также относится к классу инструментов ускоренной разработки программ. Это ускорение достигается за счет двух характерных свойств Delphi: визуального конструирования форм и широкого использования библиотеки визуальных компонентов (Visual Component Library, VCL).

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

Использование компонентов не только во много раз сокращает сроки разработки программ, но и существенно снижает вероятность случайных программных ошибок, от которых, увы, не защищен ни один крупный программный проект. Однако в их применении есть и оборотная сторона. Как правило, даже простые в функциональном отношении компоненты представляют собой лишь «вершины айсбергов», так как они создаются по объектно-ориентированной технологии и многие их функциональные черты наследуются от многочисленных родительских компонентов. В результате даже несложные программы, созданные в Delphi, редко имеют объем меньше сотен килобайт.

Ни один инструмент RAD не создается без средств прогона и отладки вновь созданной программы. Такими средствами традиционно оснащаются все инструменты, создаваемые корпорацией Borland. В Delphi эти средства доведены до совершенства. Вы можете начать исполнение программы и последовательно – оператор за оператором – следить за ее выполнением по исходному тексту. В любой момент вы можете узнать текущее значение переменной и при необходимости изменить его без перекомпиляции программы. Вы можете запустить программу, установив в ней нужные точки контрольного останова – при достижении такой точки программа автоматически прервет свою работу и перейдет в отладочный режим.

Мощность и гибкость языка

Мощность и гибкость языка программирования Delphi (в версиях 1…6 этот язык называется Object Pascal; с точки зрения семантики и синтаксиса языки Object Pascal v.6 и Delphi v.7 почти идентичны) – безусловное достоинство Delphi, выгодно отличающее эту систему программирования от других инструментов RAD. Ядром языка Delphi является язык Паскаль, созданный профессором Цюрихского университета Никлаусом Виртом еще в конце 60-х гг. специально для обучения студентов программированию. В числе его студентов были Филипп Канн и Андерс Хейлсберг. Первый основал корпорацию Borland, второй стал ее главным программистом. За долгие годы А. Хейлсберг и программисты под его началом превратили Паскаль в мощный современный объектно-ориентированный язык, пригодный для эффективного создания программ любой сложности.

От Visual Basic язык Delphi отличают строгая типизированность, позволяющая компилятору еще на этапе компиляции обнаружить многие ошибки, а также средства работы с указателями. Синтаксис C++ прямо-таки провоцирует создание запутанных программ, в то время как простой и ясный синтаксис Delphi позволяет последнему претендовать на роль языка, идеально подходящего для описания алгоритма (недаром Паскаль происходит от использующегося для этих целей алгоритмического языка АЛГОЛ-60).

Если по каким-либо причинам возможности Delphi окажутся недостаточными, вы можете программировать на Ассемблере (машинно-зависимом языке программирования), который органично вплетен в Delphi.

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

Инструмент создания приложений баз данных

Репутация Delphi как самого эффективного средства разработки приложений баз данных определяется тремя обстоятельствами: высокопроизводительной машиной доступа к данным разного формата (локальным таблицам типа dBase, Paradox, к серверам баз данных InterBase, MS SQL Server, Oracle, Informix и т.п.) (Borland Database Engine, BDE\, наличием многочисленных компонентов и технологий, ориентированных на эту сферу применения (на решение самых разных задач: выборку и сортировку данных, их наглядное представление, в том числе и графическое, изменение и публикацию данных в виде отчетов, документов или HTML-страниц в Интернете и т.д.), и поставкой вместе с Delphi компактного, мощного и простого в администрировании сервера баз данных InterBase.

Глава . ВВЕДЕНИЕ В DELPHI

o DELPHI – СРЕДА ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ o СТРУКТУРА ПРОГРАММ DELPHI

Структура проекта

Структура модуля

Элементы программы

DELPHI – СРЕДА ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ

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

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

Окно формы содержит проект Windows-окна программы. Важно помнить, что с самого начала работы над новой программой Delphi создает минимально необходимый код, обеспечивающий ее нормальное функционирование в Windows. Таким образом, простейшая программа готова сразу после выбора опции File | New | Application, и остается просто запустить программу.

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

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

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

Заметим, что все видимые компоненты[В Delphi могут использоваться как видимые, так и невидимые компоненты. Невидимые компоненты не имеют визуального отображения на этапе прогона программы.] имеют свойства Left (Слева), Tор (Сверху), Width (Ширина) и Height (Высота), числовые значения которых определяют положение левого верхнего угла компонента и его размеры в

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

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

Например, при щелчке по кнопке (компонента Button) мышью в работающей программе возникает событие OnClick. (По щелчку). Первоначально это событие никак не обрабатывается программой, и поэтому “нажатие” кнопки не приведет ни к каким последствиям. Чтобы заставить программу реагировать на нажатие кнопки, необходимо написать на языке Object Pascal фрагмент программы (модуля), который называется обработчиком события.

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

СТРУКТУРА ПРОГРАММ DELPHI

Любая программа в Delphi состоит из файла проекта (файл с расширением dpr) и одного или нескольких модулей (файлы с расширениями pas). Каждый из таких файлов описывает программную единицу Object Pascal.

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

Delphi создает файлы с расширениями pas, dfm и dcu для каждого модуля: pasфайл содержит копию текста из окна кода программы, в файле с расширением dfm хранится описание содержимого окна формы, а в dcu-файле - результат преобразования в машинные инструкции текста из обоих файлов. Файлы dcu создаются компилятором и дают необходимую базу для работы компоновщика, который преобразует их в единый загружаемый файл с расширением ехе.

Исполняемый ЕХЕ-файл будет создан под именем проекта.

Структура проекта

Файл проекта представляет собой программу, написанную на языке Object Pascal и предназначенную для обработки компилятором. Эта программа автоматически создается Delphi и содержит лишь несколько строк. Чтобы увидеть их, запустите Delphi и щелкните по опции Project | View Source главного меню. Delphi покажет окно кода с закладкой Project1, содержащее такой текст:

program Project1;

uses

Forms,

Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin

Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;

end.

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

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

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

{$R *.RES}

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

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

{Это комментарий} (*Это тоже комментарий*)

//Все символы до конца этой строки составляют

комментарий

Слово Program со следующим за ним именем программы и точкой с запятой образуют заголовок программы. За заголовком следует раздел описаний, в котором программист (или Delphi) описывает используемые в программе идентификаторы. Идентификаторы обозначают элементы программы, такие как типы, переменные, процедуры, функции (об элементах программы мы поговорим чуть позже). Здесь же с помощью предложения, которое начинается зарезервированным словом uses (использовать) программист сообщает компилятору о тех фрагментах программы (модулях), которые необходимо рассматривать как неотъемлемые составные части программы и которые располагаются в других файлах. Строки

uses

Forms, Unit1 in 'Unitl.pas' {Form1};

указывают, что помимо файла проекта в программе должны использоваться модули Forms И Unit1. Модуль Forms является стандартным (т. е. уже известным Delphi), а модуль Unit1 - новым, ранее неизвестным, и Delphi в этом случае указывает также имя файла с текстом модуля (in 'unit1.pas') и имя связанного с модулем файла описания формы {Form1}.

Собственно тело программы начинается со слова begin (начать) и ограничивается терминатором end с точкой. Тело состоит из нескольких операторов языка Object Pascal. В каждом операторе реализуется некоторое действие - изменение значения переменной, анализ результата вычисления, обращение к подпрограмме и т. п. В теле нашей программы - три исполняемых оператора:

Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;

Каждый из них реализует обращение к одному из методов объекта Application. Забежим вперед и хотя бы кратко поясним только что введенные термины, которые определяют важные для Object Pascal понятия. Объектом называется специальным образом оформленный фрагмент программы, заключающий в себе данные и подпрограммы для их обработки. Данные называются полями объекта, а подпрограммы - его методами. Объект в целом предназначен для решения какойлибо конкретной задачи и воспринимается в программе как неделимое целое (иными словами, нельзя из объекта “выдернуть” отдельное поле или метод). Объекты играют чрезвычайно важную роль в современных языках программирования. Они придуманы для того, чтобы увеличить производительность труда программиста и одновременно повысить качество разрабатываемых им программ. Два главных свойства объекта - функциональность и неделимость - делают его самостоятельной или даже самодостаточной частью программы и позволяют легко переносить объект из одной программы в другую. Разработчики Delphi придумали сотни объектов, которые можно рассматривать как кирпичики, из которых программист строит многоэтажное здание программы. Такой принцип построения программ называется объектно-ориентированным программированием (ООП). В объекте Application собраны данные и подпрограммы, необходимые для нормального функционирования Windows-программы в целом. Delphi автоматически создает объект-программу Application для каждого нового проекта. Строка

Application.Initialize;

означает обращение к методу Initialize объекта Application. Прочитав эту строку, компилятор создаст код, который заставит процессор перейти к выполнению некоторого фрагмента программы, написанного для нас разработчиками Delphi. После выполнения этого фрагмента (программисты говорят: после выхода из подпрограммы) управление перейдет к следующей строке программы, в которой вызывается метод CreateForm и т. д.

Структура модуля

Модули - это программные единицы, предназначенные для размещений фрагментов программ. С помощью содержащегося в них программного кода реализуется вся поведенческая сторона программы. Любой модуль имеет следующую структуру: [Более точное описание структуры модуля приводится позже.]: заголовок, секция интерфейсных объявлений, секция реализации, терминатор Заголовок открывается зарезервированным словом Unit за которым следует имя модуля и точка с запятой. Секция интерфейсных объявлений открывается зарезервированным словом Interface, а секция реализации - словом Implementation. Терминатором модуля, как и терминатором программы, является End с точкой. Следующий фрагмент программы является синтаксически правильным вариантом модуля:

unit Unit1; interface

//Секция интерфейсных объявлений implementation

//Секция реализации

end.

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

Щелкните по закладке Unit1 окна кода, и вы увидите такой текст: 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.

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

Как мы увидим дальше, классы служат основным инструментом реализации мощных возможностей Delphi. Класс является образцом, по которому создаются объекты, и наоборот, объект - это экземпляр реализации класса. Образцы для создания элементов программы в Object Pascal называются типами, таким образом, класс TForm1 – это тип. Перед его объявлением стоит зарезервированное слово Type (тип), извещающее компилятор о начале раздела описания типов.

Стандартный класс TForm реализует все нужное для создания и функционирования пустого Windows-окна. Класс TForm1 порожден от этого класса, о чем свидетельствует строка

TForm1 = class(TForm)

в которой за зарезервированным словом Class в скобках указывается имя родительского класса. Термин “порожден” означает, что класс TForm1 унаследовал все возможности родительского класса TForm и добавил (возможно) к ним собственные в виде дополнительных компонентов, которые можно вставить в форму Form1. Перечень вставленных компонентов и будет составлять значительную часть описания класса. Например:

type

TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: Tbutton;

procedure Button1Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

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

Компонент Button1 (Кнопка1) представляет собой экземпляр стандартного класса TButton, а компонент Label1 (Метка1) - экземпляр класса TLabel. По используемому в Delphi соглашению все имена классов начинаются с буквы Т. Все конкретные экземпляры компонентов, вставляемые в форму, получают имя класса (без T) с добавленным числовым индексом.

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

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

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

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

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

Элементы программы

Элементы программы - это минимальные неделимые ее части, еще несущие в себе определенную значимость для компилятора. К элементам относятся:

зарезервированные слова;

идентификаторы;

типы;

константы; переменные; метки; подпрограммы; комментарии.

Зарезервированные слова часто относят к алфавиту языка.

Алфавит языка Object Pascal включает буквы, цифры, шестнадцатеричные цифры, специальные символы, пробелы и зарезервированные слова.

Буквы - это буквы латинского алфавита от а до z и от А до Z, а также знак подчеркивания “_”. В языке нет различия между заглавными и строчными буквами алфавита, если только они не входят в символьные и строковые выражения.

Цифры - арабские цифры от 0 до 9.

Каждая шестнадцатеричная цифра имеет значение от 0 до 15. Первые 10 значений обозначаются арабскими цифрами 0 ... 9, остальные шесть - латинскими буквами а ... f или А ... F.

Специальные символы Object Pascal - это символы

+ - * / = , ' . : ; < > [ ] ( ) { } ^ @ $ #

К специальным символам относятся также следующие пары символов: < > , < = , > = , : = , ( * , * ) , ( . , . ) , / / .

В программе эти пары символов нельзя разделять пробелами, если они используются как знаки операций отношения или ограничители комментария. Символы (. и .) могут употребляться соответственно вместо [ и ].

Особое место в алфавите языка занимают пробелы, к которым относятся любые символы в диапазоне кодов от 0 до 32. Эти символы рассматриваются как ограничители идентификаторов, констант, чисел, зарезервированных слов. Несколько следующих друг за другом пробелов считаются одним пробелом (последнее не относится к строковым константам).

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

Стандартные директивы первоначально связаны с некоторыми стандартными объявлениями в программе. Как и зарезервированные слова, стандартные директивы в окне кода Delphi выделяются жирным шрифтом, тем не менее можно переопределить любую стандартную директиву, т. е. объявить одноименный идентификатор. Слова private, protected, public, published и automated

считаются зарезервированными внутри объявления класса и стандартными директивами – вне объявления.

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

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

Типы - это специальные конструкции языка, которые рассматриваются компилятором как образцы для создания других элементов программы, таких как переменные, константы и функции. Любой тип определяет две важные для компилятора вещи: объем памяти, выделяемый для размещения элемента (константы, переменной или результата, возвращаемого функцией), и набор допустимых действий, которые программист может совершать над элементами данного типа. Замечу, что любой определяемый программистом идентификатор должен быть описан в разделе описаний (перед началом исполняемых операторов). Это означает, что компилятор должен знать тот тип (образец), по которому создается определяемый идентификатором элемент.