OBJECTS (516216), страница 5
Текст из файла (страница 5)
Constructor Init;
Procedure CreateOpen(fn:str80); {создание/открытие}
Function Found(fam:str80):boolean;virtual;{поиск любой}
Function Compare(fam:str80):boolean;virtual;{тип поиска}
end;
Implementation
Constructor TBase.Init;
Begin end;
Procedure TBase.CreateOpen;
Begin filename:=fn;
{$I-}
Assign(f,FileName);
Reset(f);
{$I+}
if IOResult<>0 then ReWrite(f)
End;
Procedure TBase.BWrite;
Begin Seek(f,filesize(f));
Write(f,fam,tel);
End;
Function TBase.Found;
Var k:boolean;
Begin Reset(f);
k:=true;
Found:=false;
While (not Eof(f)) and k do
begin
BRead(family,telefon);
if Compare(fam) then
begin Found:=true;
k:=false;
end;
end;
End;
Procedure TBase.BRead;
Begin Read(f,family,telefon);
End;
Function TBase.Compare;
Begin Compare:=true; end;
End.
При написании конкретной программы необходимо заменить методы-заглушки методами, осуществляющими необходимые действия. Это достигается при наследовании за счет объявления новых аспектов полиморфных виртуальных методов.
Пример 15. Программа «Записная книжка».
Program Memory;
Uses Menu, Base;
{ ************* Объекты-потомки стандартных *****}
Type TMainMenu=Object(TMenu) {основное меню}
may:boolean; {признак задания имени файла}
Procedure Enter;virtual;
end;
Type TOpenBase=Object(TInput) {ввод имени файла}
Function Error:boolean;virtual; {проверка имени файла}
end;
Type TAddMenu=Object(TForm) {форма для добавления записей}
Procedure Enter;virtual; {обработка ввода одной записи}
end;
Type TFindMenu=Object(TForm) {форма для поиска телефонов}
Procedure Input;virtual; {организовать ввод из одного окна}
Procedure Enter;virtual; {обработка поиска одной записи}
end;
Type TNotFound=Object(TMessage){сообщение "данные отсутствуют"}
Procedure Enter;virtual; {ожидание подтверждения}
end;
Type TMyBase=Object(TBase) {база данных}
Function Compare(fam:str80):boolean;virtual; {сравнение фамилий}
End;
{ ************Объявление переменных******************}
var a:TMainMenu; b:TAddMenu; c:TOpenBase;
d:TFindMenu;e:TMyBase; h:TNotFound;
{ *********** Дополнительные методы *****************}
Procedure TMainMenu.Enter;
Begin
case npos of
1:begin
c.draw; {нарисовать окно ввода}
c.input; {организовать ввод имени файла}
e.createopen(c.inp.text); {создать или открыть файл}
a.show; {показать главное меню}
a.may:=true; { признак задания имени файла }
end;
2:if may then { если определен файл данных }
begin
b.show; {показать форму}
b.Run; {организовать работу с локальным меню}
a.show; {показать главное меню}
end;
3:if may then { если определен файл данных }
begin
d.show; {показать форму}
d.Run; {организовать работу с локальным меню}
a.show; {показать главное меню}
end;
end;
end;
Function TOpenBase.Error;
var l:integer;
begin l:=length(Inp.Text);
if (l>0) and (l<=8) then Error:=false
else Error:=true;
end;
Procedure TAddMenu.Enter;
Begin Case npos of
1:begin
masalt[1].setattr(113); {убрать выделение пункта меню}
input; {ввести фамилию и телефон}
e.BWrite(masinp[1].inp.text,masinp[2].inp.text);{записать}
masalt[1].setattr(71); {выделить пункт меню}
end;
2:
end;
end;
Procedure TFindMenu.input;
Begin masinp[1].Input; end;
Procedure TNotFound.Enter;
Begin d.Show; end;
Procedure TFindMenu.Enter;
Var i:integer;
Begin Case npos of
1:begin
masalt[1].Setattr(113);{убрать выделение пункта меню}
Input; {ввести фамилию}
if e.Found(masinp[1].inp.text) then
begin {показать в окне номер телефона}
masinp[2].inp.text:=e.telefon;
masinp[2].Draw;
end
else {сообщить об отсутствии данных}
begin
for i:=1 to 2 do masinp[i].inp.text:='';
h.Show; {вывести окно сообщения}
h.Run; {дождаться подтверждения}
end;
masalt[1].Setattr(71); {выделить пункт меню}
end;
2:
end;
end;
Function TMyBase.Compare;
Begin
if family=fam then Compare:=true
else Compare:=false;
end;
{ *****************Описание меню*********************}
const menu1:array[1..4] of TWin=
((x1:10;y1:14;x2:23;y2:18;attr:113;xt:3;yt:2;
text:'Создать или открыть книжку'),
(x1:26;y1:14;x2:39;y2:18;attr:113;xt:4;yt:2;
text:'Записать телефон'),
(x1:42;y1:14;x2:55;y2:18;attr:113;xt:5;yt:2;
text:'Найти телефон'),
(x1:58;y1:14;x2:71;y2:18;attr:113;xt:4;yt:2;
text:'Завершить работу'));
menu3:array[1..2] of TWin=
((x1:23;y1:18;x2:33;y2:21;attr:113;xt:2;yt:2;text:'Добавить'),
(x1:37;y1:18;x2:47;y2:21;attr:113;xt:2;yt:2;text:'Выход'));
menu4:array[1..2] of TWin=
((x1:23;y1:18;x2:33;y2:21;attr:113;xt:2;yt:2;text:'Найти'),
(x1:37;y1:18;x2:47;y2:21;attr:113;xt:2;yt:2;text:'Выход'));
input:array[1..2] of TInput=
((x1:22;y1:8;x2:32;y2:8;attr:94;xt:1;yt:1;text:'Фамилия';
Inp:(x1:34;y1:8;x2:46;y2:8;attr:112;xt:1;yt:1;text:'')),
(x1:22;y1:10;x2:32;y2:10;attr:94;xt:1;yt:1;text:'Телефон';
Inp:(x1:34;y1:10;x2:46;y2:10;attr:112;xt:1;yt:1;text:'')));
Begin
a.init(5,5,76,20,30,5,3,'Записная книжка',4,menu1);
b.init(20,2,50,22,94,5,3,'Добавление записей',2,menu3,2,input);
c.init(30,8,50,19,94,3,3,'Введите имя файла',
35,12,45,12,112,1,1,' ');
d.init(20,2,50,22,94,5,3,'Поиск записей',2,menu4,2,input);
e.init;
h.init(25,6,45,14,36,6,2,'Нет данных',
32,11,38,12,71,2,1,'Ok');
a.may:=false;
a.show;
a.Run;
end.
2.3. Использование объектов при создании движущихся изображений.
При создании движущихся изображений хотелось бы использовать единую процедуру программирования движения для различных изображений. Следовательно, необходимо создать абстрактный объект и для него определить универсальную процедуру движения. От абстрактного объекта будем определять объекты-потомки, каждый из которых будет содержать свои поля параметров, свою процедуру вывода изображения на экран и свою процедуру определения характера движения. (В приведенной ниже программе характер движения объектов одинаков, поэтому они используют родительскую программу пересчета параметров.)
Рис. 2.8. Иерархия классов для программы создания движущихся изображений.
Пример 16. Программа создания движущихся изображений.
{Вращение линии и квадрата вокруг их геометрических центров и движение окружности по окружности}
Program ex;
Uses crt,graph;
Type
Figure=Object
x,y, {координаты центра}
halflen, {радиус вращения}
dx,dy:integer; {проекции радиуса вращения}
constructor Init(ax,ay,ah:integer);
procedure Move(t:real); {организация движения}
procedure Draw;virtual; {рисование объекта}
procedure Rel(t:real);virtual; {определение смещения}
end;
Line=Object(Figure) {линия}
constructor Init(ax,ay,ah:integer);
procedure Draw;virtual;
end;
Square=Object(Figure)
constructor Init(ax,ay,ah:integer); {квадрат}
procedure Draw;virtual;
end;
Circle=object(Figure) {окружность}
r:integer;
constructor Init(ax,ay,ah,ar:integer);
procedure DRAW;virtual;
end;
Constructor Figure.Init;
Begin
x:=ax; y:=ay; halflen:=ah;
End;
Procedure Figure.Draw;
Begin End;
Procedure Figure.Rel;
Begin
dx:=round(halflen*cos(t));
dy:=round(halflen*sin(t));
End;
Procedure Figure.Move;
Var color:word;
Begin
color:=Getcolor; {запоминаем цвет}
SetColor(GetBkColor); {рисование цветом фона}
Draw; {стираем фигуру - рисуем цветом фона}
SetColor(color); {возвращаем цвет}
Rel(t); {пересчитываем значения dx и dy}
Draw; {рисуем на новом месте}
End;
Constructor Line.Init;
Begin
Figure.Init(ax,ay,ah);
End;
Procedure Line.Draw;
Begin
graph.Line(x+dx,y+dy,x-dx,y-dy);
End;
Constructor Square.Init;
Begin
Figure.Init(ax,ay,ah);
End;
Procedure Square.Draw;
Begin
graph.line(x+dx,y+dy,x-dy,y+dx);
graph.line(x-dy,y+dx,x-dx,y-dy);
graph.line(x-dx,y-dy,x+dy,y-dx);
graph.line(x+dy,y-dx,x+dx,y+dy);
End;
Constructor Circle.Init;
Begin
Figure.Init(ax,ay,ah);
r:=ar;
End;
Procedure Circle.Draw;
Begin
graph.Circle(x+dx,y+dy,r);
End;
Var driver,mode:integer;
t:real;
L:Line;
S:Square;
C:Circle;
Begin
driver:=detect;
InitGraph(driver,mode,'');
t:=0;
L.Init(160,250,75);
S.Init(320,250,75);
C.Init(480,250,75,10);
repeat
L.Move(t);
S.Move(-2*t);
C.Move(1.5*t);
delay(50);
t:=t+0.05;
until keypressed or (t>10000);
Closegraph;
end.
Литература
-
Фаронов В.В. Турбо Паскаль (в 3-х книгах). Книга 1. Основы Турбо Паскаля. - М.: «МВТУ - ФЕСТО ДИДАКТИК», 1992.-304 с., ил.
Содержание
Аннотация........................................................................................................................................2
Введение............................................................................................................................................3
1. Средства объектно-ориентированного программирования.
1.1 . Определение объекта. Компоненты: поля и методы.
1.2 . Определение экземпляров объектов. Операция присваивания над объектами. Обращение к компонентам объекта из программы и методов. Неявный параметр Self.
1.3 . Инициализация полей объектов.
1.4 . Наследование.
1.5 . Полиморфизм.
1.6 . Раннее и позднее связывание. Виртуальные методы. Конструкторы. Определение типа объекта.
1.7 . Динамические объекты. Деструкторы.
1.8 . Ограничение доступа к полям и методам объектов.
2. Использование технологии ООП.
2.1 . Использование объектов при создании новых структур данных.
2.2 . Использование объектов при создании меню.
2.3 . Использование объектов при создании движущихся изображений.
Литература................................................................................................................................... 27
Список примеров.