- •Задание.............................................................................................................................9
- •Задание............................................................................................................................11
- •2. Тема: Объектно-ориентированное программирование. Разработка класса – наследника стандартного класса Delphi
- •2.1 Задание
- •2.2 Описание одного из стандартных классов Delphi tCheckBox
- •2.3 Текст программы
- •3.3 Таблицы каскадных стилей
- •3.4 Программа работы с xml - документом
- •4. Тема: Объектно-ориентированное программирование. Разработка базового и производных классов. Обработка исключительных ситуаций. Запись экземпляров классов в документ xml
- •4.1 Задание
- •4.2 Описание иерархии и содержимого классов
- •4.3 Текст программы
- •4.4 Пример работы программы
- •4.5 Исходный файл и файл результатов
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. |