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 модульі.
Достарыңызбен бөлісу: |