Кластарға екі операция қолдануға рұқсат етілген – IS және AS операциялары.
1. IS операторы.
IS операторының көмегімен берілген класс нұсқалған типке тиісті ме соны анықтауға болады. IS операторынан тұратын өрнектің синтаксисінің түрі мынандай болады:
object is class
Бұл өрнек логикалық типтен (boolean) тұрады, егер object айнымалысы class класының объектісі немесе кластардың біреуінің объектісі болса, онда TRUE мәнін қайтарады, әйтпесе – FALSE.
Мысал 2.8.1
IF ActiveControl IS TEdit THEN ...
IS операторы бульдік мәнді қайтарады.
TRUE – егер тексерілетін айнымалы ActiveControl берілген типке қатысты болса (TEdit). Сонымен қатар нұсқалған тип тексерілетін айнымалының арғы – тегі болып табылса (яғни ActiveControl TEdit класының немесе одан туындаған бір кластың объектісі болса).
FALSE – кері жағдайда.
Мысал 2.8.2
IF ActiveControl IS TObject THEN DoSomeThing;
Барлық кластар TObject класының ұрпақ кластары болғандықтан, DoSomeThing процедурасы кез – келген жағдайда орындалады.
2. AS операторы.
AS опрераторы нұсқағышты нақты типке келтіру үшін қолданылады. AS операторынан тұратын өрнектің синтаксисінің түрі мынандай болады:
object as class
Бұл өрнектің есетелінуінің нәтижесі болып class класының типіне немесе class класының ұрпақ – класының типіне сай келетін объектіге сілтеме табылады. Бағдарламаның орындалу барысында object class класы типті немесе class класының ұрпақ – класының типті немесе nil типті болуы мүмкін. Үйлеспеген типке келтіру ерекше жағдайдың өрбуіне әкеп соғады.
Мысал 2.8.3
WITH ActiveControl AS TEdit DO DoSomeThing;
Келтірілген фрагментте ActiveControl айнымалысы қандай да бір класқа нұсқағыш болуы мүмкін. AS операторының көмегімен бұл нұсқағыш TEdit – тегі нұсқағышқа түрленеді. Егер ActiveControl айнымалысы TEdit типінің (немесе оның бір ұрпақ кластарының) объектісі болып табылмайтыны анықталса, онда типтің келтірілуі орындалмайды және DoSomeThing әдісі шақырылмайды. Кері жағдайда типтердің келтірілуі орындалады және DoSomeThing әдісі шақырылады.
Мысал 2.8.4
with Sender as TButton do // егер Sender TButton типтен тұрса
begin // немесе TButton – нан ұрпақ -тип
Caption := '&Ok';
OnClick := OkClick;
end;
...
(Sender as TButton).Caption := '&Ok'; // TButton немесе оның ұрпақтары типтес
// Sender айнымалысының Caption қасиетіне '&Ok' мәні меншіктеледі
2.9 Оқиға және меншіктеу
Windows жүйесінде бұрыннан жұмыс істеп келе жатқан программистке "оқиға" терминінің мағынасын ұқтырудың қажеті жоқ шығар. Осы орта мен ол үшін жазылған бағдарламаның барлығы қолданушы, компьютер аппаратурасы немесе басқа бағдарламаның әсерінің нәтижесінде өрбитін оқиға арқылы басқарылады. Оқиғаның басталуы туралы хабар – ол терезе функцияларының көмегімен алынған Windows жүйесінің хабарламалары.
Қолда анықтамалық бола тұра, мұндай санды хабарламалармен жұмыс істеу оңайға түспейді. Сондықтан Delphi – дің артықшылықтарының бірі болып программистің Windows хабарламаларымен жұмыс істеу қажеттілігінен арылғаны болып табылады (бірақ оның мұндай мүмкіншілігі бар; ол туралы келесі бөлімде айтамыз). Delphi – де типтік оқиғалардың саны екі ондықтан аспайды және олардың барлығы орта туралы терең білімді қажет етпейтін қарапайым интерпретациядан тұрады.
Object Pascal тілінің деңгейінде іске оқиғалар қалай іске асырылғанын қарастырайық.
Оқиға — бұл сырттан келген әсерлерге қолданушының реакциясын құруға тағайындалған процедуралық типтің қасиеті. Мұндай қасиеттің мәні болып қандай да бір әдіске нұсқағыш табылады.
Оқиғаны сипаттаудың синтаксисі мынадай:
property OnMyEvent: TMyEvent read FOnMyEvent
write FOnMyEvent;
мұндағы OnMyEvent – қасиет-оқиғаның аты, TMyEvent – оқиғаның процедуралық типі, FOnMyEvent — өріс, ол сәйкес келетін оқиғаны өңдейтін әдіске нұсқағышты сақтауға тағайындалған.
Мұндай қасиетке мән тағайындау дегеніміз - объектіге оқиға шақырылған кезде шақырылатын әдістің адресін нұсқау. Мұндай әдістер оқиғаны өңдеуіштер деп аталады. Мысалы, мына жазу:
Application.OnActivate := MyActivatingMethod;
Application (осылай жұмыс істеп тұрған қосымшаға сай келетін объект аталады) объектісі активтелгенде MyActivatingMethod өңдеу - әдісі шақырылатынын білдіреді.
Кітапхананың ішінде Delphi – дің орындалу уақытында Windows хабарламаларын өңдейтін оқиғаны өңдеу шақыртулары әдістерде орналастырылады. Қажетті әрекеттерді орындағаннан кейін бұл әдіс өңдеушініңадресі белгіліме соны тексереді, ал егер ол белгілі болса, онда оны шақырады:
if Assigned(FOnMyEvent) then FOnMyEvent(Self);
Оқиға пайда болғанына және тағайындалуына байланысты параметрлерінің әртүрлі саны мен типінен тұрады. Барлығына жалпы болып Sender параметрі табылады, ол оқиғаның объект-көзіне нұсқайды. Ең қрапайым процедуралық тип — TNotifyEvent – оның екі параметрі болмайды:
TNotifyEvent = procedure (Sender: TObject) of object;
Мысал 2.9.1 Мысал ретінде TControl класының стандарты оқиғаларының OnDblClick (тышқанның сол жақ батармасына екі рет шерткенде өрбиді), OnMouseDown (тышқанның батырмасын басқанда өрбиді) және OnMouseMove (тышқанды жылжытқанда өрбиді ) сипатталуын қарастырайық:
type
TControl = class(TComponent)
private
..............................
FOnDblClick: TNotifyEvent;
FOnMouseDown: TMouseEvent;
FOnMouseMove: TMouseMoveEvent;
..............................
protected
..............................
property OnDblClick: TNotifyEvent read FOnDblClick
write FOnDblClick;
property OnMouseDown: TMouseEvent read FOnMouseDown
write FOnMouseDown;
property OnMouseMove: TMouseMoveEvent read FOnMouseMove
write FOnMouseMove;
..............................
end;
FOnDblClick, FOnMouseDown и FOnMouseMove – оқиға-қасиетін сипаттағанда қолданылатын өрістер. Өрістерді сипаттағанда қолданылатын процедуралық типтер келес түрде анықталады:
type
TNotifyEvent = procedure (Sender: TObject) of object;
TMouseEvent = procedure (Sender: TObject; Button: TMouseButtton;
Shift: TShiftState; X, Y: Integer) of object;
TMouseMoveEvent = procedure (Sender: TObject; Shift: TShiftState;
X, Y: Integer) of object;
Процедуралық типтерге жалпы болып оқиғаның объект-көзіне нұсқағыштан тұратын Sender параметрі табылады. Button параметрі тышқанның қай батырмасы басылғандығы туралы ақпараттан тұрады. Shift параметрі пернетақтада басылған батырманың кодынан тұрады. X және Y – құрауыштың шегіндегі тышқанның ағымды координаталары.
Инспектор объектісінің Events парағының кез – келген оқиғасының өрісіне шерту арқылы, сіздер бағдарламада керекті типтің әдісінің дайындамасын аласыздар. Мұнда ат ағымды құрауыш пен оқиғаның атынан тұратын болады (On префикісі болмайды), ал ол ағымды пішінге тиісті болады. Form1 пішінінде Label1 белгісі бар деп ұйғарайық. Онда тышқанмен шерту өңдеуішіне (OnClick оқиғасы) TForm1 класының Label1Click әдісінің тақырыбы құрылады:
procedure TForm1.Label1Click(Sender: TObject);
begin
...
end;
Оқиға объектінің қасиеті болып табылғандықтан, олардың мәнін бағдарламаның орындалу барысының кез – келген жерінде өзгертуге болады. Мұндай тамаша мүмкіндік атын қайта өзгерту деп аталады. Кез – келген уақытта бір объектінің оқиғаға реакциясының тәсілін алып, оны келесі бір объектіге қайта тағайындауға болады:
Object1.OnMouseMove := Object2.OnMouseMove;
Меншіктеу принципі әрбір арнайы жағдай үшін жаңа еншілес кластың тууы деген үлкен үрдістің пайда болуының алдын алады және ондай үрдістерді қарапайым процедураларды қоюмен айырбастайды.
Қандай механизм өңдеуішерді ауыстыруға мүмкіндік береді?, өйткені ол жай ғана процедура емес, әдіс қой. Бұл жерде Object Pascal тілінің әдіске нұсқағыш деген ұғымы сай келеді. Әдіс қарапайым процедурадан айқын сипатталған параметрлерден басқа әдіске айқын емес түрде класта автоматты түрде анықталған Self айнымалысына орналастырылатын оны шақырған объектіге нұсқағыштан тұрады. Сипатталып отырған процедуралық тип әдіске тағайындалғанын (яғни Self – ті алуды қарастырады), яғни әдістің типі болып келгенін көрсету үшін процедураны сипаттағанда of object резервтелген сөзді қосу керек. Әдіске нұсқағыш дегеніміз – ол осындай процедураға нұсқағыш болып табылады.
type
TMyEvent = procedure(Sender: TObject; var AValue: Integer) of object;
T1stObject = class;
FOnMyEvent: TMyEvent;
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
end;
T2nd0bject = class;
procedure SetValuel(Sender: TObject; var AValue: Integer);
procedure SetValue2(Sender: TObject; var AValue: Integer);
end;
var
Obj1: T1stObject;
Obj2: T2nd0bject;
begin
Obj1 := T1stObject.Create ;
Obj2 := T2nd0bject.Create;
Obj1.OnMyEvent := Obj2.SetValue1;
Obj1.OnMyEvent := Obj2.SetValue2;
...
end.
Бұл мысал атын қайта өзгерткен кезде басқа кластардың да әдістерін меншіктеуге болатындығын көрсетеді. Мұнда Objl объектісінің OnMyEvent оқиғасының өңдеуіші болып ретпен Obj2 объектісінің SetValue1 және SetValue2 әдістері табылады.
Объект Инспекторының Events бетінде әдістің, яғни оқиғаның типіне сай келетін құрауыштың қасиеттері бейнеленеді. Қандай да бір оқиғаға қойылатын оқиғанының өңдеуішінің типі оқиғаның типіне сай болуы керек, сондықтан әдістің типін басқаша оқиға өңдеуішінің типі деп те атауға болады.
Бақылау сұрақтары:
Класс пен оның элементтеріне ат тағайындағанда ұсынылатын ережелер.
Класс дегеніміз не? Объект дегеніміз не? Кластың жариялануы. Объектінің жариялануы. Кластың синтаксисі.
Кластың өрісі дегеніміз не? Мысалдар. Кластың өрістерінің қалқалануы. Мысалдар.
Кластың әдісі болып не табылады? Мысалдар. Кластың әдісі кәдімгі процедурадан несімен ерекшеленеді?
Әдістердің қалқалануы. Статикалық қалқалану. Динамикалық қалқалану.
Динамикалық, виртуальды және қалқалау әдістері. Мысалдар.
Абстракті әдістер. Мысалдар. Қайта іске қосылатын әдістер. Мысалдар.
Конструктор мен деструктор. Мысалдар.
Кластың қасиеті. Қасиеттің синтаксисі. Мысалдар.
Қасиеттің класы өрістің класынан несімен ерекшеленеді? Read, write специфиациялары.
Инкапсуляция. Мысал.
Туындау. Мысал.
Полиморфизм. Мысал.
Кластың құрылымы. Published, private, protected, public секциялары.
Кластарға амадар қолдану. IS және AS кілттік сөздері. Мысалдар.
Оқиға. Оқиғаның сипатталынуының синтаксисі. Мысалдар.
Процедуралық тип. Мысалдар.
Ең қарапайым процедуралық тип болып қандай тип табылады? Sender параметрі.
Оқиғаның өңдегішін қалай шақырады?
Оқиғаға қайта ат тағайындау. Мысалдар.
Өз бетінше орындауға арналған тапсырма
Объектілі – бағытталған бағдарламалаудың негізгі принциптері. Объект, хабарлама, класс, объектінің данасы және әдіс.
Абстракция, инкапсуляция, туындау және полиморфизм. Мысалдар.
Delphi – дің абстрактілі кластарының сипаттамалары (TObject, TPersistent, TComponent).
Delphi – дің абстрактілі кластарының сипаттамалары (TControl, TGraficControl, TWinControl, TScrollingWinControl).
Stored, default (немесе nodefaulte), implements спецификациялары. Мысалдар.
Берілгендердің динамикалық құрылымы. Нұсқағыштар, динамикалық айнымалылар. Мысалдар.
Variant типі. Variant типті айнымалылар. Variants модульі.
Достарыңызбен бөлісу: |