Òåìà 3: Ââåäåíèå â îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå.

 

1. Ïîíÿòèå êëàññà

2. Ïîíÿòèå îáúåêòà

3. Ñîçäàíèå è óíè÷òîæåíèå îáúåêòîâ

4. Ñâîéñòâà

5. Ñîáûòèÿ

 

1.Ïîíÿòèå êëàññà.

 

Êëàññîì â Delphi íàçûâàåòñÿ îñîáûé òèï, êîòîðûé ìîæåò èìåòü â ñâîåì ñîñòàâå ïîëÿ, ìåòîäû è ñâîéñòâà. Òàêîé òèï òàêæå íàçûâàþò îáúåêòíûì òèïîì.

 

type

tMyClass=class(tObject)

fMyFiled: integer;

function MyMethod: integer;

end;

 

Ïîëÿ êëàññà àíàëîãè÷íû ïîëÿì çàïèñè. Ýòî - äàííûå, óíèêàëüíûå â ïðîãðàììå äëÿ êàæäîãî ñîçäàííîãî â ïðîãðàììå ýêçåìïëÿðà êëàññà. Îïèñàííûé âûøå êëàññ tMyClass èìååò îäíî ïîëå - fMyFiled.  îòëè÷èå îò ïîëåé, ìåòîäû ó äâóõ ýêçåìïëÿðîâ îäíîãî êëàññà îáùèå. Ìåòîäû - ýòî ïðîöåäóðû è ôóíêöèè, îïèñàííûå âíóòðè êëàññà, è ïðåäíàçíà÷åííûå äëÿ îïåðàöèé íàä åãî ïîëÿìè.  ñîñòàâ êëàññà âõîäèò óêàçàòåëü íà ñïåöèàëüíóþ òàáëèöó - òàáëèöó âèðòóàëüíûõ ìåòîäîâ (VMT), â êîòîðîé ñîäåðæèòñÿ âñÿ èíôîðìàöèÿ, íåîáõîäèìàÿ äëÿ âûçîâà ìåòîäîâ. Îò îáû÷íûõ ïðîöåäóð è ôóíêöèé ìåòîäû îòëè÷àþòñÿ òåì, ÷òî ïðè âûçîâå â íèõ ïåðåäàåòñÿ óêàçàòåëü íà ýêçåìïëÿð êëàññà, êîòîðûé èõ âûçâàë. Ïîýòîìó îáðàáàòûâàòüñÿ áóäóò ïîëÿ èìåííî òîãî îáúåêòà, êîòîðûé âûçâàë ìåòîä. Âíóòðè ìåòîäîâ óêàçàòåëü íà âûçâàâøèé èõ îáúåêò äîñòóïåí ÷åðåç çàðåçåðâèðîâàííîå ñëîâî Self. Ñâîéñòâîì êëàññà íàçûâàåòñÿ ñîâîêóïíîñòü ïîëÿ è ìåòîäîâ ÷òåíèÿ/çàïèñè, îáåñïå÷èâàþùèõ äîñòóï ê ýòîìó ïîëþ. Ïðè ýòîì ñàìî ïîëå äåêëàðèðóåòñÿ êàê private (äîñòóïíî òîëüêî âíóòðè äàííîãî êëàññà), è äîñòóï ê íåìó âîçìîæåí òîëüêî ïîñðåäñòâîì ñîîòâåòñòâóþùèõ ìåòîäîâ. Ïîäðîáíåå ñâîéñòâà áóäóò îáñóæäàòüñÿ íèæå.

 

2.Ïîíÿòèå îáúåêòà

 

×òîáû èñïîëüçîâàòü íîâûé òèï â ïðîãðàììå, íóæíî, êàê ìèíèìóì, îïðåäåëèòü ïåðåìåííóþ ýòîãî òèïà. Ïåðåìåííàÿ îáúåêòíîãî òèïà íàçûâàåòñÿ ýêçåìïëÿðîì òèïà èëè îáúåêòîì:

 

var aMyObject: tMyClass;

 

Äî ââåäåíèÿ ïîíÿòèÿ “êëàññ” â ÿçûêå Pascal ñóùåñòâîâàëà äâóñìûñëåííîñòü îïðåäåëåíèÿ “îáúåêò”, êîòîðûé ìîã îáîçíà÷àòü è òèï, è ïåðåìåííóþ ýòîãî òèïà. Òåïåðü ñóùåñòâóåò ÷åòêàÿ ãðàíèöà: êëàññ - ýòî îïèñàíèå, îáúåêò - òî, ÷òî ñîçäàíî â ñîîòâåòñòâèè ñ ýòèì îïèñàíèåì.

 

3.Ñîçäàíèå è óíè÷òîæåíèå îáúåêòîâ

 

 îòëè÷èå îò Ñ++ è Turbo Pascal â Delphi îáúåêòû ìîãóò áûòü òîëüêî äèíàìè÷åñêèìè!!!. Ýòî îçíà÷àåò, ÷òî â ïðèâåäåííîì âûøå ïðèìåðå ïåðåìåííàÿ aMyObject íà ñàìîì äåëå ÿâëÿåòñÿ óêàçàòåëåì, ñîäåðæàùåì àäðåñ îáúåêòà.

 

Îáúåêò ñîçäàåòñÿ êîíñòðóêòîðîì è óíè÷òîæàåòñÿ äåñòðóêòîðîì.

 

aMyObject := tMyClass.Create;

//

// äåéñòâèÿ ñ ñîçäàííûì îáúåêòîì

//

aMyObject.Destroy;

 

Ñëåäóåò îáðàòèòü âíèìàíèå íà òî, ÷òî äëÿ ñîçäàíèÿ îáúåêòà aMyObject âûçûâàåòñÿ ìåòîä êëàññà tMyClass.Create. Êîíñòðóêòîð êëàññà (è ðÿä äðóãèõ ìåòîäîâ) óñïåøíî ðàáîòàåò è äî ñîçäàíèÿ îáúåêòà. Îäíàêî áîëüøèíñòâî îáû÷íûõ ìåòîäîâ (â ÷àñòíîñòè âñå âèðòóàëüíûå è äèíàìè÷åñêèå ìåòîäû). Âûçûâàòü äî èíèöèàëèçàöèè îáúåêòà íå ñëåäóåò.

 

 Delphi êîíñòðóêòîðîâ ó êëàññà ìîæåò áûòü íåñêîëüêî. Îáùåïðèíÿòî íàçûâàòü êîíñòðóêòîð Create, â îòëè÷èå îò Turbo Pascal, ãäå êîíñòðóêòîðû íàçûâàëèñü Init, è Ñ++, â êîòîðîì èìÿ êîíñòðóêòîðà ñîâïàäàåò ñ èìåíåì êëàññà. Òèïè÷íîå íàçâàíèå äåñòðóêòîðà - Destroy.

 

type

tMyClass=class(tObject)

fMyFiled: integer;

Constructor Create;

Destructor Destroy;

function MyMethod: integer;

end;

 

Äëÿ óíè÷òîæåíèÿ îáúåêòà â Delphi ðåêîìåíäóåòñÿ èñïîëüçîâàòü íå äåñòðóêòîð, à ìåòîä Free, êîòîðûé ïåðâîíà÷àëüíî ïðîâåðÿåò óêàçàòåëü, è òîëüêî çàòåì âûçûâàåò äåñòðóêòîð Destroy:

 

procedure tObject.Free;

 

Äî ïåðåäà÷è óïðàâëåíèÿ òåëó êîíñòðóêòîðà ïðîèñõîäèò ñîáñòâåííî ñîçäàíèå îáúåêòà: ïîä íåãî îòâîäèòñÿ ïàìÿòü, çíà÷åíèÿ âñåõ ïîëåé îáíóëÿþòñÿ. Äàëåå âûïîëíÿåòñÿ êîä êîíñòðóêòîðà, íàïèñàííûé ïðîãðàììèñòîì äëÿ èíèöèàëèçàöèè îáúåêòîâ äàííîãî êëàññà. Òàêèì îáðàçîì, íåñìîòðÿ íà òî, ÷òî ñèíòàêñèñ êîíñòðóêòîðà ñõîæ ñ âûçîâîì ïðîöåäóðû (îòñóòñòâóåò âîçâðàùàåìîå çíà÷åíèå), íà ñàìîì äåëå êîíñòðóêòîð - ýòî ôóíêöèÿ, âîçâðàùàþùàÿ ñîçäàííûé è ïðîèíèöèàëèçèðîâàííûé îáúåêò.

 

Ïðèìå÷àíèå. Êîíñòðóêòîð ñîçäàåò íîâûé îáúåêò òîëüêî â òîì ñëó÷àå, åñëè ïåðåä åãî èìåíåì óêàçàíî èìÿ êëàññà. Åñëè óêàçàòü èìÿ óæå ñóùåñòâóþùåãî îáúåêòà, îí ïîâåäåò ñåáÿ ïî-äðóãîìó: íå ñîçäàñò íîâûé îáúåêò, à òîëüêî âûïîëíèò êîä, ñîäåðæàùèéñÿ â òåëå êîíñòðóêòîðà.

 

×òîáû ïðàâèëüíî ïðîèíèöèàëèçèðîâàòü â ñîçäàâàåìîì îáúåêòå ïîëÿ, îòíîñÿùèåñÿ ê êëàññó - ïðåäêó, íóæíî ñðàçó æå ïðè âõîäå â êîíñòðóêòîð âûçâàòü êîíñòðóêòîð ïðåäêà ïðè ïîìîùè çàðåçåðâèðîâàííîãî ñëîâà inherited:

 

constructor tMyClass.Create;

Begin

inherited Create;

// Êîä èíèöèàëèçàöèè tMyClass

End;

 

Êàê ïðàâèëî, â êîäå ïðîãðàìì, íàïèñàííûõ íà Delphi, ïðàêòè÷åñêè íå âñòðå÷àåòñÿ âûçîâîâ êîíñòðóêòîðîâ è äåñòðóêòîðîâ. Äåëî â òîì, ÷òî ëþáîé êîìïîíåíò, ïîïàâøèé ïðè âèçóàëüíîì ïðîåêòèðîâàíèè â ïðèëîæåíèå èç ïàëèòðû êîìïîíåíòîâ, âêëþ÷àåòñÿ â îïðåäåëåííóþ èåðàðõèþ. Ýòà èåðàðõèÿ çàìûêàåòñÿ íà ôîðìå (êëàññ tForm): äëÿ âñåõ åå ñîñòàâíûõ ÷àñòåé êîíñòðóêòîðû è äåñòðóêòîðû âûçûâàþòñÿ àâòîìàòè÷åñêè, íåçðèìî äëÿ ïðîãðàììèñòà. Êòî ñîçäàåò è óíè÷òîæàåò ôîðìû? Ýòî äåëàåò ïðèëîæåíèå (îáúåêò ñ èìåíåì Application).  ôàéëå ïðîåêòà (ñ ðàñøèðåíèåì DPR) âû ìîæåòå óâèäåòü âûçîâû ìåòîäà Application.CreateForm, ïðåäíàçíà÷åííîãî äëÿ ýòîé öåëè.

 

×òî êàñàåòñÿ îáúåêòîâ, ñîçäàâàåìûõ äèíàìè÷åñêè (âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû), òî çäåñü íóæåí ÿâíûé âûçîâ êîíñòðóêòîðà è ìåòîäà Free.

 

4.Ñâîéñòâà

 

Êàê èçâåñòíî, ñóùåñòâóåò òðè îñíîâíûõ ïðèíöèïà, ñîñòàâëÿþùèõ ñóòü îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ: èíêàïñóëÿöèÿ, íàñëåäîâàíèå è ïîëèìîðôèçì. Êëàññè÷åñêîå ïðàâèëî îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ óòâåðæäàåò, ÷òî äëÿ îáåñïå÷åíèÿ íàäåæíîñòè íåæåëàòåëåí ïðÿìîé äîñòóï ê ïîëÿì îáúåêòà: ÷òåíèå è èçìåíåíèå èõ ñîäåðæèìîãî äîëæíî îñóùåñòâëÿòüñÿ ïîñðåäñòâîì âûçîâà ñîîòâåòñòâóþùèõ ìåòîäîâ. Ýòî ïðàâèëî íàçûâàåòñÿ èíêàïñóëÿöèåé (ñîêðûòèå äàííûõ).  ñòàðûõ ðåàëèçàöèÿõ ÎÎÏ (íàïðèìåð â Turbo Pascal) ýòà ìûñëü âíåäðÿëàñü òîëüêî ïîñðåäñòâîì ïðèçûâîâ è ïðèìåðîâ â äîêóìåíòàöèè; â Delphi åñòü ñîîòâåòñòâóþùàÿ êîíñòðóêöèÿ. Ïîëüçîâàòåëü îáúåêòà â Delphi ìîæåò áûòü ïîëíîñòüþ îòãîðîæåí îò ïîëåé îáúåêòà ïðè ïîìîùè ñâîéñòâ.

 

Îáû÷íî ñâîéñòâî îïðåäåëÿåòñÿ òðåìÿ ýëåìåíòàìè: ïîëåì è äâóìÿ ìåòîäàìè îñóùåñòâëÿþùèìè åãî ÷òåíèå/çàïèñü:

 

type

tMyClass=class(tObject)

function GetaProperty: tSomeType;

procedure SetaProperty(Value: tSomeType);

property aProperty: tSomeType read GetaProperty

write SetaProperty;

end;

 

 äàííîì ïðèìåðå äîñòóï ê çíà÷åíèþ ñâîéñòâà aProperty îñóùåñòâëÿåòñÿ ÷åðåç âûçîâû ìåòîäîâ GetaProperty è SetaProperty, îäíàêî â îáðàùåíèè ê ýòèì ìåòîäàì â ÿâíîì âèäå íåò íåîáõîäèìîñòè: äîñòàòî÷íî íàïèñàòü

 

aMyObject.aProperty:=aValue;

aVarable:= aMyObject.aProperty;

 

è Delphi îòêîìïèëèðóåò ýòè îïåðàòîðû â âûçîâû ñîîòâåòñòâóþùèõ ìåòîäîâ. Òî åñòü âíåøíå ñâîéñòâî âûãëÿäèò â òî÷íîñòè êàê îáû÷íîå ïîëå, íî çà âñÿêèì îáðàùåíèåì ê íåìó ìîãóò ñòîÿòü âûçîâû íåîáõîäèìûõ ïðîãðàììèñòó ìåòîäîâ. Íàïðèìåð, åñëè åñòü îáúåêò, ïðåäñòàâëÿþùèé ñîáîé êâàäðàò íà ýêðàíå, è åãî ñâîéñòâó “öâåò” ïðèñâàèâàåòñÿ çíà÷åíèå “áåëûé”, òî ïðîèçîéäåò íåìåäëåííàÿ ïðîðèñîâêà, ïðèâîäÿùàÿ ðåàëüíûé öâåò íà ýêðàíå â ñîîòâåòñòâèå çíà÷åíèþ ñâîéñòâà.

 

 ìåòîäàõ, óñòàíàâëèâàþùèõ çíà÷åíèÿ ñâîéñòâà, ìîæåò ïðîèçâîäèòüñÿ ïðîâåðêà çíà÷åíèÿ íà ïîïàäàíèå â çàäàííûé äèàïàçîí çíà÷åíèé è âûçîâ äðóãèõ ïðîöåäóð çàâèñÿùèõ îò âíîñèìûõ èçìåíåíèé. Åñëè æå ïîòðåáíîñòè â ñïåöèàëüíûõ ïðîöåäóðàõ ÷òåíèÿ/çàïèñè íåò, ìîæíî âìåñòî èìåí ìåòîäîâ ïðèìåíÿòü èìåíà ïîëåé.

 

tPropClass=class

fValue: tSomeType;

procedure SetValue(aValue: tSomeType);

property Value:tSomeType read fValue write SetValue;

End;

 

 ýòîì ïðèìåðå ïîëå fValue ìîäèôèöèðóåòñÿ ïðè ïîìîùè ìåòîäà SetValue, à ÷èòàåòñÿ íàïðÿìóþ.

 

Åñëè ñâîéñòâî äîëæíî òîëüêî ÷èòàòüñÿ èëè òîëüêî çàïèñûâàòüñÿ, â åãî îïèñàíèè ìîæåò ïðèñóòñòâîâàòü òîëüêî ñîîòâåòñòâóþùèé ìåòîä:

 

tReadOnlyClass=class

property NotChanged:tSomeType read GetNotChanged;

End;

 

 ýòîì ïðèìåðå ñâîéñòâî äîñòóïíî òîëüêî äëÿ ÷òåíèÿ. Ïîïûòêà ïðèñâîèòü çíà÷åíèå ñâîéñòâó NotChanged âûçîâåò îøèáêó êîìïèëÿöèè.

 

Ñâîéñòâàì ìîæíî ïðèñâàèâàòü çíà÷åíèÿ ïî óìîë÷àíèþ. Äëÿ ýòîãî ñëóæèò êëþ÷åâîå ñëîâî default:

 

Property Visible:boolean read fVisible write SetVisible default TRUE;

 

Ýòî îçíà÷àåò, ÷òî ïðè çàïóñêå ïðîãðàììû ñâîéñòâî áóäåò óñòàíîâëåíî êîìïèëÿòîðîì â TRUE.

 

Ñâîéñòâî ìîæåò áûòü è âåêòîðíûì.  ýòîì ñëó÷àå îíî âûãëÿäèò êàê ìàññèâ:

 

Property Points[index:integer]:tPoint read GetPoint write SetPoint;

 

Äëÿ âåêòîðíîãî ñâîéñòâà íåîáõîäèìî îïèñàòü íå òîëüêî òèï ýëåìåíòîâ ìàññèâà, íî òàêæå è òèï èíäåêñà. Ïîñëå êëþ÷åâûõ ñëîâ read è write äîëæíû èäòè èìåíà ñîîòâåòñòâóþùèõ ìåòîäîâ. Èñïîëüçîâàíèå çäåñü ïîëåé ìàññèâîâ íåäîïóñòèìî. Ìåòîä, ÷èòàþùèé çíà÷åíèå âåêòîðíîãî ñâîéñòâà, äîëæåí áûòü îïèñàí êàê ôóíêöèÿ, âîçâðàùàþùàÿ çíà÷åíèå òîãî æå òèïà, ÷òî è ýëåìåíòû ñâîéñòâà, è èìåþùàÿ åäèíñòâåííûé ïàðàìåòð òîãî æå òèïà è ñ òåì æå èìåíåì, ÷òî è èíäåêñ ñâîéñòâà:

 

function GetPoint(index:integer):tPoint;

 

Àíàëîãè÷íî, ìåòîä, ïîìåùàþùèé çíà÷åíèÿ â òàêîå ñâîéñòâî, äîëæåí ïåðâûì ïàðàìåòðîì èìåòü èíäåêñ, à âòîðûì - ïåðåìåííóþ íóæíîãî òèïà.

 

procedure SetPoint(index:integer; Value:tPoint);

 

Ó âåêòîðíûõ ñâîéñòâ åñòü åùå îäíà âàæíàÿ îñîáåííîñòü: íåêîòîðûå êëàññû â Delphi (ñïèñêè tList, íàáîðû ñòðîê tStrings è ò.ä.) “ïîñòðîåíû” âîêðóã îäíîãî îñíîâíîãî âåêòîðíîãî ñâîéñòâà. Îñíîâíîé ìåòîä òàêîãî êëàññà äàåò äîñòóï ê ýëåìåíòàì íåêîòîðîãî ìàññèâà, à âñå îñíîâíûå ìåòîäû ÿâëÿþòñÿ êàê áû âñïîìîãàòåëüíûìè. Äëÿ óïðîùåíèÿ ðàáîòû ñ îáúåêòàìè ïîäîáíîãî êëàññà ìîæíî îïèñàòü ïîäîáíîå ñâîéñòâî ñ êëþ÷åâûì ñëîâîì default:

 

type tMyList=class

property list[Index:integer]:string read Getlist write Setlist; default;

end;

 

Åñëè ó îáúåêòà åñòü òàêîå ñâîéñòâî, åãî ìîæíî íå óïîìèíàòü, à ñòàâèòü èíäåêñ â êâàäðàòíûõ ñêîáêàõ ñðàçó ïîñëå èìåíè îáúåêòà:

 

var MyList:tMyList

Begin

MyList.list[1]:=’First’; {Ïåðâûé ñïîñîá}

MyList.[2]:=’Second’; {Ïåðâûé ñïîñîá}

End;

 

Óïîòðåáëÿÿ êëþ÷åâîå ñëîâî default íåîáõîäèìî ñîáëþäàòü îñòîðîæíîñòü, ò.ê. äëÿ îáû÷íûõ è âåêòîðíûõ ñâîéñòâ îíî óïîòðåáëÿåòñÿ â ðàçíûõ çíà÷åíèÿõ.

 

Î ðîëè ñâîéñòâ â Delphi êðàñíîðå÷èâî ãîâîðèò òîò ôàêò, ÷òî ó âñåõ èìåþùèõñÿ â ðàñïîðÿæåíèè ïðîãðàììèñòà ñòàíäàðòíûõ êëàññîâ 100% ïîëåé íåäîñòóïíû è çàìåíåíû áàçèðóþùèìèñÿ íà íèõ ñâîéñòâàìè. Òîãî æå ïðàâèëà ñëåäóåò ïðèäåðæèâàòüñÿ è ïðè ðàçðàáîòêå ñîáñòâåííûõ êëàññîâ.

 

5.Ñîáûòèÿ

 

Îïåðàöèîííàÿ ñèñòåìà Windows® îñíîâàíà íà ñîîáùåíèÿõ. Ñîîáùåíèÿ ýòè âîçíèêàþò â ðåçóëüòàòå äåéñòâèé ïîëüçîâàòåëÿ, àïïàðàòóðû êîìïüþòåðà èëè äðóãèõ ïðîãðàìì. Òàêèõ ñîîáùåíèé â Windows ñîòíè, è ïî áîëüøîìó ñ÷åòó, íàïèñàòü ïðîãðàììó äëÿ Windows - çíà÷èò îïðåäåëèòü ðåàêöèþ íà íåêîòîðûå èç íèõ.

 

Ðàáîòàòü ñ òàêèì êîëè÷åñòâîì ñîîáùåíèé, äàæå èìåÿ ïîä ðóêîé ñïðàâî÷íèê, íåëåãêî. Ïîýòîìó îäíèì èç ãëàâíûõ ïðåèìóùåñòâ Delphi ÿâëÿåòñÿ òî, ÷òî ïðîãðàììèñò ïîëíîñòüþ èçáàâëåí îò íåîáõîäèìîñòè ðàáîòàòü ñ ñîîáùåíèÿìè Windows (õîòÿ òàêàÿ âîçìîæíîñòü ó íåãî èìååòñÿ). Òèïîâûõ ñîáûòèé â Delphi - íå áîëåå äâóõ äåñÿòêîâ, è âñå îíè èìåþò ïðîñòóþ èíòåðïðåòàöèþ, íå òðåáóþùóþ ãëóáîêèõ çíàíèé ñðåäû.

 

Ñ òî÷êè çðåíèÿ ÿçûêà, ñîáûòèå - ýòî ïîëå ïðîöåäóðíîãî òèïà, ïðåäíàçíà÷åííîå äëÿ ñîçäàíèÿ ïîëüçîâàòåëüñêîé ðåàêöèè íà òå èëè èíûå âõîäíûå âîçäåéñòâèÿ:

 

Property OnMyEvent: tMyEvent read FMyEvent write FMyEvent;

 

Çäåñü OnMyEvent - ïîëå îáúåêòà, ñîäåðæàùåå àäðåñ íåêîòîðîãî ìåòîäà. Ïðèñâîèòü òàêîìó ñâîéñòâó çíà÷åíèå - çíà÷èò óêàçàòü ïðîãðàììå àäðåñ ìåòîäà, êîòîðûé áóäåò âûçûâàòüñÿ â ìîìåíò íàñòóïëåíèÿ ñîáûòèÿ. Òàêèå ìåòîäû íàçûâàþòñÿ îáðàáîò÷èêàìè ñîáûòèé.

 

Âíóòðè áèáëèîòåêè âðåìåíè âûïîëíåíèÿ Delphi âûçîâû îáðàáîò÷èêîâ ñîáûòèé íàõîäÿòñÿ âíóòðè ìåòîäîâ, îáðàáàòûâàþùèõ ñîîáùåíèÿ Windows. Âûïîëíèâ íåîáõîäèìûå äåéñòâèÿ, ýòîò ìåòîä ïðîâåðÿåò, èçâåñòåí ëè àäðåñ îáðàáîò÷èêà, è, åñëè ýòî òàê, âûçûâàåò åãî.

 

Ñîáûòèÿ èìåþò ðàçíîå êîëè÷åñòâî è òèï ïàðàìåòðîâ, â çàâèñèìîñòè îò ïðîèñõîæäåíèÿ è íàçíà÷åíèÿ. Îáùèì äëÿ âñåõ ñîáûòèÿ ÿâëÿåòñÿ ïàðàìåòð Sender - îí óêàçûâàåò íà îáúåêò, âûçâàâøèé ñîáûòèå. Ñàìîå ïðîñòîå ñîáûòèå - tNotifyEvent - íå èìååò äðóãèõ ïàðàìåòðîâ.

 

tNotifyEvent = procedure(Sender:tObject) of object;

 

Òèï ìåòîäà, ïðåäíàçíà÷åííûé äëÿ èçâåùåíèÿ î íàæàòèè êëàâèøè, ïðåäóñìàòðèâàåò ïåðåäà÷ó â ïðîöåäóðó êîäà ýòîé êëàâèøè, î ïåðåäâèæåíèè ìûøè - åå òåêóùèõ êîîðäèíàò è ò.ä.

 

Èìÿ ñîáûòèÿ â Delphi íà÷èíàåòñÿ ñ ïðåôèêñà On: OnClick, OnCreate, OnMouseDown è ò.ä. Èìåíà ìåòîäîâ - îáðàáîò÷èêîâ ñîáûòèé ñîñòîÿò èç èìåíè îáúåêòà, ãåíåðèðóþùåãî ñîáûòèå, è êîðíÿ èìåíè ñîáûòèÿ: OkButtonClick. Äâàæäû ùåëêíóâ ìûøüþ â èíñïåêòîðå îáúåêòîâ íà ñòðàíèöå Events â ïîëå íàïðîòèâ ëþáîãî ñîáûòèÿ, âû ïîëó÷èòå ñêåëåòíûé êîä (çàãîòîâêó) ýòîãî ñîáûòèÿ.

 

Ïîñêîëüêó ñîáûòèÿ - ýòî ñâîéñòâà îáúåêòà, èõ çíà÷åíèÿ ìîæíî ìåíÿòü â ëþáîé ìîìåíò âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû. Ýòà âîçìîæíîñòü íàçûâàåòñÿ äåëåãèðîâàíèåì. Ìîæíî â ëþáîé ìîìåíò âçÿòü ñïîñîáû ðåàêöèè íà ñîáûòèÿ ó îäíîãî îáúåêòà è ïðèñâîèòü (äåëåãèðîâàòü) èõ äðóãîìó.

 

Ïðèíöèï äåëåãèðîâàíèÿ ïîçâîëÿåò èçáåæàòü òðóäîåìêîãî ïðîöåññà ïîðîæäåíèÿ íîâûõ êëàññîâ äëÿ êàæäîãî ñïåöèôè÷åñêîãî ñëó÷àÿ, çàìåíÿÿ íãî ïðîñòîé ïîäñòàíîâêîé ïðîöåäóð.

 

Îäèí è òîò æå îáðàáîò÷èê ìîæåò îáðàáàòûâàòü ñîáûòèÿ îò ðàçíûõ îáúåêòîâ. Òèïè÷íûé ïðèìåð - â ñîâðåìåííûõ ïðîãðàììàõ îäíî è òî æå äåéñòâèå ìîæíî âûçâàòü íåñêîëüêèìè ñïîñîáàìè - ÷åðåç ãëàâíîå ìåíþ, êîíòåêñòíîå ìåíþ è ò. ä. Ýòîãî ëåãêî äîáèòüñÿ, íàçíà÷èâ îäèí è òîò æå îáðàáîò÷èê âñåì íåîáõîäèìûì îáúåêòàì â èíñïåêòîðå îáúåêòîâ, ðàçóìååòñÿ, ñîáûòèÿ äîëæíû áûòü îäíîãî è òîãî æå òèïà.

 

Áîëåå ñëîæíûé ñëó÷àé - êîãäà âíóòðè îáðàáîò÷èêà íåîáõîäèìî îïðåäåëèòü, êàêîé èìåííî îáúåêò âûçâàë ñîáûòèå. Åñëè îáúåêòû, êîòîðûå ïîòåíöèàëüíî ìîãóò ýòî ñäåëàòü, èìåþò ðàçíûé òèï, òî èìåííî èõ òèï ìîæíî ïðèìåíèòü â êà÷åñòâå êðèòåðèÿ:

 

If Sender is tMenuItem then ...

 

Åñëè æå âñå îáúåêòû, ðàçäåëÿþùåå ìåæäó ñîáîé îäèí îáðàáîò÷èê ñîáûòèÿ, îòíîñÿòñÿ ê îäíîìó êëàññó, ìîæíî èñïîëüçîâàòü ñâîéñòâî tObject.Tag.

 

Íèæå ïðèâåäåíû íàçâàíèÿ íåêîòîðûõ, íàèáîëåå óïîòðåáèòåëüíûõ ñîáûòèé Delphi:

 

Ñîáûòèå - Òèï îáðàáîò÷èêà - Êîãäà âîçíèêàåò

 

OnClick - TNotifyEvent - Ïðè íàæàòèè ëåâîé êëàâèøè ìûøè

 

OnActivate - TnotifyEvent - Ïîñëå ïåðåäà÷è îáúåêòó ôîêóñà

 

OnCreate - TnotifyEvent - Ïîñëå ñîçäàíèå îáúåêòà

 

OnDestroy - TnotifyEvent - Ïåðåä óíè÷òîæåíèåì îáúåêòà

 

OnDeactivate - TnotifyEvent - Ïåðåä óõîäîì ôîêóñà èç îáúåêòà

 

OnKeyPress - TkeyPressEvent - Ïðè íàæàòèè êëàâèøè

 

OnMouseDown - TmouseEvent - Ïðè íàæàòèè êëàâèøè ìûøè

 

OnMouseMove - TmouseMoveEvent - Ïðè äâèæåíèè ìûøè íàä îáúåêòîì

 

OnMouseUp - TmouseEvent - Ïðè îòïóñêàíèè êëàâèøè ìûøè

 

à òàêæå èõ òèïû:

 

Òèï

Îïèñàíèå

 

TnotifyEvent

type TnotifyEvent = procedure (Sender: TObject) of object;

 

TkeyPressEvent

type TkeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;

 

TmouseEvent

TmouseEvent = procedure (Sender: TObject; Button: TmouseButton; Shift: TShiftState; X, Y: Integer) of object;

 

TmouseMoveEvent

TmouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;

 

Ñòàíäàðòíûå ñîáûòèÿ îïèñàíû â ìîäóëå Classes.