Модули - это программные единицы, предназначенные для размещений фрагментов программ. С помощью содержащегося в них программного кода реализуется вся поведенческая сторона программы. Любой модуль имеет следующую структуру [Более точное описание структуры модуля приводится в п. 12.1.]: заголовок секция интерфейсных объявлений секция реализации терминатор Заголовок открывается зарезервированным словом Unit за которым следует имя модуля и точка с запятой. Секция интерфейсных объявлений открывается зарезервированным словом Interface, a секция реализации - словом implementation. Терминатором модуля, как и терминатором программы, является end с точкой. Следующий фрагмент программы является синтаксически правильным вариантом модуля:
тема 2 вопрос 28.docx
структура модуля в delphi назначение секций private protected public published
тема 2 вопрос 28
Модули это программные единицы, предназначенные для размещений фрагментов
программ. С помощью содержащегося в них программного кода реализуется вся
поведенческая сторона программы. Любой модуль имеет следующую структуру [Более
точное описание структуры модуля приводится в п. 12.1.]: заголовок секция
интерфейсных объявлений секция реализации терминатор Заголовок открывается
зарезервированным словом Unit за которым следует имя модуля и точка с запятой. Секция
интерфейсных объявлений открывается зарезервированным словом Interface, a секция
реализации словом implementation. Терминатором модуля, как и терминатором
программы, является end с точкой. Следующий фрагмент программы является
синтаксически правильным вариантом модуля:
unit Unit1;
interface
// Секция интерфейсных объявлений
implementation
// Секция реализации
end.
В секции интерфейсных объявлений описываются программные элементы (типы, классы,
процедуры и функции), которые будут “видны” другим программным модулям, а в секции
реализации раскрывается механизм работы этих элементов. Разделение модуля на две
секции обеспечивает удобный механизм обмена алгоритмами между отдельными частями
одной программы. Он также реализует средство обмена программными разработками
между отдельными программистами. Получив откомпилированный “посторонний” модуль,
программист получает доступ только к его интерфейсной части, в которой, как уже
говорилось, содержатся объявления элементов. Детали реализации объявленных процедур,
функций, классов скрыты в секции реализации и недоступны другим модулям.
Щелкните по закладке Unit1 окна кода, и вы увидите такой текст:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TfmExample = class(TForm)
Panel1: TPanel;
bbRun: TBitBtn;
bbClose: TBitBtn;
edinput: TEdit;
IbOutput: TLabel;
mmOutput: TMemo;
private
{ Private declarations } public
{ Public declarations } end;
var
fmExample: TfmExample;
implementation
$R *.DFM}
end. Весь этот текст сформирован Delphi, но в отличие от файла проекта программист может
его изменять, придавая программе нужную функциональность. В интерфейсной секции
описан один тип (класс fmExample) и один объект (переменная fmExample).
Вот описание класса:
type
TfmExample = class(TForm)
Panell: TPanel;
bbRun: TBitBtn;
bbClose: TBitBtn;
edinput: TEdit;
IbOutput: TLabel;
mmOutput: TMemo;
private
{ Private declarations } public
{ Public declarations } end;
Как мы увидим дальше, классы служат основным инструментом реализации мощных
возможностей Delphi. Класс является образцом, по которому создаются объекты, и
наоборот, объект это экземпляр реализации класса. Образцы для создания элементов
программы в Object Pascal называются типами, таким образом, класс TfmExamplel это
тип. Перед его объявлением стоит зарезервированное слово type (тип), извещающее
компилятор о начале раздела описания типов.
Стандартный класс TForm реализует все нужное для создания и функционирования
пустого Windowsокна. Класс TfmExamplel порожден от этого класса, о чем
свидетельствует строка
TfmExample = class(TForm)
в которой за зарезервированным словом class в скобках указывается имя родительского
класса. Термин “порожден” означает, что класс TfmExample унаследовал все возможности
родительского класса TForm и добавил к ним собственные в виде дополнительных
компонентов, которые, как вы помните, мы вставили в форму fmExample. Перечень
вставленных нами компонентов и составляет значительную часть описания класса.
Свойство наследования классамипотомками всех свойств родительского класса и
обогащения их новыми возможностями является одним из фундаментальных принципов
объектноориентированного программирования. От наследника может быть порожден
новый наследник, который внесет свою лепту в виде дополнительных программных
заготовок и т. д. В результате создается ветвящаяся иерархия классов, на вершине которой
располагается самый простой класс TObject (все остальные классы в Delphi порождены от
этого единственного прародителя), а на самой нижней ступени иерархии мощные классы
потомки, которым по плечу решение любых проблем.
Объект fmExampie формально относится к элементам программы, которые называются
переменными. Вот почему перед объявлением объекта стоит зарезервированное слово var
(от англ. variables переменные).
Текст модуля доступен как Delphi ,так и программисту. Delphi автоматически
вставляет в текст модуля описание любого добавленного к? форме компонента, а
также создает заготовки для обработчиков событии; программист может
добавлять свои методы в ранее объявлённые классыйнаполвять обработчики событий
конкретным .содержа,нием, вставлять собственные переменные, типы, константы и
т. д. Совместное с Delphi владение текстом модуля будет вполне успешным, если
программист будет соблюдать простое правило , он не должен удалять или изменять
строки которые вставлены не им, а Delphi.
Модули в Delphi
Разработав некоторую функцию, программист может использовать ее в другой программе,
поместив текст этой функции в раздел implementation. Однако этот способ неудобен, т. к. приходится набирать текст функции зановоили копировать его из текста другой
программы.
Создание модуля
Delphi позволяет программисту поместить свои функции и процедуры в отдельный модуль,
а затем использовать процедуры и функции модуля в своих программах, указав имя модуля
в списке модулей, необходимых программе (инструкция uses).
Чтобы приступить к созданию модуля, нужно сначала закрыть окно формы и окно модуля
формы (в ответ на вопрос о необходимости сохранения модуля следует выбрать No, т. е.
модуль, соответствующий закрытой форме, сохранять не надо). Затем из меню File нужно
выбрать команду New | Unit. В результате открывается окно редактора кода, в котором
находится сформированный Delphi шаблон модуля. Его текст приведен в листинге 6.7.
Листинг 6.7. Шаблон модуля
1.unit Unitl;
2.interface
3.implementation
4.end.
Начинается модуль заголовком — инструкцией unit, в которой указано имя модуля. Во
время сохранения модуля это имя будет автоматически заменено на имя, указанное
программистом.
Слово interface отмечает раздел интерфейса модуля. В этот раздел программист должен
поместить объявления находящихся в модуле процедур и функций, которые могут быть
вызваны из других модулей, использующих данный.
В раздел implementation (реализация) нужно поместить процедуры и функции, объявленные
в разделе interface. В качестве примера в листинге 6.8 приведен модуль программиста,
который содержит рассмотренные ранее функции isint и IsFloat.
Листинг 6.8. Модуль программиста
01.unit myjunit;
02.interface // объявления процедур и функции,
03.// доступных программам,
04.// использующим этот модуль
05.function Islnt(ch : char) : Boolean;
06.// функция Islnt проверяет, является ли символ
07.// допустимым во время ввода целого числа
08.function IsFloat(ch : char; st: string) : Boolean;
09.// Функция IsFloat проверяет, является ли символ допустимым
10.// во время ввода дробного числа
11.// ей — очередной символ
12.// st — уже введенные символы
13.implementation // реализация
14.// проверяет, является ли символ допустимым
15.
16.// во время ввода целого числа
17.function Islnt(ch : char] : Boolean;
18.begin
19.if [ch >= ' 0 ' ) and (ch <= ' 9 ' ] // цифры
20.or (ch = #13) // клавиша
21.or (ch = #8) // клавиша
22.then Islnt := True // символ допустим
23.else Islnt := False; // недопустимый символ
24.end; // проверяет, является ли символ допустимым
25.
26.// во время ввода дробного числа 27.function IsFloat (ch : char; st . string) : Boolean;
28.// ch — очередной символ
29.// at — уже введенные символы
30.begin
31.if (ch >= '0') and (ch <= ' 9 ' ) // цифры
32.or (ch = #13) // клавиша
33.or (ch = #8) // клавиша
34.then
35.begin
36.IsFloat := True; // символ верный
37.Exit; // выход из функции
38.end;
39.case ch of
40.'': if Length(st) = 0 then IsFloat : True;
41.',': if (Pos(',',st) = 0)
42.and (stfLength(st)] >= ' 0 ' )
43.and (st[Length(st)] <= ' 9 ' )
44.then // разделитель можно ввести только после цифры
45.// и если он еще не введен
46.IsFloat := True;
47.else // остальные символы запрещены
48.IsFloat := False;
49.end;
50.// это раздел инициализации
51.// он а данном случае не содержит инструкция
52.end.
Сохраняется модуль обычным образом, т. е. выбором из меню File команды Save, Вместе с
тем, для модулей повторно используемых процедур и функций лучше создать отдельную
папку, нажав ее, например, Units.
Использование модуля
Для того чтобы в программе могли применяться функции и процедуры модуля,
программист должен добавить этот модуль к проекту и указать имя модуля в списке
используемых модулей (обычно имя модуля программиста помещают в конец
сформированного Delphi списка используемых модулей).
В листинге 6.9 приведен вариант программы Поездка на дачу. Процедура обработки
события onkeypress в полях ввода исходных данных обращается к функции IsFloat, которая
находится в модуле my_unit.pas, поэтому в списке используемых модулей указано имя
модуля my_unit.
Листинг 6.9. Использование функции из модуля программиста
01.unit fazenda_;
02.interface
03.uses
04.Windows, Messages, SysOtils, Variants, Classes, Graphics, Controls,
05.Forms, Dialogs, StdCtrls,
06.my_unit; // модуль программиста
07.type
08.TForml = class(TForm)
09.Editl: TEdit; // расстояние
10.Edit2: TEdit; // цена литра бензина
11.Edit3: TEdit; // потребление бензина на 100 км
12.CheckBoxl: TCheckBox; // True — поездка туда и обратно
13.Buttonl: TButton; // кнопка Вычислять 14.Label4: TLabel; // поле вывода результата расчета
15.Labell: TLabel;
16.Label2: TLabel;
17.Label3: TLabel;
18.procedure EditlKeyPress(Sender: TObject; var Key: Char];
19.procedure Edit2KeyPress(Sender: TObject; var Key: Char);
20.procedure Edit3KeyPress(Sender: TObject; var Key: Char);
21.procedure ButtonlClicklSender: TObject);
22.private
23.1 Private declarations )
24.public
25./ Public declarations }
26.end;
27.var
28.Forml: TForml;
29.implementation
30.1$R *.dfm}
31.// нажатие клавиши в поле Расстояние
32.procedure TForml.EditlKeyPress(Sender: TObject; var Key: Char);
33.begin
34.if Key = Char(VK_RETURN)
35.then Edit2.SetFocus // переместить курсор в поле Цена
36.else If not IsFloat(Key,Edit2.Text) then Key := Chr(O);
37.end;
38.
39.// нажатие клавиши в поле Цена
40.procedure TForml.Edit2KeyPress(Sender: TObject; var Key: Char);
41.begin
42.if Key = Char(VK_RETURN|
43.then Edit3.SetFocus // переместить курсор в поле Потребление
44.else If not IsFloat(Key,Edit2.Text) then Key := Chr(O);
45.end;
46.// нажатие клавиши в поле Потребление
47.procedure TForml.Edit3KeyPress(Sender: TObject; var Key: Char];
48.begin
49.if Key = Char(VK_RETURN)
50.then Buttonl.SetFocus // // сделать активной кнопку Вычислить
51.else If not IsFloat(Key,Edit2.Text) then Key := Chr(O);
52.end;
53.// щелчок на кнопке Вычислить
54.procedure TForml.ButtonlClicklSender: TObject);
55.var
56.rast : real; // расстояние
57.cena : real; // цена
58.potr : real; // потребление на 100 км
59.summ : real; // сумма
60.mes: string;
61.begin
62.rast := StrToFloat(Editl.Text);
63.eena := StrToFloat(Edit2.Text);
64.potr := StrToFloat(Edit3.Text);
65.summ := rast / 100 * potr * cena;
66.if CheckBoxl.Checked then
67.suiim ; = зшпт * 2 ; 68.mes := 'поездка на дачу1;
69.if CheckBoxl.Checked then
70.mes := mes + ' и обратно';
71.mes := mes + 'обойдется в ' + FloatToStrFfsumm,ffGeneral,4,2}
72.+ ' руб.';
73.Label4.Caption := mes;
74.end;
75.end.
После добавления имени модуля в список модулей, используемых приложением, сам
модуль нужно добавить в проект. Для этого из меню Project надо выбрать команду Add to
Project и в открывшемся диалоговом окне — имя файла модуля. В результате добавления
модуля к; проекту в окне редактора появится вкладка с текстом добавленного к проекту
модуля.
Увидеть структуру проекта можно в окне Project Manager, которое появляется в
результате выбора соответствующей команды из меню View.
После добавления модуля к проекту и включения его имени в список используемых
модулей (инструкция uses) можно выполнить компиляцию программы.
Любой вновь создаваемый класс может содержать секции (разделы), определяемые
зарезервированными словами published (опубликованные), private (закрытые), protected
(защищенные), public (доступные) и automated (автоматизированные). Внутри каждой
секции вначале определяются поля, а затем методы и свойства.
Секции определяют области видимости элементов описания класса. Секция public не
накладывает ограничений на область видимости перечисляемых в ней полей, методов и
свойств их можно вызывать в любом другом модуле программы. Секция published также
не ограничивает область видимости, однако в ней перечисляются свойства, которые
должны быть доступны не только на этапе исполнения, но и на этапе конструирования
программы (т. е. в окне Инспектора объектов). Секция published используется только при
разработке нестандартных компонентов. Замечу, что среда Delphi помещает описания
компонентов, вставленных в форму, в специальную секцию без названия, которая
располагается сразу за заголовком класса и продолжается до первой объявленной секции.
Эта секция published. Программисту не следует помещать в нее собственные элементы
описания класса или удалять из нее элементы, вставленные средой. Секция private сужает
область видимости до минимума: закрытые элементы описания доступны только внутри
методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс.
Элемент, объявленный в секции private, становится недоступным даже ближайшим
потомкам класса, если они размещаются в других модулях. Секция protected доступна
только методам самого класса, а также любым его потомкам, независимо от того,
находятся ли они в том же модуле или нет. Наконец, секция automated используется только
для объявления свойств и методов, которые будут добавлены к так называемому
интерфейсу OLEобъектов Автоматизации; область видимости членов этой секции не
ограничена.
В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок
следования секций не имеет значения. Любая секция может быть пустой.
Следующий фрагмент кода поясняет области видимости.
Unit Unit1;
Interface
Uses Controls, Forms;
type
TForm1 = class (TForm)
Button1: TButton; // Эта секция обслуживается Delphi // Ее элементы доступны всем
// Эта секция доступна в модуле Uniti
private
FIntField: Integers
Procedure SetValue(Value: Integers);
Function GetValue: Integer;
published
// Эта секция доступна в любом модуле
Property IntField: read GetValue write SetValue;
protected // Эта секция доступна классампотомкам
Procedure Proc1;
public // Эта секция доступна в любом модуле Procedure Proc2;
end;
var
Formi: TForm1;
Implementation Procedure TFormI.Proc1 ;
Buttoni.Color := clBtnFace;1
// Так можно
FIntField := 0;
// Так можно
IntField := 0;1
// Так можно Proc1;
// Так можно Proc2;1
// Так можно
end;
begin
Form1.Button1.Color := clBtnFace; // Так можно
Form1.FIntField := 0; // Так можно
Form1.IntField := 0; // Так можно
Form1.Proc1; // Так нельзя!
Form1.Proc2; // Так можно
end.
Unit Unit2;
Interface
Uses Controls, Unit1;
type
TForm2 = class(TFormI) Button2: TButton;
Procedure Button2Click(Sender: TObject);
end;
var
Form2: TForm2;
Implementation
Procedure TForm2.Button2Click(Sender: TObject);
begin
Buttoni.Color := clBtnFace; // Так можно
FIn'tField := 0; // Так нельзя!
IntField := 0; // Так можно
Proc1; // Так можно
Proc2; // Так можно
end;
begin
Form1.Buttoni.Color := clBtnFace; // Так можно Form1.FIntField := 0; // Так нельзя!
Form1.IntField := 0; // Так можно
Form1.Proc1; //Так нельзя!
Form1.Proc2; // Так можно
end.
При объявлении классапотомка разрешается перемещать элементы класса из одной
области видимости в другую. Для предыдущего примера допустимо такое объявление:
type
TForm2 = class(Tform1)
Public
Procedure Proc1;
end;
После этого в модуле unit2 возможно такое обращение:
Form2.Proc1;
После перемещения в секцию private элемент объявления становится невидим потомкам
(если потомок, как это обычно бывает, объявляется в другом модуле), и, следовательно,
его уже нельзя переместить в другую секцию.
Класс может объявляться только в интерфейсной области модуля или в самом начале
области реализации. Нельзя определять классы в разделе описаний подпрограмм.
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Лекция "Структура модуля в delphi "
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.