Әдістемелік нұсқаулардың
титулдық парағы
|
|
Нысан
ПМУ ҰС Н 7.18.3/40
|
Қазақстан Республикасының Білім және ғылым министрлігі
С. Торайғыров атындағы Павлодар мемлекеттік университеті
«Есептеу техникасы және бағдарламалау» кафедрасы
ӘДІСТЕМЕЛІК НҰСҚАУЛАР
Зертханалық сабақтарға арналған
«Объектті-бағытталған бағдарламау» пәні бойынша
050704 «Есептеу техника және бағдарламалық қамтамасыздандыру»
мамандығына арналған
Павлодар
Әдістемелік нұсқауларды
бекіту парағы
|
|
Нысан
ПМУ ҰС Н 7.18.3/41
|
БЕКІТЕМІН
Факультет деканы
__________Ж.К. Нурбекова
«__»______________201_ ж.
Құрастырғандар: аға оқытушы Исабеков Ж.Б. ______________
аға оқытушы Балгабаева Г.С. ______________
Есептеу техникасы және бағдарламалау кафедрасы
Зертханалық сабақтарға әдістемелік нұсқа
«Объектті-бағытталған бағдарламау» пәні бойынша
050704 – Есептеу техникасы және бағдарламалық қамтамасыздандыру»
білім беру мамандықтары студенттеріне арналған
Кафедраның отырысында қарастырылған
«__»_______________________201_ ж. №_____ хаттама
Кафедра меңгерушісі _____________________________ О.Г. Потапенко
Факультеттің әдістемелік кеңесінде құпталған
«___»___________20__ж. №______ хаттама
ӘК төрайымы _______________________________ Ж.Г. Муканова
Зертханалық жұмыс №1
Объекттердiң динамикалық iске асырылуы
Зертханалық жұмыстың мәні ОПАЯ курсында (2 семестр) құрастырылған, бағдарлама-калькуляторын модификациялау.
Тапсырма: Көрсетілген кейбір басқару элементтерін динамикалық іске асыру (нақты тапсырмаларды «Нұсқалар» бөлімінде қараңыздар):
сандарды енгізу-шығару терезесі (TEdit типті);
-
енгізу-шығару терезесін тазарту батырмасын (TButton немесе TbitBtn типті);
-
алдындағы символды өшіру терезесі (TButton немесе TbitBtn типті);
-
бағдарламадан шығу батырмасы (TBitBtn типті);
-
санның таңбасын (+/-) өзгертетін батырма (TButton, TSpeedButton немесе TbitBtn типті);
-
қателік туралы мәлімдеме дыбысын ауыстырып-қосқышын (TcheckBox типті);
-
кез-келген 2-к бинарлық операцияларды орындау батырмаларын (мысалы *, /, +, -, div, mod) (TBitBtn немесе TspeedButton типті);
-
кез-келген 2-к унарлық операцияларды орындау батырмаларын (мысалы квадрат түбір, sin, модуль және т.б.) (TBitBtn немесе TSpeedButton типті);
-
«Теңдік (=)» батырмасын (TBitBtn немесе TSpeedButton типті).
Теориялық негіздері. Объекттердiң динамикалық iске асырылуы ретінде оларды құрастыру мен орнату қасиеттерін визуалды жасау процесстерінде емес (компоненттер палитрасы мен «Object Inspector» терезесі көмегімен), бағдарламалы, қосымшаның жұмысы кезінде түсініледі.
Кейбір компонентті іске асыру үшін бірқатар әрекет орындау қажет. Оларды Form1:TForm пішініндегі TButton типті батырма мысалында қарастырайық.
Бастапқыда модульдің коды келесі түрде болады:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
1) MyButton аталатын статикалық жаңа батырманы сипаттаймыз. Батырма TForm1 классының мүшесі болу үшін және қолдануға жетімді болу үшін, сипаттама класс сипаттамасындағы public сөзінен кейін орналасуы қажет:
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
MyButton:TButton;
end;
2) Батырма құрылатын және оның негізгі қасиеттері орнатылатын, оқиға өңдеушісін жасаймыз. Form1 пішініндегі OnCreate сондай оқиға бола алады.
Құрылғаннан кейін өңдеуші келесі түрде болады:
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
3) MyButton:TButton батырмасын құрамыз;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyButton:=TButton.Create(MyButton);
end;
Create процедурасы TComponent классының ұрпақтарына, жасалатын объект «қожайыны» (owner) болатын параметр ретінде компонент атын қамтиды. Қожайынын жойып жіберген кезде, ол иелік ететін компонентте жойылады. Мысалы, үндемеу бойынша пішін онда орналасқан барлық компоненттерге иелік етеді.
MyButton:=TButton.Create(MyButton); жазуы біздің батырма басқа компоненттерден тәуелсіз екенін білдіреді.
4) MyButton батырмасының негізгі қасиеттерін орнатайық.
procedure TForm1.FormCreate(Sender: TObject);
begin
MyButton:=TButton.Create(MyButton);
MyButton.Left:=100;
MyButton.Top:=100;
MyButton.Caption:='OK';
MyButton.Parent:=Form1;
end;
Міндетті түрде анықталуы қажет Parent (ата-ана) қасиетіне назар аударыңыз. Визуалды компоненттер үшін ол батырма орналасатын контейнердің (TWinControl классының ұрпағы) атын білдіреді.
Ата-ананы (Parent) қожайынмен (Owner) шатыстырмаңыздар. Компонент өз ата-анасының құрамдас бөлігі болып табылады, ал қожайын тек қана компонентті жоюда ғана жауап береді.
Ж үктелгеннен кейін қосымша келесі түрде болады:
5) Осылайша құрылған батырма пішінде пайда болғанмен, шертулерге онымен оқиғалар өңдеушісі байланыспағанға дейін мән бермейді. Шерту үшін арналған оқиғалар өңдеушісін қолдан жасау қажет.
Класс сипаттамсына процедура тақырыпшасын қоямыз. Оның атын өзіміз таңдаймыз, бірақ ол Sender: TObject параметрін иелену міндетті. (Ескертпе: басқа оқиғалардың өңдеушісі басқа параметрлар жиынын қабылдау мүмкін. Мысалы, OnMouseMove оқиғалар өңдеушісі 3 параметрді қабылдай алады – Sender: TObject; Shift: TShiftState; X, Y: Integer).
Осыдан кейін класстың сипаттамасы осындай түрде болады: type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
MyButton:TButton;
procedure ForMyButton(Sender: TObject);
end;
implementation сөзінен кейін өңдеуші процедурасының орындалуын қосамыз. Төменде көрсетілген мысал бойынша батырмаға шерткен кезде мәлімдеме пайда болуы тиіс.
procedure TForm1.ForMyButton(Sender: TObject);
begin
ShowMessage('Hello!')
end;
Жасалған өңдеуші батырмамен байланысқан болу үшін, MyButton батырмасының OnClick қасиетіне жаңа процедурасының атын беру қажет.
procedure TForm1.FormCreate(Sender: TObject);
begin
MyButton:=TButton.Create(MyButton);
MyButton.Left:=100;
MyButton.Top:=100;
MyButton.Caption:='OK';
MyButton.Parent:=Form1;
MyButton.OnClick:=ForMyButton;
end;
Осылай, енді-гәрі батырманы басқаннаң кейін осындай хаттама терезі пайда болады:
Керек болған жағдайда басқа да оқиға өндеулері жасалуы керек, сонымен қатар жасалып жатқан компонентін өзге де сипатталарына атау қойылуы керек.
Ңұсқа
-
Тізім бойынша орын
|
Жасалатын тапсырма
|
1, 9, 17, 25
|
1, 2, 6
|
2, 10, 18, 26
|
1, 3, 7
|
3, 11, 19, 27
|
2, 4, 8
|
4, 12, 20, 28
|
2, 5, 9
|
5, 13, 21, 29
|
3, 6, 7
|
6, 14, 22, 30
|
3, 6, 8
|
7, 15, 23, 31
|
4, 5, 7
|
8, 16, 24, 32
|
1, 4, 8
|
Зертханалық жұмыс №2
TObject базасында жеке класс құру
Жұмыс нәтижесі: TAngle жеке класс құру – TObject классының мұрагері.
TAngle классы қолданушының жазық бұрыштарды визуалды түрде бейнелеуге арналған (градустарда)
Класстың дұрыс деген құрылымы келесі:Type TAngle=class
private
// Бұрыштың қазіргі шамасы
Value:integer;
// Сурет салу облысының сол жақ үстінгі нүктенің координаттары
XPos,YPos:integer;
// Сурет салынып жатқан холст
Can:TCanvas;
public
// TAngle классың құруға арналған көмекші
constructor Create(X,Y:integer; NewCanvas:TCanvas);
// Value шарттарың өзгерту процедурасы
procedure SetValue(NewValue:integer);
// Value шарттарың қайтаратын функция
function GetValue:integer;
// Value шарттың Increment-қа көбеитетің функция
function Plus (Increment:integer):integer;
// Value шарттың Increment-қа азайтатың функция
function Minus(Decrement:integer):integer;
// Казіргі бұрышты салу процедурасы
procedure Draw;
// TAngle классының мысалын құртатын деструктор
destructor Destroy; override;
end;
Дұрыс дейтін бағдарламаның сырт-бейнесі келесі:
Класстың сипаттамалары:
А. Value:integer қолданушы көрсеткен бұрыштың шамасың сақтауға арналған. ООП шарттары бойынша, қолданушының жол шамасын тікелей өзгертуі (мысалға A.Value:=125) бағдарламаудың жаман түрі болып саналады, Value-дің әдие әдіс арқылы өзгеруі тиіс, мысалға:
procedure SetValue(NewValue:integer);
Бұл әдіс керек: 1) Value-ге NewValue-дің шамасың атауы керек;2) Енгізіліп жатқан бұрыштарды өзгертуі керек, шамалары 360-таң үлкен (мысалға Value:=NewValue mod 360);
Б. Қолданушының көрсеткен бұрышы Draw процедурасы арқылы экранда көрсетілуі керек себепті, сурет салу облысының сол жақ үстінгі нүктенің координаттарын сақтау керек (қарапайым түрде) Координаттарды сақтау үшін мыңа айнымаларды қолдан: XPos,YPos:integer.
В. Сурет холста (TCanvas) және бас формада салына алады, немесе басқа компонентте, Canvas сипаттмасы бар (мысалға, TPaintBox, TImage). Керек холстың аты Can:TCanvas сипаттамасына берілуі керек.
Г. Сипаттамаларға басты шама берілуі құрушы-әдие процедурасының ішінде жүруі керек, класстардың түрін құратын және іске қосатын. Бұл бағдарламада Create құрушының іске асыу (Бұндай ат Delphi-дегі барлық құрушыларға тән) осындай түрде бола алады:
constructor TAngle.Create(X,Y:integer; NewCanvas:TCanvas);
begin
inherited Create;
XPos:=X;
YPos:=Y;
Value:=45;
Can:=NewCanvas;
end;
inherited Create жолына назар аударыңыз;
Кілті сөз inherited (“мұрагерленген”) одан кейін көрсетілінген процедурасы ата-классынаң алынады екенің білдіреді (біздің жағдайымызда TObject). Құрушы Create TObject классынаң маңызды істер тізімің атқарады, обьектінің дұрыс жұмысына керекті, ал бұл жолды ұмытқан жағдайда класстын дұрыс-емес жұмысына әкеледі.
Бұл бағдарламада құрушыны басты формана құру уақытында да оқиға өндеудең де, әдиі құрылған баспа арқылы, шақыруға болады.
Д. Plus функциясы(Increment:integer):integer; келесі түрге келуі мүмкін:
function TAngle.Plus (Increment:integer):integer;
begin
Value:= (Value + Increment) mod 360;
result:=Value;
end;
E. Draw процедурасы бұрыштарды бағдарлама-ңұскадағы сияқты салуы керек.
Салу холста Can : TCanvas жүруі керек. Бағдарлама-ңұскадағы салу облысының көлемі – 100х100 пиксель.
Боялған секторды салу үшін TCanvas классының әдісі Pie (“кесілген тоқаш”) қолданылады. Бағдарлама-ңұскада әдіс келесі тәсіл арқылы шақырылады:
Pie(XPos, YPos, XPos+100, YPos+100, XPos+50+round(50*cos(Value*pi/180)), YPos+50+round(50*sin(Value*pi/180)),XPos+100, YPos+51);
(Парметрлер щамаларының керегін ойлап көріндер).
Ж. Деструктор – әдие процедура, класстың ңұсқасын құртатын және ол тұрған жадың босатады.
Деструктор жалпы жағдайда жадты босату керек, статикті емес жазылған касиеттермен құрущы шақырған кезде. Біздің жағдайымызда жад Tangle ңұсқаларының қасиеттеріне керек болған себепті, құрышы неғұрлым қарапайым түрде болуы керек:
destructor TAngle.Destroy;
begin
inherited Destroy;
end;
Деструкторды шақыру тікелей түрде жүруі мүмкін (мысалға A.Destroy сияқты), Бірақ Free әдсін қолдағаны дұрыстырақ, Ол Destroy-ді автоматты түрде шақырады, сонымен қатар, тексеру жұмыстарын жұргізеді, класстың данасы бар ма екенің (nil-ге тен емес пе ол).
Ол дегеніміз TAngle класс данасының өшірілуі осындай түрге келе алады:
A.Free;
A:=nil;
З. «Көрсету» Батырмасың басқанда диологты терезесінде ( ShowMessage түрдегі) ағымды бұрыш көрсетілуі керек, GetValue әдісін қолданғанда алынатын.
Тапсырма. Tangle классын және осы классты қолданатын бағдарламаны жүзеге асыру. Бағдарлама интерфейсі болуы керек.
Одан басқа, кейбір берілген тапсырмаларды (нұсқаларға байланысты) орындау керек:
-
NхN пикселге тең, қайда N=100+нұсқа номері*5 сурет салу аумағын жасау.
-
XPos,YPos мағыналарының өзгертудің жаңа әдісін жасау және сурет салу аумағының орналасқан жерін басқаратын (2 компонент ұсынылады: TEdit және Tbutton компоненттері) тиісті басқару элементтерін құру.
-
Tangle классының екі данасымен біруақытта жұмыс істеуді қамтамасыз ету. Барлық терезедегі элементтерді екі рет қайталамауды ұсынады
-
жоғарыдағы бұрыш саналатын ось ыңғайын табу.
-
төменгі бұрыш саналатын ось ыңғайын табу.
-
Сол жақтағы бұрыш саналатын ось ыңғайын табу .
-
Классқа боялған аумақтың (бағдарлама үлгісінде – clYellow) түсін анықтайтын жаңа қасиет енгізу және берілген қасиетті өзгерту әдісін енгізу. Түсін өзгертуді басқаратын экрандық элементтерді қамтамасыздандыру (ColorDialog және оны басатын кнопка).
-
Классқа боялған аумақтың (бағдарлама үлгісінде – clWhite) фон түсін анықтайтын жаңа қасиет енгізу және берілген қасиетті өзгерту әдісін енгізу. Түсін өзгертуді басқаратын экрандық элементтерді қамтамасыздандыру (ColorDialog және оны басатын кнопка).
-
Классқа боялған аумақтың (бағдарлама үлгісінде – clBlack) осьтарының түсін анықтайтын жаңа қасиет енгізу және берілген қасиетті өзгерту әдісін енгізу. Түсін өзгертуді басқаратын экрандық элементтерді қамтамасыздандыру (ColorDialog және оны басатын кнопка).
Нұсқалар
-
Тізім бойынша номерлер
|
Орындалатын тапсырмалар
|
1, 9, 17, 25
|
1, 2, 4
|
2, 10, 18, 26
|
2, 3, 7
|
3, 11, 19, 27
|
3, 4, 7
|
4, 12, 20, 28
|
1, 3, 8
|
5, 13, 21, 29
|
2, 3, 9
|
6, 14, 22, 30
|
1, 4, 7
|
7, 15, 23, 31
|
2, 5, 8
|
8, 16, 24, 32
|
3, 6, 9
|
Зертханалық жұмыс №3
TPaintBox базасында өз классын құру
Жұмыс мақсаты: TPaintBox классының мұрагері – Tangle жаңа классын құру.
Жұмыс №2 зертханалық жұмыстың жалғасы.
Жаңа класс TPaintBox классында негізделуі үшін алдында құрылған бағдарламаны қайта жасау керек, сонымен қатар төменде көрсетілген қосымша мүмкіншіліктерді іске асыру.
Келесі ұсынылатын қосымша сыртқы пішін:
Tangle классының келесі құрылымы ұсынылады:
Type TAngle=class(TPaintBox)
private
Value:integer;
public
// TAngle классының данасын құрайтын конструктор
constructor Create(X,Y, W,H:integer);
// Value мағынасын өзгертетін процедура
procedure SetValue(NewValue:integer);
// Value мағынасын қайтаратын функция
function GetValue:integer;
// Value-ны Increment-ке үлкейтетін функция
function Plus (Increment:integer):integer;
// Value-ны Increment-ке азайтатын функция
function Minus(Decrement:integer):integer;
// Ағымдағы бұрышты суреттеуге арналған процедура
procedure Draw(Sender:TObject);
// Tangle классының данасын жою деструкторы
destructor Destroy; override;
end;
Алдындағы жұмыстың класс құрылымымен салыстырумен келесі өзгерістер енгізілген.
А. XPos,YPos:integer қасиеті алынған. Ол Left и Top объекттің жоғарғы оң бұрышы координатталарының сақтауына арналған TpaintBox-тың өзінің қасиеті бар екені түсіндіріледі.
Б. Can:Tcanvas қасиеті алынған; себебі TPaintBox-тың өз кенебі бар.
В. Конструктордан NewCanvas:TCanvas параметрі алдындағы пунктіде келтірілген себептерден алынған және объект салу аумағының ені мен бюиіктіктің тапсырмасына арналған W мен H параметрлері қосылған.
Г. Процедура procedure Draw(Sender:TObject) Sender:Tobject параметрімен жарияланған. OnPaint оқиғасына оны жауапқа автоматты түрде шақыруды қамтамасыз етеді және қажет болғанда суретті қайта салуға мүмкіндік береді. OnPaint оқиғасының өндеушілерінде Sender:TObject) параметрі міндетті түрде болуын Delphi талап етеді. Draw әдісін Tangle классының конструкторында автоматты түрде шақыру үшін мына жолды қою қажет:
OnPaint:=Draw;
Класстың құрылымын өзгертумен қатар келесі қосымшм мүмкіншіліктерді қамсыздандыру қажет:
1. Сурет салу аумағының жоғарыда сол жақтағы бұрышта Tangle классының данасына автоматты түрде ағымдағы бұрыштың мәні шығарылуы керек(суретте көру). Қажетті мағына шығаруына арналған кодты Draw процедурасының соңына орналастыру қажет.
Объект холстына мәтін шығару үшін TCanvas классының әдісін қолдаңыз:
procedure TextOut(X, Y: Integer; const Text: string);
Назар аударыңыз: Бұрыштың мәні автоматты түрде шығарылатындықтан, «Көрсету» батырмасы қажеттілігі туындамайды.
2. Шыққан суреттің мөлшері объекттің мөлшерімен сәйкес келу керек. (Width и Height қасиеттерінің мағынасын көрсету TPaintBox классынан мұраланғандармен).
Ол үшін Draw процедурасына төрт айнымалыны енгізу қажет сурет салу аумағының ұзындығына, еніне, ½ ұзындығына және ½ еніне тең болатын. Одан кейін сурет операторындағы бекітілген мәндерді осы айнымалылармен ауыстыру қажет.
Мысалы, бұрын орындалған сектордың суретін былайша
Pie(XPos, YPos, XPos+100, YPos+100, XPos+50+round(50*cos(Value*pi/180)), YPos+50+round(50*sin(Value*pi/180)), XPos+100, YPos+51);
Келесі түрде қабылдау:
Pie(0, 0, W, H,
W2+round(W2*cos(Value*pi/180)), H2+round(H2*sin(Value*pi/180)),W, H2+1);
Сонымен қатар,Draw процедурасының басында жаңа бүтін санды айнымалы иеленілген:
W :=Width; H :=Height;
W2:=round(Width/2); H2:=round(Height/2);
қайда Width и Height – қасиеті, TPaintBox-тан мұраланған.
Мынаған назар аударыңыз, XPos, YPos нолге ауыстырылған. Бұл бұрында координаталар компоненттің жоғары сол бұрыштан саналған, соның бетіне сурет салынған (мысалы, Form1).
Зертханалық жұмыс № 4
Полиморфизмнің қарапайым механизмдерін іске асыру
Жұмыс мақсаты: полиморфизм принциптерін қолданып экранда боялған геометриялық фигураларды суреттеуге арналған 4 – классты ( біреуі ата – баба және 3 оның ұрпақтары) құру.
Ата – баба классының құрылысы төменде көрсетелген:
type TDrawArea = class(TObject)
procedure WhiteBrush;
procedure BlueBrush;
procedure BlackBrush;
procedure redBrush;
end;
TdrawArea жасалған әдістер арқылы фигураларды суреттеу кезінде контур және бояу түсін таңдау керек ( әр түрлі фигураларға арналған).
Ұрпақ классының құрылысы төмендегідей:
type TSquare = class(TDrawArea)
procedure DrawIt(x1, y1, x2, y2: integer);
end;
type TEllipse = class(TDrawArea)
procedure DrawIt(x1, y1, x2, y2: integer);
end;
type TRoundRect = class(TDrawArea)
procedure DrawIt(x1, y1, x2, y2: integer);
end;
Бұл класта жүзеге асырылған әдістер ТDrawArea әдістері арқылы экранда белгілі фигураларды түсін қолданып салынады ( квадрат, эллипс, бұрыштары дөңгеленген квадрат).
Суреттерді салу үшін TCanvas әдістері қолданылады: квадрат – Rectangle, эллипс – Ellipse, дөңгеленген квадрат – RoundRect.
Бұл әдістер туралы ақпаратты Delphi жүйесінде іздеңіздер.
Холст ретінде холст формасын қолдануға болады. Класс ішінде белгілі бір форманың атын көрсетпеу үшін келесі форманы қолдануға болады:
Application.MainForm
Application объектісі: ТApplication жұмыс істейтін қосымшаның негізгі параметрлеріне өту үшін пайдаланылады, ал MainForm арқылы програмист қосымшаның негізгі формасына өтуі мүмкін. Сол кезде форманың белгілі атын көрсету қажет емес.
Мысалы, холсттың формасы үшін қарындаш жуандығын келесі ретпен өзгертуге болады:
Application.MainForm.Canvas.Pen.Width:=3;
Программада 3 ауыспалы – ұрпақтар классының экземплярлары суреттелуі керек. Одан кейін 6 перненің кез келгенін басу арқылы келесі әрекеттер орындалуы қажет:
1) Өңдеу жұмысы жүретін экземпляр классындағы жадының босатылуы.
Мысалы, егер RedRoundRect пернесі басылса, ал оған дейін MyRoundRect ауыспалысы суреттелсе: ТroundRect, онда өңдеуде MyRoundRect.Free деп жазу керек.
2) TObject классынан шығатын Credte әдісі көмегімен объекттің жаңа экземплярын құру.
Мысалы, MyRoundRect: = ТroundRect.Credte;
3) Сурет салуға арналған керекті түстерді орнату
Мысалы, MyRoundRect.RedBrush;
4) Фигураны салу.
Мысалы: MyRoundRect.DraIt (10, 10, 90, 90);
Жұмыс істейтін программаның сыртқы түрі (барлық пернелерге басқаннан кейін) төмендегідей болады:
Ж оғарыда көрсетілген әрекеттерден басқа программа нұсқаға байланысты келесі мүмкіндіктерге ие болады:
-
Эллипстің орнына дөңгелек салу;
2) Пернелер ретінде оларға сәйкес пиктограммалары бар TbitBtn компоненттерін қолдану;
3) Фигураның өлшемін таңдау мүмкіндігі;
4) Фигураларды суретке қарап немесе дәл сол орында форманың ортасында ( қолданушының таңдауы бойынша) салу мумкіндігі;
5) Квадрат орнына биіктігі/ені сәйкесінше 2-ге тең тіктөртбұрышты салу;
6) Холст ретінде TImage компонентін қолданып, фигураларды дәл сол орында экранның ортасында салу;
7) TToolBar панелінде орналасқан TToolButton компоненттерін перне ретінде пайдалану;
8) Барлық пернелер үшін OnClick хабарламасының өңдеуішін қолдану;
9) TRadioGroup компоненттерін пернелер орнына қолданып, оларға жататын кез келген пунктке басу кезінде автоматты түрде оған сәйкес фигуралардың пайда болуы;
Нұсқалар
-
Тізім бойынша номер
|
Жүзеге асатын компоненттер
|
1, 9, 17, 25
|
1, 2, 4
|
2, 10, 18, 26
|
2, 5, 7
|
3, 11, 19, 27
|
3, 4, 7
|
4, 12, 20, 28
|
1, 3, 8
|
5, 13, 21, 29
|
2, 5, 9
|
6, 14, 22, 30
|
1, 4, 7
|
7, 15, 23, 31
|
2, 5, 8
|
8, 16, 24, 32
|
3, 6, 9
|
Зертханалық жұмыс № 5
Кейінгі байланысу
Бұл жұмыс № 4 зертханалық жұмыстың жалғасы.
Жұмыс мақсаты: Кейінгі байланысу механизмі іске асатындай лабораториялық жұмыс № 4 программасын модифицирлеу.
Сонымен қатар, объектілердің экранда солға, оңға, жоғары, төмен автоматтық қозғалуын жүзеге асырып қамтамасыз ету.
Кейінгі байланысудың мәні – объектінің кейбір белгілі типі программаны орындау кезінде беріледі. Басқаша айтқанда, объект класспен программаның коды жазылғаннан кейін байланысады.
Программада TDrawArea классының экземпляры болуы керек, ол қалған үш кластың ата – бабасы болып табылады (TSquare, TEllipse және TroundRect). Полиморфизм арқылы ұрпақ классының конструкторын қолдану жолымен, программада ата баба классының экземпляры бар объектіні құруға болады.
Объектінің белгілі типі программаны орындау кезінде жасалады. Үш ұрпақ – классы болғанда программаны қолданушы кез келген конструкторды пайдаланып TdrawArea классын құрайды. Сонымен, конструктордың қандай түрі пайдаланғаны және қандай объект құрылғанына қарамастан, програмисттің көзқарасына байланысты онымен жұмыс істеу бірдей орындалады. Сонымен әрбір фигура типін жеке өңдеуді жүзеге асыру қажет емес болып, TdrawArea классының экземплярымен жұмыс жасалады.
TdrawArea классы төмендегідей болады:
type TDrawArea = class(TObject)
procedure WhiteBrush;
procedure BlueBrush;
procedure BlackBrush;
procedure RedBrush;
procedure DrawIt; virtual; abstract;
public
direction, x1, y1, x2, y2: integer;
end;
Бұл классқа DrawIt әдісі қосылды. Оған дейінгі лабораториялық жұмыста бұл әдіс әрбір ұрпақ – класстарында жүзеге асырылды, бірақ ата бабада қолданылған жоқ.
Бұл программада ата – баба классының экземплярымен жұмыс жасалғандықтан, TdrawArea DrawIt әдісін қолданады. Программа жұмыс істеу кезінде DrawIt процедурасын қолданғанда TdrawArea классының DrawIt әдісіне шақырылуы жіберіледі, ал одан кейін автоматты түрде белгілі бір ұрпақ классының DrawIt әдісіне өтеді.
DrawIt виртуалды және абстрактілі болып жарияланған. Виртуалды тәсілді класс-ұрпақтарға жаздыртып алуға (override) мүмкіндік береді. Тәсіл абстарктілі болып оны класс-бабада жүзеге асыру талап етілмегендіктен жарияланған – белгісіз фигураны суретке салудың еш мағынасы жоқ. Осы себепті TDrawArea класты DrawIt тәсілін жүзеге асырудың қажеті жоқ. Бұл класс-ұрпақтар үшін қажет болады.
Әрі қарай класты жариялауда келесідей жолдар бар:
public
direction, x1, y1, x2, y2: integer;
Бұл жерде public-өзгергіштер аталған, олардың көмегімен қолданушылар фигураның бағытын және оның шекараларын белгілеуге мүмкіндік алады.
Сіздерге белгілі болғандай public-өзгергіштердің болуы ООП ережелеріне сәйкес емес, алайда аталған жұмыста оны кішірейту мақсатында өзгергіштерді келесідей түрде сипаттауға болады.
x1, y1, x2, y2 класс өзгергіштері ретінде сипатталғандықтан класс-ұрпақтардың DrawIt рәсімін кішірейтуге болады. Енді осы рәсімдерге фигуралардың шекараларының белгілерін параметрлері ретінде берудің қажеті жоқ – сурет салу кезінде x1, y1, x2, y2 класының өзгергіштері қолданылуы мүмкін.
Енді DrawIt рәсімдерінің атаулары келесідей түрде болады:
DrawIt класындағы_Атауы procedure; override;
оverride директивасына назар аударыңыз. Осы директивасыз кеш байланыстыру әрекет етпейді.
№4 зертханалық жұмыста фигураларды іске асыратын үш түрлі кластардың түпнұсқалары жеке жарияланған:
var
Form1: TForm1;
MySquare: TSquare;
MyRoundRect: TRoundRect;
MyEllipse:TEllipse;
Осы жұмыста класс-ұрпақтың тек бір ғана өзгергішін жариялау қажет:
var
Form1: TForm1;
MyCurrent:TDrawArea;
Нақты түріне қарамастан барлық фигуралармен жұмыс істеу осы жалғыз өзгергіш арқылы орындалатын болады. Бұл полиморфты (кеш) байланыстыру механизмін қолдану арқылы болуы мүмкін.
Осы жерден кластардағы өзгерістер аяқталды.
Бағдарламаның дұрыс жұмыс істеуі үшін келесіні жасау қажет.
Нысанда орналасқан барлық басқыштар үшін OnClick оқиғаны бірегей өңдегішті жасаңыз. Бұл қатаң түрде міндетті болып табылмайды, алайда бағдарламаны жылдам қысқартуға мүмкіндік береді.
Басқыштар үшін Tag қасиетінің түрлі мағыналарын белгілеңіз. Бұл мағына нақты қандай басқыш басылғанын анықтау үшін өңдегіште есепке алынуы қажет. Осыған байланысты MyCurrent өзгергіші үшін нақты конструктор шақырылатын болады.
Мұны шамамен келесідей түрде жазуға болады:
case NOfButton of
1,2: MyCurrent:=TRoundRect.Create;
3,4: MyCurrent:=TSquare.Create;
5,6: MyCurrent:=TEllipse.Create;
end;
(Назар аударыңыз: Оқиғаны өңдегіштің бірінші жолында бұрын жасалынған нысананы жоюға ұмытып кетпеңіз: MyCurrent.Free;)
Осыдан кейін фигураны суретке салу қандай түстермен орындалатынын көрсету қажет:
case N of
1,5: MyCurrent.RedBrush;
2 : MyCurrent.BlueBrush;
3 : MyCurrent.BlackBrush;
4,6: MyCurrent.WhiteBrush;
end;
Әрі қарай x1, y1, x2, y2 мағыналарын (фигураның бастапқыда суретке салудың ортасында орналасуы қажет) және фигураның іс-қимыл жасайтын бағатын көрсетіңіз.
Бағытты кенеттен таңдау ұсынылады:
MyCurrent.direction:=random(4);
Іс-қиымыл жасау таймердің көмегімен іске асырылуы қажет (әрі қарай сипатталатындай). direction қандай мағынасына іс-қимылдың қандай бағыты сәйкес келетінін сіздер өздеріңіз шешесіздер (мысалы, 1 – жоғары, 2 – төмен және т.б.).
Іс-қимылдың бағытын таңдағаннан кейін таймерді қосу керек
Timer1.Enabled:=true;
және фигураны салу қажет:
MyCurrent.DrawIt;
Осы жерден фигураны жасау және белгілеу рәсімі аяқталады. Тағы да бір рет жұмыстың класс-ұрпақтың конструкторының көмегімен жасалынатын класс-бабаның түпнұсқасымен жүргізілетініне назар аударыңыз. «Кеш байланыстыру» мәні осыдан тұрады.
Осы зертханалық жұмысты орындаудың соңғы сатысында фигураның іс-қимылын қамтамасыз ету қажет.
Ол үшін таймерге арналған OnTimer оқиғаны өңдегішті жасаңыз.
Оның ішінде іс-қимылдың таңдалған бағытына, яғни direction өзгергішінің мәніне байланысты фигура белгілерінің өзгерістерін көрсетіңіз. Егер сіз direction=1 мәніне жоғарыға қарай орын ауыстыру сәйкес деп есептесеңіз, онда шамамен келесідей кодты жазу керек:
with MyCurrent do
if MyCurrent.direction=1 then
begin
MyCurrent.y1:=MyCurrent.y1-5;
MyCurrent.y2:=MyCurrent.y2-5;
MyCurrent.DrawIt;
end;
Тиісті кодты іс-қимылдың басқа бағыттары үшін де жазу керек.
Сіз осы оқиғаны өңдегіштің мәтінін Case және With операторларын пайдалану арқылы мағыналы түрде қысқарта аласыз
Жұмыс істейтін қосымшаның шамалы түрі суретте көрсетілген:
Одан басқа, №4 зертханалық жұмыста аталған Сіздің нұсқаңызға арналған барлық қосымша тапсырмалар (1 тапсырмадан басқа) жүзеге асырылуы керек.
Зертханалық жұмыс №7
Өзіндік бөлшектерді жасау
Жұмыстың мақсаты: негіз ретінде 2-3 зертханалық жұмыстарда қалыптасқан TАngle класын пайдалана отырып Angle бөлшегін және оны пайдаланатын бағдарламаны жасау.
Осы жұмысты пайдалану үрдісі шартты түрде үш сатыға бөлінеді:
-
бөлшекті жасау;
-
бөлшекті тіркеу (оны бөлшек панеліне шығару);
-
жаңа бөлшекті пайдаланатын бағдарламаны жасау.
Төменде барлық аталған сатылар қарастырылған.
-
Бөлшекті жасау
Delphi-де бағдарламаны жасау үрдісінен қарағанда бөлшектерді жасау визуалды емес дерлік болып табылады. Бөлшекті жазу үшін тек қана Delphi мәтіндік түзегіші қолданылады. Бөлшектің дұрыс әрекет ететінін тек екінші сатыны орындағаннан – тіркеуден, яғни оны Delphi-ге қосқаннан кейін ғана тексеруге болады.
Angle бөлшегін жасау үшін келесідей әрекетерді орындаңыз.
Жаңа жоба жасаңыз. Оның құрамында жаңа модуль (бірақ нысан емес!) жасаңыз. Модульге мағыналы атау беріңіз.
Сіздің модуліңізді компиляциялау мүмкіндігі үшін Uses-ке ExtCtrls, Classes, Graphics, SysUtils жүйелі модульдерді қосыңыз.
Енді жаңа модульге үшінші зертханалық жұмыста құрылған TАngle класының бағдарламалық кодын ауыстырып көшіру қажет. Ол үшін Delphi-де TАngle класы сипатталған 3-ші жұмыстағы бағдарламаның басты модулін (dpr емес, ал pas-файл) ашқан және барлық қажетті бағдарламалық кодты – класты жариялау (interface-секцияға көшіру) және тәсілдерді жүзеге асыру (implementation-секцияға) көшірген тиімді.
TАngle класының құрылысы шамамен келесідей болды:
Type TAngle=class(TPaintBox)
private
Value:integer;
// TАngle класындағы түпнұсқаны жасауға арналған конструктор
constructor Create(X,Y, W,H:integer);
// Value мағынасын өзгертуге арналған рәсім
procedure SetValue(NewValue:integer);
// Value мағынасын қайтаратын функция
function GetValue:integer;
// Value-ді Increment-ке үлкейтетін функция
function Plus (Increment:integer):integer;
// Value-ді Decrement-ке кішірейтетін функция
function Minus(Decrement:integer):integer;
// Ағымдағы бұрышты салуға арналған рәсім
procedure Draw(Sender:TObject);
// TАngle класының түпнұсқасын жоюға арналған деструктор
destructor Destroy; override;
end;
Компонент мәнінің өлшемі мен орны «Объект инспекторы» (Object Inspector) арқылы құрылатындықтан, бұл мәнді конструктор терезесінде беру қажет емес. Сондықтан X,Y, W,H:integer параметрлерін Create конструкторында енгізбеуге болады.
Келесіде біз бұрышты енгізу қасиетін анықтауымыз қажет.
Бұл қасиет мына түрде анықталады:
published
property AngleValue : integer read GetValue write SetValue default 45;
Осылайша, қасиет мәні автоматты түрде SetValue процедурасы шақырылғанда өзгеріп отырады, бұрыш мәнін алу үшін GetValue процедурасы қолданылады.
Айнымалы Value өзгеруіне (SetValue процедурасы бойынша) байланысты автоматты түрде AngleValue мәні де өзгереді. Осыған байланысты барлық әдістерді қолдану өзгеріссіз қалады (конструктордан басқа).
2. Компонент тіркеуі
Компонентті тіркеу үшін келесі әрекеттерді істеу қажет:
Interface-секциясына модуль компонентін мына түрде енгізу:
procedure Register;
Delphi ережесі бойынша Register процедурасы компонентті тіркеу үшін қажет.
Implementation-секциясына Register процедурасын былайша сипаттау керек:
procedure Register;
begin
RegisterComponents('Standard', [TAngle]);
end;
RegisterComponents – компонентті құрал саймандар тақтасына қосатын процедура.
Оның бірінші параметрі сіз енгізетін жаңа компоненттің атын білдіреді. Екінші параметр – тіркелетін класс жиынын білдіреді (үтір арқылы; біздің жағдайда бір класс – TAngle).
Осыдан кейін, егер компонент –класс программалық коды қате болмаса, компонентті тікелей тіркеуге кірісуге болады.
Мәзірдің мына бөлігін басыңыз Component | Install Component…
К омпоненттің мына орнату терезесі шығады:
Егер сіз компонентті бірінші рет орнатсаңыз (жұмыс барысында орнатуды көп рет қайталауға тура келеді, егер компонент қате жұмыс істесе), келесі әрекеттерді орындаңыз.
Мына ішкі бөлімге өтіңіз “Into new package” (“в новый пакет”).
Delphi пакетінде компоненттің программалық коды сақталады.
Тіркеу үшін компонент міндетті түрде пакеттің біреуінде орналасу керек. Бір пакетте бірнеше компонент сақталады. Пакет – компоненттер қоймасы.
“Unit file name” терезесінде сіздің компонентіңіздің обьект аты мен орнын көрсетіңіз ( Browse…батырмасын қолдануға болады).
“Рackage file name” терезесінде жаңа пакет аты мен орнын көрсетіңіз.
“Рackage description” (“пакет сипаты”) терезесінде жаңа пакетті сипаттайтындай кез келген мәтін енгізуге болады.
Барлық қажет ақпаратты енгізіп болған соң ОК батырмасын басыңыз, барлық қойылған сұрақтарға келісім беріп жауап беріңіз. Нәтижесінде компонент тақтасында жаңа компонентке сәйкес белгі пайда болады.
Егер сіз компонентті қайта орнатсаңыз мына әрекетті жасаңыз;
“Into existing package” (“в существующий пакет”) ішкі бетін ашыңыз, “Unit file name” және “Рackage file name” терезесінде керекті ақпаратты енгізіңіз (керекті ақпарат осы терезеде болуы мүмкін). ОК батырмасы басылған соң келесі терезе шығады:
Сізге пакетті қайта өңдеу үшін “Compile” батырмасын басу қажет.
Осы терезеде компонетті пакеттен алып тастауға (кнопка “Remove”) немесе жаңа пакет қосуға болатынын ескеріңіз (кнопка “Add”).
-
Жаңа компонентті қолдайтын программа құру.
Үшінші лабораториялық жұмыс бағдарламасын жаңа каталогқа көшіріңіз.
Одан өшіріңіз:
-
класс Tangle сипаттамасын (ол пакете орналасқан)
-
implementation-секциясынан класс TAngle жүзеге асыруды.
-
var A:TAngle; (ол автоматты түрде TForm1 класына қосылады).
-
Create конструкторын шақыруды.
Модульдің басқа бөлімдері өзгеріссіз қалдырылады.
Компонентті формаға енгізіп, оның өлшемі мен орнын көрсетіңіз.
Name қасиетін 3-ші лабораториялық жұмыстағыдай өзгертіңіз.
(үнсіз келісім бойынша жаңа обьект – Angle1 деп аталады).
Егер компонент құру әрекеттері дұрыс орындалса программа жұмыс істейді.
Олай болмаған жағдайда:
-
Программаның қатесін жөндеңіз. Егер ол көмектеспесе, компонент кодындағы қателерді дұрыстаңыз да оны қайта тіркеңіз, программаны қайта жүктеңіз. Ол да көмектеспесе, пункт 1-ді қараңыз.
Негізгі әдебиет
1. Фаронов В.В. Delphi 5: учебный курс. – М.: «Ноллидж», 2000г. – 608с. .
2. Фаронов В.В. Delphi 5: для программистов. – М.: «Ноллидж». 2000г. – 657с.
3. Архангельский А.Я. Прораммирование в Delphi 4 – М.: ЗАО «Издательство БИНОМ», 1999г. – 768с.
4. Дарахвелидзе П.Г., Марков Е.П, Delphi – среда визуального программирования – СПб.: ВН – Санкт-Петербург, 1996г. – 352с.
Қосымша әдебиет
5. Фаронов В.В. Delphi 4: учебный курс. – М. «Ноллидж», 1999г. – 464с.
6. Епаншеников А., Епаншеников Е. Программирование в среде Delphi: учебное пособие в 4-х частях Ч. 1 Проектирование программ – М.: ДИАЛОГ-МИФИ, 1998г. – 336с..
7. Веселова И.Ю., Сениченков Ю.Б. Моделирование: Вычислительный практикум. Издательство СПб.:ГТУ, 1999.-108с.
8. Гофман В.Э., Хомоненко А.Д. Delphi 6. – СПб.: БХВ-Петербург, 2002.-1152с.
9. Иглхарт Д.Л., Шедлер Д.С. регенеративное моделирование сетей массового обслуживания / Пер. с англ. А. Камышева. – М.:Радио и связь, 1984.-136с.
Достарыңызбен бөлісу: |