Лекция "Структура модуля в delphi "
Оценка 4.6

Лекция "Структура модуля в delphi "

Оценка 4.6
Лекции
docx
информатика
Взрослым
15.03.2017
Лекция "Структура модуля в delphi "
Модули - это программные единицы, предназначенные для размещений фрагментов программ. С помощью содержащегося в них программного кода реализуется вся поведенческая сторона программы. Любой модуль имеет следующую структуру [Более точное описание структуры модуля приводится в п. 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 "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "

Лекция "Структура модуля в delphi "
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
15.03.2017