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

4. Тема: Объектно-ориентированное программирование. Разработка базового и производных классов. Обработка исключительных ситуаций. Запись экземпляров классов в документ xml

4.1 Задание

Необходимо разработать поля и методы базового класса и производных классов. Базовый класс может быть абстрактным. В каждом классе должно быть не менее двух конструкторов (первый задает пустые поля, второй — задает поля, определенные пользователем). Доступ к полям должен осуществляться только через методы. Предусмотреть наличие свойств. Предусмотреть использование спецификаторов доступа (public, private, protected) при описании классов. Предусмотреть проверку правильности задания исходных данных при создании экземпляра класса, используя обработку исключительных ситуаций. Разработать интерфейс, позволяющий выбирать соответствующий класс, просматривать его содержимое, заносить, изменять и удалять экземпляры этого класса. Предусмотреть хранение записей в файле и считывание из него (класс работы с файлом может быть организован отдельно и задан как базовый).

Первый базовый класс — учащийся. Производные классы — школьник, студент вуза.

4.2 Описание иерархии и содержимого классов

Схема классов приведена на рисунке 4.1

Рисунок 4.1. Иерархия классов

4.3 Текст программы

Текст модулей программы приведен в листингах 4.1, 4.2 и 4.3.

Листинг 4.1 unForm.pas

unit unForm;

interface

uses

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

Dialogs, unClass, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, ComCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

XMLDocument1: TXMLDocument;

Button2: TButton;

Button3: TButton;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Label7: TLabel;

Label8: TLabel;

Edit7: TEdit;

Edit8: TEdit;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure RadioButton2Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

Shkolnik1: TShkolnik;

Stud: TStudent;

const

xmlout='Uchenik.xml';

implementation

uses lsForm;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

if RadioButton2.Checked=true then

try

Shkolnik1 := TShkolnik.Create(Edit4.Text, Edit5.Text, Edit6.Text ,StrToDate(Edit1.Text), StrToDate(Edit2.text), Edit3.Text, Edit7.Text, (Edit8.Text));

finally

Shkolnik1.WriteXML(XMLDocument1);

Shkolnik1.free;

Button3.Enabled:=true;

end;

if RadioButton1.Checked=true then

try

Stud := TStudent.Create(Edit4.Text, Edit5.Text, Edit6.Text ,StrToDate(Edit1.Text), StrToDate(Edit2.text), Edit3.Text, Edit7.Text, (Edit8.Text));

finally

Stud.WriteXML(XMLDocument1);

Stud.free;

Button3.Enabled:=true;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Form2.Show;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

If XMLDocument1.DocumentElement.ChildNodes.Count<>0 then Button3.Enabled:=true;

end;

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

Label7.Caption:='Специальность';

Label8.Caption:='Номер зачетки';

end;

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

Label7.Caption:='Класс';

Label8.Caption:='Класрук';

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

if RadioButton2.Checked=true then

try

Shkolnik1 := TShkolnik.CreateDefault();

finally

Shkolnik1.WriteXML(XMLDocument1);

Shkolnik1.free;

Button3.Enabled:=true;

end;

if RadioButton1.Checked=true then

try

Stud := TStudent.CreateDefault();

finally

Stud.WriteXML(XMLDocument1);

Stud.free;

Button3.Enabled:=true;

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

var i:integer;

begin

for i:=0 to XMLDocument1.DocumentElement.ChildNodes.Count-1 do

XMLDocument1.DocumentElement.ChildNodes.Delete('uchen');

XMLDocument1.SaveToFile(XMLDocument1.FileName);

Button3.Enabled:=false;

end;

end.}

Листинг 4.2 unClass.pas

unit unClass;

interface

uses Controls, SysUtils, xmldom, XMLIntf, msxmldom, XMLDoc, ComCtrls;

Type

TUchenik = class (TObject)

protected

DR : TDate;

DP : TDate;

NUZ : string;

public

Fam, Im, Otch: String;

constructor Create ( aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string);

constructor CreateDefault;

function HowOld: Word;

end;

TShkolnik = class (TUchenik)

public

prop1,prop2: string;

constructor Create (aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string; aprop1,aprop2:string);

constructor CreateDefault();

procedure WriteXML(XMLD: TXMLDocument);

procedure EditXML(n:integer; XMLD: TXMLDocument);

procedure DelXML(n:integer; XMLD:TXMLDocument) ;

end;

TStudent = class (TUchenik)

public

prop1,prop2: string;

constructor Create (aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string; aprop1,aprop2:string);

constructor CreateDefault();

procedure WriteXML(XMLD: TXMLDocument);

procedure EditXML(n:integer; XMLD: TXMLDocument);

procedure DelXML(n:integer; XMLD:TXMLDocument) ;

end;

implementation

constructor TUchenik.Create (aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string);

begin

Inherited Create;

Fam:=aFam;

Im:=aIm;

Otch:=aOtch;

DR := aDR;

DP := aDP;

NUZ := aNUZ;

end;

constructor TShkolnik.Create (aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string; aprop1,aprop2:string);

begin

Fam:=aFam;

Im:=aIm;

Otch:=aOtch;

DR := aDR;

DP := aDP;

NUZ := aNUZ;

prop1:=aprop1;

prop2:=aprop2;

end;

constructor TUchenik.CreateDefault;

begin

Inherited Create;

Fam:='';

Im:='';

Otch:='';

DR := StrToDate('01.01.1990');

DP := StrToDate('01.09.1997');

NUZ := '';

end;

function TUchenik.HowOld: Word;

var

ynow,ydr,m,c:word;

begin

DecodeDate (Now, ynow,m,c);

DecodeDate(DR, ydr,m,c);

result := ynow - ydr;

end;

procedure TShkolnik.WriteXML(XMLD: TXMLDocument);

var

Node : IXMLNode;

begin

XMLD.DocumentElement.AddChild('uchen',XMLD.DocumentElement.ChildNodes.Count);

Node:=XMLD.DocumentElement.ChildNodes[((XMLD.DocumentElement.ChildNodes.Count)-1)];

Node.ChildNodes['fam'].Text:=fam;

Node.ChildNodes['im'].Text:=im;

Node.ChildNodes['otch'].Text:=otch;

Node.ChildNodes['DR'].Text:=DateToSTR(DR);

Node.ChildNodes['DP'].Text:=DateToStr(DP);

Node.ChildNodes['NUZ'].Text:=NUZ;

Node.ChildNodes['prop1'].Text:=prop1;

Node.ChildNodes['prop2'].Text:=prop2;

Node.Attributes['type']:='shkolnik';

XMLD.SaveToFile(XMLD.FileName);

end;

procedure TShkolnik.EditXML(n:integer; XMLD: TXMLDocument);

var

Node : IXMLNode;

begin

Node:=XMLD.DocumentElement.ChildNodes[n];

Node.ChildNodes['fam'].Text:=fam;

Node.ChildNodes['im'].Text:=im;

Node.ChildNodes['otch'].Text:=otch;

Node.ChildNodes['DR'].Text:=DateToSTR(DR);

Node.ChildNodes['DP'].Text:=DateToStr(DP);

Node.ChildNodes['NUZ'].Text:=NUZ;

Node.ChildNodes['prop1'].Text:=prop1;

Node.ChildNodes['prop2'].Text:=prop2;

Node.Attributes['type']:='shkolnik';

XMLD.SaveToFile(XMLD.FileName);

end;

procedure TShkolnik.DelXML(n:integer; XMLD:TXMLDocument);

begin

XMLD.DocumentElement.ChildNodes.Delete(n);

XMLD.SaveToFile(XMLD.FileName);

end;

constructor TShkolnik.CreateDefault();

begin

end;

procedure TStudent.WriteXML(XMLD: TXMLDocument);

var

Node : IXMLNode;

begin

XMLD.DocumentElement.AddChild('uchen',XMLD.DocumentElement.ChildNodes.Count);

Node:=XMLD.DocumentElement.ChildNodes[((XMLD.DocumentElement.ChildNodes.Count)-1)];

Node.ChildNodes['fam'].Text:=fam;

Node.ChildNodes['im'].Text:=im;

Node.ChildNodes['otch'].Text:=otch;

Node.ChildNodes['DR'].Text:=DateToSTR(DR);

Node.ChildNodes['DP'].Text:=DateToStr(DP);

Node.ChildNodes['NUZ'].Text:=NUZ;

Node.ChildNodes['prop1'].Text:=prop1;

Node.ChildNodes['prop2'].Text:=prop2;

Node.Attributes['type']:='student';

XMLD.SaveToFile(XMLD.FileName);

end;

procedure TStudent.EditXML(n:integer; XMLD: TXMLDocument);

var

Node : IXMLNode;

begin

Node:=XMLD.DocumentElement.ChildNodes[n];

Node.ChildNodes['fam'].Text:=fam;

Node.ChildNodes['im'].Text:=im;

Node.ChildNodes['otch'].Text:=otch;

Node.ChildNodes['DR'].Text:=DateToSTR(DR);

Node.ChildNodes['DP'].Text:=DateToStr(DP);

Node.ChildNodes['NUZ'].Text:=NUZ;

Node.ChildNodes['prop1'].Text:=prop1;

Node.ChildNodes['prop2'].Text:=prop2;

Node.Attributes['type']:='student';

XMLD.SaveToFile(XMLD.FileName);

end;

procedure TStudent.DelXML(n:integer; XMLD:TXMLDocument);

begin

XMLD.DocumentElement.ChildNodes.Delete(n);

XMLD.SaveToFile(XMLD.FileName);

end;

constructor TStudent.CreateDefault();

begin

end;

constructor TStudent.Create (aFam, aIm, aOtch:String; aDR, aDP : TDate; aNUZ : string; aprop1,aprop2:string);

begin

Fam:=aFam;

Im:=aIm;

Otch:=aOtch;

DR := aDR;

DP := aDP;

NUZ := aNUZ;

prop1:=aprop1;

prop2:=aprop2;

end;

end.

Листинг 4.3 lsForm.pas

unit lsForm;

interface

uses

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

Dialogs, xmldom, XMLIntf, OleCtrls, SHDocVw, msxmldom, XMLDoc, Grids, StdCtrls, unClass, unForm;

type

TForm2 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Button5: TButton;

procedure XMLToStringGrid (n:integer; XMLDoc: TXMLDocument; StringGrid: TStringGrid);

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

public

end;

var

Form2: TForm2;

n:integer;

implementation

{$R *.dfm}

procedure TForm2.XMLToStringGrid (n:integer; XMLDoc: TXMLDocument; StringGrid: TStringGrid);

var

i:integer;

begin

for i := 0 to XMLDoc.DocumentElement.ChildNodes[n].ChildNodes.Count-1 do

StringGrid.Cells[1,i]:=XMLDoc.DocumentElement.ChildNodes[n].ChildNodes[i].Text;

if XMLDoc.DocumentElement.ChildNodes[n].Attributes['type']='shkolnik' then

begin

StringGrid.Cells[0,7]:='Кл. рук.';

StringGrid.Cells[0,6]:='Класс';

end

else

begin

StringGrid.Cells[0,7]:='Зачетка';

StringGrid.Cells[0,6]:='Специальность';

end;

end;

procedure TForm2.Button2Click(Sender: TObject);

begin

if n+1 > Form1.XMLDocument1.DocumentElement.ChildNodes.Count-1 then n:=0

else n:=n+1;

Label1.Caption:=IntToStr(n);

XMLToStringGrid(n,Form1.XMLDocument1, StringGrid1);

Label3.Caption:=Form1.XMLDocument1.DocumentElement.ChildNodes[n].Attributes['type'];

end;

procedure TForm2.Button1Click(Sender: TObject);

begin

if n-1 <0 then n:=Form1.XMLDocument1.DocumentElement.ChildNodes.Count-1

else n:=n-1;

Label1.Caption:=IntToStr(n);

XMLToStringGrid(n,Form1.XMLDocument1, StringGrid1);

Label3.Caption:=Form1.XMLDocument1.DocumentElement.ChildNodes[n].Attributes['type'];

end;

procedure TForm2.FormShow(Sender: TObject);

begin

StringGrid1.ColWidths[0]:=75;

StringGrid1.ColWidths[1]:=150;

StringGrid1.Cells[0,0]:='Фамилия';

StringGrid1.Cells[0,1]:='Имя';

StringGrid1.Cells[0,2]:='Отчество';

StringGrid1.Cells[0,3]:='Рождение';

StringGrid1.Cells[0,4]:='Поступление';

StringGrid1.Cells[0,5]:='Название';

StringGrid1.Cells[0,6]:='1';

StringGrid1.Cells[0,7]:='2';

n:=0;

Label1.Caption:=IntToStr(n);

Label3.Caption:=Form1.XMLDocument1.DocumentElement.ChildNodes[n].Attributes['type'];

XMLToStringGrid (n, Form1.XMLDocument1, StringGrid1);

end;

procedure TForm2.Button3Click(Sender: TObject);

var

Shk:Tshkolnik;

Stud:Tstudent;

begin

if Label3.Caption='shkolnik' then

try

Shk := TShkolnik.Create(StringGrid1.Cells[1,0],StringGrid1.Cells[1,1],StringGrid1.Cells[1,2],

StrToDate(StringGrid1.Cells[1,3]),StrToDate(StringGrid1.Cells[1,4]),StringGrid1.Cells[1,5],

StringGrid1.Cells[1,6],(StringGrid1.Cells[1,7]) );

finally

Shk.EditXML(n,Form1.XMLDocument1);

Shk.free;

end

else

try

Stud := TStudent.Create(StringGrid1.Cells[1,0],StringGrid1.Cells[1,1],

StringGrid1.Cells[1,2],StrToDate(StringGrid1.Cells[1,3]),StrToDate(StringGrid1.Cells[1,4]),

StringGrid1.Cells[1,5],StringGrid1.Cells[1,6],(StringGrid1.Cells[1,7]) );

finally

Stud.EditXML(n,Form1.XMLDocument1);

Stud.free;

end;

end;

procedure TForm2.Button4Click(Sender: TObject);

var

Shk:Tshkolnik;

begin

if Form1.XMLDocument1.DocumentElement.ChildNodes.Count=1 then

begin

ShowMessage('Не надо удалять всех! Оставьте хотя бы одного!');

Form2.Close;

end

else

try

Shk := TShkolnik.CreateDefault();

finally

Shk.DelXML(n,Form1.XMLDocument1);

Shk.free;

Button2.Click;

end;

end;

procedure TForm2.Button5Click(Sender: TObject);

var

Uch:TUchenik;

begin

Uch:=Tuchenik.Create(StringGrid1.Cells[1,0],StringGrid1.Cells[1,1],StringGrid1.Cells[1,2],

StrToDate(StringGrid1.Cells[1,3]),StrToDate(StringGrid1.Cells[1,4]), StringGrid1.Cells[1,5]);

ShowMessage('Возраст '+IntToStr(Uch.HowOld));

Uch.Free;

end;

end.