Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Иерархия компонентов.doc
Скачиваний:
8
Добавлен:
29.08.2019
Размер:
400.9 Кб
Скачать

Программы со многими формами

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

Модульный принцип построения программ.

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

Основные типы файлов проекта.

Если при сохранении простейшего приложения согласиться с предложенными средой именами файлов, то в папке проекта можно будет найти 6 файлов:

  • Unit1.pas

  • Unit1.dfm

  • Project1.res

  • Project1.dpr

  • Project1.cfg

  • Project1.dof

В файле Project1.dpr сохранен код проекта Delphi. В файле Unit1.pas описан класс формы TForm1, и как переменная этого класса определена форма Form1. Дополнительная информация о параметрах формы хранится в файле формы Unit1.dfm.

Файл формы Unit1.dfm имеет вид:

Оbject Form1: TForm1

Left = 300

Top = 240

Width = 870

Height = 640

Caption = 'Form1'

···

···

End.

В файлах Project1.res, Project1.cfg, Project1.dof содержится служебная информация о ресурсах проекта.

Структура головного файла проекта.

Во время проектирования файл проекта Project1.dpr не видно. Чтобы его увидеть нужно выполнить команду Project | View Source, тогда мы увидим его код:

Program Project1;

Uses Forms,

Unit in ‘Unit1.pas’ {Form1};

{$R*.RES}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Первый оператор инициализирует приложение,

Второй – создает объект формы Form1,

Третий – начинает выполнение приложения.

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

Application.Initialize;

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

Метод CreatеForm объекта Application создает и показывает на экране окно главной формы, а метод Run реализует бесконечный цикл получения и обработки поступающих от Windows сообщений о действиях пользователя. Когда пользователь щелкнет по кнопке Close, Windows передаст программе специальное сообщение, которое, в конечном счете, заставит программу прекратить работу и освободить назначенные ей системные ресурсы (память и процессор).

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

ЗАДАЧА С ИСПОЛЬЗОВАНИЕМ ПОЛИМОРФИЗМА

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

Пусть определены 3 класса, один из которых является базовым для двух других:

Type

Tperson=class {базовый класс}

fname:string;

constructor Create(name:string);

function info:string; virtual;

end;

Tstud=class(Tperson) {класс– потомок}

fgr:integer; {поле для номера группы}

constructor Create(name:string;gr:integer);

function info:string; override;

end;

Tprof=class(Tperson) {класс– потомок}

fdep:string; ; {поле для названия кафедры}

constructor Create(name:string; dep:string);

function info:string; override;

end;

В каждом из этих классов определен метод info. В базовом классе при помощи директивы virtual метод info объявлен виртуальным. Это дает возможность классу–потомку произвести замену виртуального метода своим собственным. В каждом классе–потомке определен свой метод info, который замещает соответствующий метод родительского класса и отмечается директивой override.

Определим метод info для каждого класса индивидуально:

function Tperson.info:string;

begin

result:=’’;

end;

function Tstud.info:string;

begin

result:=fname+' gruppa '+inttostr(fgr);

end;

function Tprof.info:string;

begin

result:=fname+' department '+fdep;

end;

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

Список людей имеет вид:

list: array[1..szl] of Tperson; { szlразмер списка}

Объявить подобным образом список можно потому, что OP позволяет присвоить указателю на родительский класс значение указателя на класс– потомок. Поэтому элементами массива list могут быть как объекты класса Tstud, так и объекты класса Tprof.

Вывод списка можно осуществить применением метода info к элементам массива, например:

St:= ’’;

for i:=1 to szl do

if list[i]<>nil then

St:=St+list[i].info+#13;

ShowMessage('Spisok:'+#13+St); { вывод в окно сообщения}

Во время работы программы каждый элемент массива может содержать как объект типа Tstud, так и объект типа Tprof.

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

Напишем программу, которая использует объявления классов Tperson, Tstud, Tprof, формирует список студентов и преподавателей и выводит полученный список в окно сообщения. Будем использовать визуальное программирование.

Окно формы будет иметь вид:

GroupBox1—это компонент , объединяющий группу компонентов, связанных по смыслу. В данном случае он включает 2 зависимых переключателя – RadioButton1 и RadioButton2

Текст модуля кода программы:

unit Polimorfizm;

interface

uses

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

Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

Edit2: TEdit;

GroupBox1: TGroupBox;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type Tperson=class

fname:string;

constructor Create(name:string);

function info:string; virtual;

end;

Tstud=class(Tperson) {класс– потомок}

fgr:integer; {поле для номера группы}

constructor Create(name:string;gr:integer);

function info:string; override;

end;

Tprof=class(Tperson) {класс– потомок}

fdep:string; ; {поле для названия кафедры}

constructor Create(name:string; dep:string);

function info:string; override;

end;

Сonst szl=10;

Var

Form1: TForm1;

list:array[1..szl] of Tperson;

n:integer;

implementation {исполняемая часть}

{$R *.DFM}

constructor Tperson.Сreate(name:string); {описание конструктора}

begin

fname:=name;

end;

constructor Tstud.Create(name:string;gr:integer);

begin

inherited create(name);

fgr:=gr;

end;

constructor Tprof.Create(name:string;dep:string);

begin

inherited create(name);

fdep:=dep;

end;

function Tperson.info:string;

begin

result:=fname;

end;

function Tstud.info:string;

begin

result:=fname+' gruppa '+inttostr(fgr);

end;

function Tprof.info:string;

begin

result:=fname+' department '+fdep;

end;

procedure TForm1.Button1Click(Sender: TObject);

//процедура обработки нажатия на кнопку «Добавить»

begin

if n<szl

then

begin

if RadioButton1.Checked

then

list[n]:=Tstud.Create(Edit1.text, StrtoInt(Edit2.text))

else

list[n]:=Tprof.Create(Edit1.text, Edit2.text);

n:=n+1;

end

else

ShowMessage('Spisok zapolnen');

end;

procedure TForm1.Button2Click(Sender: TObject);

//процедура обработки нажатия на кнопку «Список»

Var i:integer;

St:string;

Begin

for i:=1 to szl do

if list[i]<>nil then

St:=St+list[i].info+#13;

// list[i].info вызовет тот метод info, которому соответствует элемент

ShowMessage('Spisok:'+#13+St);

end;

end.

Процедура TForm1.Button1Click, которая запускается нажатием кнопки «Добавить» создает объект list[n] класса либо Tstud, либо Tprof.

Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение Студент определяет класс Tstud, а в положение – Преподаватель определяет класс Tprof. Процедура TForm1.Button2Click, которая запускается нажатием кнопки Список (Button2) применяет метод info к каждому элементу массива list[i] как к объекту списка и формирует строку, представляющую весь итоговый список.

Виртуальность метода info обеспечивает применение к объекту именно того метода info, который соответствует типу объекта.

Отметим, что в данной программе результаты выводятся в окно сообщения процедурой ShowMessage. Например:

Showmessage('Spisok:'+#13+st);

Showmessage('spisok zapolnen');

32