Изучение работы генератора исходного кода Delphi
В данной статье мы попробуем сделать простое приложение с использованием среды delphi и проанализируем работу генератора исходного кода программ. Вячеслав Понамарев
🕛 24.03.2010, 12:17
delphi, по возможности, старается облегчить работу программиста. Когда вы запускаете среду, автоматически создается форма form1 и модуль unit1. Форма представляет собою стандартное окошко windows. Вы можете размещать на ней кнопки, картинки, надписи, видео- и аудио фрагменты, и многое иное. Весь нужный для создания заготовки формы код уже написан генератором исходного кода delphi.я
Рассмотрим текст, расположенный в окошке редактора текстов программ:
unit unit1; interface uses windows, messages, sysutils, classes, graphics, controls, forms, dialogs; type tform1 = class(tform) private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} end.
Рассмотрим все строки кода по порядку. I-я строка определяет имя модуля unit1. II-ая строка заявляет, что начинается интерфейсная часть модуля (interface). Эта часть содержит сведения о иных модулях, которые использует данный модуль (строка uses). Тут же описываются все типы, переменные, процедуры, функции и константы, используемые в данном модуле. В интерфейсной же части обязаны быть описаны все глобальные переменные, которые будут применяться другими модулями. Описание процедур и функций в данной части является неполным: записываются лишь заголовки функций и процедур. Однако размещение этих описаний в интерфейсной части является обязательным.
Посмотрим, что нам записал в интерфейсную часть генератор исходного кода delphi. Итак, тут определяется тип tform1 относящийся к классу форм delphi. Описание данного класса располагается в модуле forms, объявленном в строке uses. Дальше объявляется переменная form1, относящаяся к типу tform1. После подобного объявления мы можем в любом месте модуля unit1 ссылаться на переменную form1 и исполнять с ней любые возможные действия.
Дальше начинается раздел реализации - строка implementation. Непосредственно в этой части модуля располагаются полные описания функций и процедур. Тут же вы можете объявлять переменные, константы, и иные модули, которые применяются лишь внутри данного модуля и не видны за его пределами, т.е. все локальные переменные. Строка
{$r *.dfm}
записанная в разделе реализации модуля unit1 является директивой препроцессора. Директивы препроцессора - служебные команды для среды разработки. Все директивы препроцессора имеют вид: {$директива}. Встретив такую директиву, компилятор среды разработки сразу начинает исполнение каких-то действий. Перечень подобных директив не весьма огромной, и если у читателей возникнет желание выяснить о них, мы рассмотрим их в отдельной статье. Указанная выше директива ($r) предназначена для связывания ресурсов. Получается, для создания файла ресурсов формы form1, генератор исходного кода прибавил данную директиву, указывающую, что все свойства, касающиеся формы form1 (ширина, высота, положение, размер шрифта, заголовок и иные), связанной с модулем unit1 будут храниться в файле ресурсов unit1.dfm. Звездочка тут означает имя модуля. Не рекомендуется удалять или изменять содержимое директив препроцессора, которые генерируются средой delphi своими силами. Потому как это может привести к ошибкам компиляции приложения.
В нашем примере генератором исходного кода не было создано еще 2 возможных (однако не обязательных) раздела: инициализации (initialization) и завершения (finalization). В таких разделах возможно размещать операторы и команды, которые обязаны выполняться, соответственно, в начале и итоге работы приложения.
Ну и, конечно, любой модуль кончается строкой
end.
Сейчас попробуем сделать простое приложение, состоящее из 2-х форм, на любой из которых будет по одной кнопке. По какой причине из 2-х форм? Просто у начинающих программистов нередко появляется вопрос: как возможно вызвать из одной формы другую? Мы решим эту простенькую задачу и увидим, какие перемены будут вноситься в исходный код любого из модулей.
Итак, I-я форма у нас уже есть, добавим вторую. Для этого выберем пункт главного меню delphi Файл/Новая Форма (file/new form). delphi автоматически создаст новую форму с именем form2 и добавит новую закладку в окошке редактора кода: unit2. Разместим на форме form1 2 кнопки button1 и button2.
Для этого выберем на панели инструментов пиктограмму кнопки button, щелкнем на ней левой кнопкой мыши, а после щелкнем левой кнопкой мыши на том месте формы, куда мы желаем поместить кнопку. Готово? Сейчас в окошке инспектора объектов (object inspector) выберем свойство кнопки caption (заголовок) и напишем вместо button1 слово Переход. Надпись на кнопке немедленно изменится. Сейчас точно к тому же добавим вторую кнопку и назовем ее Выход. Посмотрим, какие перемены произошли в исходном коде модуля unit1:
unit unit1; interface uses windows, messages, sysutils, classes, graphics, controls, forms, dialogs, stdctrls; type tform1 = class(tform) button1: tbutton; button2: tbutton; private { private declarations } public { public declarations } end; var form1: tform1; implementation uses unit2; {$r *.dfm} end.В описание uses в интерфейсной части модуля добавился еще 1 модуль: stdctrls. Данный модуль необходим для работы с компонентом button (кнопка). К тому же, в описании типа tform1 возникли 2 строки, объявляющие 2 кнопки button1 и button2, относящихся к типу tbutton.
Сейчас добавим подобные же кнопки на форму form2. Осталось написать код для обработки события нажатия кнопок. Щелкните дважды по кнопке Переход на форме form1. Генератор исходного кода delphi создаст заготовку для обработчика события нажатия кнопки:
procedure tform1.button1click(sender: tobject);
begin
end;
Добавим м/у ключевыми словами begin и end следующие строки:
form1.hide; // "прячем" форму form1
form2.show; // показываем форму form2
Для кнопки Переход формы form2 напишем следующий код:
form2.hide; // "прячем" форму form2
form1.show; // показываем форму form1
Для кнопки Выход в обеих формах напишем следующий код:
procedure tform1.button2click(sender: tobject);
begin
application.terminate; // завершение работы приложения
end;
Осталось решить главную проблему - описать вызываемые формы в строках uses:
implementation
uses unit2;
{$r *.dfm}
для модуля unit1 и
implementation
uses unit1;
{$r *.dfm}
для модуля unit2.
Как видите, это делается в разделе реализации для любого модуля. Сейчас запустим наше приложение, для этого нажмем клавишу . Кнопка Переход дает возможность переключаться м/у формами, а кнопка Выход - завершить исполнение приложения.
Наше I-е приложение написано. На этом мы пока остановимся. В следующей статье мы рассмотрим часть стандартных компонентов delphi из палитры компонентов.