Òåìà 3: Ââåäåíèå â
îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå.
3. Ñîçäàíèå è óíè÷òîæåíèå îáúåêòîâ
Êëàññîì â Delphi íàçûâàåòñÿ îñîáûé òèï, êîòîðûé ìîæåò èìåòü â ñâîåì ñîñòàâå ïîëÿ, ìåòîäû è ñâîéñòâà. Òàêîé òèï òàêæå íàçûâàþò îáúåêòíûì òèïîì.
type
tMyClass=class(tObject)
fMyFiled: integer;
function MyMethod:
integer;
end;
Ïîëÿ êëàññà àíàëîãè÷íû ïîëÿì çàïèñè. Ýòî - äàííûå, óíèêàëüíûå â ïðîãðàììå äëÿ êàæäîãî ñîçäàííîãî â ïðîãðàììå ýêçåìïëÿðà êëàññà. Îïèñàííûé âûøå êëàññ tMyClass èìååò îäíî ïîëå - fMyFiled.  îòëè÷èå îò ïîëåé, ìåòîäû ó äâóõ ýêçåìïëÿðîâ îäíîãî êëàññà îáùèå. Ìåòîäû - ýòî ïðîöåäóðû è ôóíêöèè, îïèñàííûå âíóòðè êëàññà, è ïðåäíàçíà÷åííûå äëÿ îïåðàöèé íàä åãî ïîëÿìè.  ñîñòàâ êëàññà âõîäèò óêàçàòåëü íà ñïåöèàëüíóþ òàáëèöó - òàáëèöó âèðòóàëüíûõ ìåòîäîâ (VMT), â êîòîðîé ñîäåðæèòñÿ âñÿ èíôîðìàöèÿ, íåîáõîäèìàÿ äëÿ âûçîâà ìåòîäîâ. Îò îáû÷íûõ ïðîöåäóð è ôóíêöèé ìåòîäû îòëè÷àþòñÿ òåì, ÷òî ïðè âûçîâå â íèõ ïåðåäàåòñÿ óêàçàòåëü íà ýêçåìïëÿð êëàññà, êîòîðûé èõ âûçâàë. Ïîýòîìó îáðàáàòûâàòüñÿ áóäóò ïîëÿ èìåííî òîãî îáúåêòà, êîòîðûé âûçâàë ìåòîä. Âíóòðè ìåòîäîâ óêàçàòåëü íà âûçâàâøèé èõ îáúåêò äîñòóïåí ÷åðåç çàðåçåðâèðîâàííîå ñëîâî Self. Ñâîéñòâîì êëàññà íàçûâàåòñÿ ñîâîêóïíîñòü ïîëÿ è ìåòîäîâ ÷òåíèÿ/çàïèñè, îáåñïå÷èâàþùèõ äîñòóï ê ýòîìó ïîëþ. Ïðè ýòîì ñàìî ïîëå äåêëàðèðóåòñÿ êàê private (äîñòóïíî òîëüêî âíóòðè äàííîãî êëàññà), è äîñòóï ê íåìó âîçìîæåí òîëüêî ïîñðåäñòâîì ñîîòâåòñòâóþùèõ ìåòîäîâ. Ïîäðîáíåå ñâîéñòâà áóäóò îáñóæäàòüñÿ íèæå.
×òîáû èñïîëüçîâàòü íîâûé òèï â ïðîãðàììå, íóæíî, êàê ìèíèìóì, îïðåäåëèòü ïåðåìåííóþ ýòîãî òèïà. Ïåðåìåííàÿ îáúåêòíîãî òèïà íàçûâàåòñÿ ýêçåìïëÿðîì òèïà èëè îáúåêòîì:
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.
Êàê èçâåñòíî, ñóùåñòâóåò òðè îñíîâíûõ ïðèíöèïà, ñîñòàâëÿþùèõ ñóòü îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ: èíêàïñóëÿöèÿ, íàñëåäîâàíèå è ïîëèìîðôèçì. Êëàññè÷åñêîå ïðàâèëî îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ óòâåðæäàåò, ÷òî äëÿ îáåñïå÷åíèÿ íàäåæíîñòè íåæåëàòåëåí ïðÿìîé äîñòóï ê ïîëÿì îáúåêòà: ÷òåíèå è èçìåíåíèå èõ ñîäåðæèìîãî äîëæíî îñóùåñòâëÿòüñÿ ïîñðåäñòâîì âûçîâà ñîîòâåòñòâóþùèõ ìåòîäîâ. Ýòî ïðàâèëî íàçûâàåòñÿ èíêàïñóëÿöèåé (ñîêðûòèå äàííûõ).  ñòàðûõ ðåàëèçàöèÿõ ÎÎÏ (íàïðèìåð â 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% ïîëåé íåäîñòóïíû è çàìåíåíû áàçèðóþùèìèñÿ íà íèõ ñâîéñòâàìè. Òîãî æå ïðàâèëà ñëåäóåò ïðèäåðæèâàòüñÿ è ïðè ðàçðàáîòêå ñîáñòâåííûõ êëàññîâ.
Îïåðàöèîííàÿ ñèñòåìà 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.