- •Иерархия компонентов.
- •Собственники компонентов
- •Элементы управления.
- •Компоненты (tComponent)
- •Оконные не оконные
- •Родительские и дочерние компоненты.
- •Объектно-событийное программирование. События
- •Реакции на события
- •Программирование реакции на событие
- •Особенности реализации событий
- •Делегирование событий
- •Виды событий
- •Диалоги. Работа с файлами. Открытие и закрытие файлов с использованием стандартных диалоговых окон.
- •TOpenDialog и tSaveDialog – диалоги открытия и сохранения файлов (страница dialogs )
- •Создание и использование форм, их разновидности.
- •Шаблоны форм
- •Программы со многими формами
- •Модульный принцип построения программ.
- •Основные типы файлов проекта.
- •Структура головного файла проекта.
Программы со многими формами
Сложные программы требуют создания множества форм, каждая из которых решает ту или иную задачу. Для лучшей ориентации в назначениях разных форм существенную помощь может оказать файл проекта, в котором рядом с описанием включенного в проект модуля (формы) содержится строка комментария. В ней указано имя файла формы. Этот комментарий появляется в диалоговом окне при выборе опции 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');