ОҚУ-Әдістемелік материалдар семей 2012. мазмұны



жүктеу 3.35 Mb.
бет12/16
Дата09.06.2016
өлшемі3.35 Mb.
1   ...   8   9   10   11   12   13   14   15   16

Интерфейстер

Интерфейстер -COM (Component Object Model — объектілердің компоненттік моделі), COBRA (Common Object Request Broker Architecure — жалпы объектілерді талап ететін брокерлі архитектура) технологияларында және осыған байланысты қашықтықтан кіру мүмкіндігі бар технологияларда басты роль атқарады. басқа сөзбен айтқанда, басқа машинада орналасқан объектілер объектілерге кіру технологиясы. Оның негізгі міндеті — алыстағы объектінің қасиетін, әдісін және оқиғасын сипаттау, яғни программалау тілінде клиентке арналған қосымшаны жасауда пайдаланылады. Егер ол өзінің жеке меншік объектісі болса, интерфейститің көмегімен клиент программасы алыстағы объектіге қатынас жасайды.

Интерфейстер тақырыбының ауқымы өте кең және қызықты да. Бірақ интерфейстер жөніндегі жалпы түсінікпен ғана шектелеміз. Интерфейс дегеніміз — бос класс.

Интерфейстің құрылуы және пайдаланылуы

Интерфейстер типтерді сипаттаудың дербес жағдайы. олар interface қызметші сөзінің көмегімен хабарланады. Мысалы,


Type

IEdit=interface

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo;stdcall;

End;

Мұндағы хабарлау абстракт класты сипаттаумен бірдей, яғни интерфейсті шақыру ондағы хабарланған қасиеттер мен әдістерді талдауды талап етпейді.



Кластардан айырмашылығы интерфейстің өрістері болмайды, сондықтан ондағы read және write бөлімінде хабарланған қасиеттер тек әдіске ғана сілтеме жасауы мүмкін. Интерфейсте хабарланған барлық мүшелер тек Public секциясында орналасады.

Әдістер абстракт (abstract), виртуалды (virtual), динамикалық (dinamic) немесе жабылатын (override) бола алмайды. Интерфейстерде конструкторлар немесе деструкторлар болмайды, яғни ондағы сипатталған әдістер тек оны сүйемелдейтін кластың шеңберінде ғана жүзеге асырылады, ол интерфейстің аты оның аталық тізіміндегі кластың хабарлануында көрсетіледі:


TEditor=class(TInterfacedObject,IEdit)

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo:Boolean;stdcall;

End;
Әдеттегі кластан интерфейстік кластың айырмашылығы оның бірнеше аталық интерфейсі болуы мүмкін:

Type

IMyInterface=interface



Procedure Delete; stdcall;

TmyEditor=class(TInterfacedObject,IEdit,IMyInterface)

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo:Boolean;stdcall;

Procedure Delete; stdcall;

End;
Кез келген жағдайдағы интерфейстік класты жүзеге асыру бөлімінде сәйкес интерфейстік әдістерді сипаттау қажет. Мысалы, егер интерфейс хабарланған болса

IPaint=interface

Procedure CirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;


Кез келген жағдайдағы интерфейстік класты жүзеге асыру бөлімінде сәйкес интерфейстік әдістерді сипаттау қажет. Мысалы, егер интерфейс хабарланған болса
IPaint=interface

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;


және оның интерфейстік класын пайдаланатын болса,

TPainter=class(TInterfaceObject, Ipaint)

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;

онда implementation бөлімінде әдістің жүзеге асырылуын көрсету қажет:



Procedure Tpainter.CirclePaint(Canva:TCanvas; x,y,R:integer);

begin


With Canva do

Ellipse(x,y,x+2*R,y+2*R);

End;

Procedure Tpainter.CirclePaint(Canva:TCanvas; x1,y1,x2,y2,R:integer);



begin

With Canva do

Rectabgle(x1,y1,x2,y2);

End;


Енді шеңбер және квадрат сызу үшін кластың интерфейстік объектісін хабарлауға болады:

Procedure Tform1.PaintBoxPaint(Sender:TObject);

var

Painter:IPaint;



begin

Painter:=TPainter.Create;

Painter.CirclePaint(PaintBox1.Canvas,10,0,10);

Painter.RectPaint(PaintBox1.Canvas,40,0,60,20);

End;

Интерфейс оның пайдаланатын интерфейстік класын хабарлағанға дейін хабарланатындығын қарамастан, оның әдістерінің кластың хабарлауында келтірілетіні міндетті екені компиляторға белгілі. Біздің жағдайда оны былай көрсетуге болады:



Type

TPainter=class(TInterfaceObject,IPaint)

End;

Мұнда жазу қате болар еді: компилятор CirclePaint және RectPaint әдістерінің сипатталуын қоюды талап етер еді.



Сондай-ақ, Object Pascal тілінің барлық кластары жалғыз аталық класс Tobject класынан туындағаны тәрізді барлық интерфейстік кластар TinterObject жалпы аталығынан туындаған. Бұл аталық жадыны интерфейстік объектілер үшін үлестіре алады және Iunknow глобальды интерфейсін пайдаланады:

Type


TinterfacedObject=class(TObject,IUnknown)

Private


Frefcount:integer;

Protected

Function QueryInterface(constIID:TGUID; outObj):integer;stdcall;

Function_AddRef:integer;stdcall;

Function_Relefse:integer;stdcall;

Public


Property RefCount:integer read FrefCount;

End;


Егер алдыңғы мысалда Tpainter класы төмендегідей сипатталған болса:

TPainter=class(TPaint)

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;

Онда компилятор TinterfaceObject класының QueryInterface_Add_Release әдістерін қосуды талап етер еді. Бұл кластың FrefCount өрісі интерфейстік объектіні шақыру есептегішінің қызметін атқарады және Windows схемасында қабылданғанындай пайдаланылады: Iunknow интерфейсінің Add әдісіне әрбір оралған сайын есептегіш 1-ге артады, ал Release әдісіне оралған сайын есептегіш 1-ге кемиді. Бұл өрістің мәні нольге тең болғанда интерфейстік объект жойылып, жадыдан алған орнын босатады.



Интерфейстік объектіге as типтерді келтіру операторын қолдануға болады, бұл жағдайда керекті интерфейс таңдалады:

Procedure PaintObject(P:TInterfacedObject)

Var x:IPaint

begin


Try

X:PasIPaint;

X.CirclePaint(PaintBox1.Canvas,0,0,20)

Except


ShowMessage('объект IPaint интерфейсін сүйемелдемейді')

End; end;

Мұндай меншіктеуді кездестіргеннен кейін компилятор код құрады және оның көмегімен Ipaint интерфейсіне сілтеме жасауды шақырылады. Егер объект көрсетілген интерфейсті сүйемелдемейтін болса, шектен тыс жағдай пайда болады.

қашықтықтағы объектіні пайдалануға есептелген интерфейстер глобальды бірегей идентификатормен жабдықталуы тиіс (Guid). Мысалы,

IPaint=interface

['{AYAFEB60-7705-11D2-8B-41-4444553540000}']

ProcedureCirclePaint(Canva:TCanvas; x,y,R:integer);

ProcedureRectPaint(Canva:TCanvas; x1,y1,x2,y2:integer);

End;

Implements қызметші сөзінің көмегімен программист кейбір класқа қандай да бір қасиетті қоса алады. Бұл қасиеттің типі интерфейс немесе класс болуы мүмкін. Егер қасиеттің типі интерфейс болса, бұл интерфейстің аты аталық кластар тізімінде көрсетілуі тиіс, яғни интерфейстік кластағыдай:

Type


IMyInterface=interface

Procedure P1; Procedure P2;

End;

TMyClass=class(TObject,IMyInterface)



IMyInterface=IMyInterface;

Property MyInterface:IMyInterface

Read FMyInterface implements ImyInterface;

End;


Мұнда мына мәселеге көңіл аудару қажет: мысалдағы TmyClass интерфейстік класс болып табылмайды, яғни Р1 және Р2 әдістері орындалатын класс.

Егер одан MyInterface өкілетті қасиетін анықтауды алып тастаса, онда ол интерфейстік болып табылады және MyInterface әдісін сипаттау қажет.

Өкілетті қасиетте міндетті түрде read болуы тиіс. Егер оның типі класс болса және ол сол хабарланған болса, оның басқа өкілетті қасеиттерінің болуы мүмкін емес.

Модульдер

Модульбұл интерфейстік бөлімнің әртүрлі компоненттерін (типтер, тұрақтылар, айнымалылар, процедуралар мен функциялар) қамтитын дербес компиляцияланатын программалық бірлік. Интерфейстік бөлікте объектілердің пайда болуы оларды негізгі программаның басқа модульдері үшін мүмкін жасайды. Процедуралар мен функциялардың денесі пайдаланушыдан жасырылған модульдің орындалатын бөлігінде орналасады.

Delphi модульдердің ролі тек жеке компиляциялау механизмімен ғана шектелмейді. Delphi әрбір программаға қосылатын тереземен жеке модульді байланыстырады да, осындай тәсілмен жеке программалық бірлік үшін терезенің барлық қасиетін сақтайды. Біз атап өткеніміздей, негізгі программа (DPR жоба файлы): программада пайдаланылатын барлық модульдердің тізімінен және қажетті терезені құруды қамтамасыз ететін бірнеше орындалатын операторлардан тұрады, сондай-ақ, Windows жүйесімен программаның байланысын қамтамасыз етеді. Программаның барлық негізгі жұмысы программада сақталған кодпен басқарылады.



Модульдер құрылымы

Модульдің құрылымы төмендегідей:

Unit <атау>;

Interface



<интерфейстік бөлік>

Implementation



<толтырылатын бөлік>

initialization



<орнатылатын бөлік>

finalisation



<аяқталатын бөлік>

end


Мұндағы Unit — қызметші сөз (бірлік); модуль тақырыбын бастайды; <атау>-модуль атауы (дұрыс идентификатор); Interface — қызметші сөз (интерфейс); модульдің интерфейстік бөлігін бастайды; Implementation — қызметші сөз (толтыру); орындалатын бөлікті бастайды; initialization — қызметші сөз (инициализация); модульдің инициализацияланатын бөлігін бастайды; finalisation қызметші сөз (аяқтау); модульдің аяқталатын бөлігін бастайды; end — қызметші сөз, модульдің соңы дегенді білдіреді.

Сөйтіп, кез келген модуль тақырыптан және құрамдас бөліктен тұрады, олардың кез келгені бос болуы мүмкін.



Модуль тақырыбы және модульдердің бір-бірімен байланысы

Модуль тақырыбы Unit қызметші сөзінен және одан кейінгі модуль атынан тұрады. Object Pascal тілінде дұрыс жұмыс істеу үшін үлкен программалар құруды жеңілдететін құралдарды қосу мүмкіндігі қарастырылған. Ол үшін бұл атау модульдің алғашқы мәтіні орналасқан дискілік файлдың атымен сәйкес келуі тиіс.

Мысалы, тақырып:

Unit Global

болса, сәйкес модульдің алғашқы мәтіні Global.pas дискілік файлында орналасуы тиіс. Сонымен, модуль атауы оның басқа модульдермен және негізгі байланысу қызметін қамтамасыз етеді. Ол байланыс арнайы сөйлеммен

Uses <модульдер тізімі>

қамтамасыз етіледі.

Мұндағы Uses — қызметші сөз (пайдаланылды); <модульдер тізімі>-байланыс орнатылатын модульдер тізімі, олар бір-бірінен үтір арқылы ажыратылады. Мысалы,

Uses Windows, SysUtils, MyUnit;

Егер Uses хабарлауы пайдаланылса, онда ол негізгі программаның бейнелеу бөлімін ашуы тиіс. модульдер басқа модульдерді де пайдалануы мүмкін. Модульдегі Uses сөзі не Interface, не Implementation сөзінен кейін бірден жазылады.



Интерфейстік бөлік

Интерфейстік бөлік Interface қызметші сөзінен кейін ашылады. Бұл бөлік модульдің барлық глобальды объектілерін (типтер, тұрақтылар, айнымалылар және қосалқы программалар) хабарлаудан тұрады және олар негізгі программада немесе басқа модульде пайдаланылуы мүмкін. Интерфейстік бөлікте глобальды қосалқы программаларды хабарлауда тек олардың тақырыбы көрсетіледі. Мысалы,

Unit Cmplx;

Interface

Type

Complex=record



Re,im:real

End;


Function Add(x,y:Complex):Complex;

Function MulC(x,y:Complex):Complex;

Енді басқа модульде Uses Cmplx;

сөйлеміін жазатын болсақ, онда Complex типімен және Cmplx модулінен екі процедураны AddC және MulC пайдалануға мүмкін болады.



Орындалатын бөлік

Орындалатын бөлік Implementation қызметші сөзінен басталады және интерфейстік бөлікте хабарланған қосалқы программалардың бейнеленуінен тұрады. Мұнда модуль үшін жергілікті объектілер — қосымша типтер, тұрақтылар, айнымалылар және қосалқы программалар, сондай-ақ, белгілер хабарлануы мүмкін.

Модульдің интерфейстік бөлігінде хабарланған қосалқы программалардың сипаттамасы орындалатын бөліктегі тақыраптың алдында тұруы керек, оған формалды айнымалылар тізімі жазылады. Егер қосалқы программаның типті толық түрде жазылатын болса, яғни формальды параметрлер тізімі мен нәтиженің хабарлануы жазылса, онда ол интерфейстік бөлікте жазылған тақырыппен сәйкес келуі тиіс.

Unit Cmplx;

Interface

Type


Complex=record

Re,im:real

End;

Function Add(x,y:Complex):Complex;



Function MulC(x,y:Complex):Complex;

begin


...

End;


Function MulC;

begin


...

End;


End.

Орындалатын бөліктегі тақырыптың қайталануы толық, әрі нақты болуы қажет. Егер біз

Function Add(x,z:Complex):Complex;

begin


...

End;


тақырыбын пайдалансақ, онда бізге интерфейстік бөлікте хабарланған функция тақырыбының сәйкес келмейтіндігі жөнінде хабарлайтын еді (екінші параметр У болуы қажет).

Инициализацияланатын және аяқталатын бөлік

Инициализацияланатын және аяқталатын бөлік көпшілік жағдайда initialization және finalisation сөздерімен бірге болмауы мүмкін. Инициализацияланатын бөлікте басқаруды негізгі программаға бергенге дейінгі операторлар орналасады, әдетте ол жұмысқа дайындау үшін пайдаланылады. Мысалы, ондағы айнымалылар оқылып, қажетті файлдар оқылуы қажет. Аяқталатын бөлікте негізгі программаның жұмысы аяқталғаннан кейін орындалатын операторлар көрсетіледі. Егер инициализацияланатын бөлікте бірнеше модульдер болатын болса, онда бұл бөліктер Uses сөйлеміндегі келтірілген ретпен бірінен соң бірі орындалады. Егер бірнеше модульдің аяқталатын бөлігі болатын болса, онда бұл бөліктер Uses сөйлемідегі келтірілген ретке кері, яғни алдымен ең ішкі орналасқан — бірінен соң бірі орындалады.



ТАПСЫРМА:

Тапсырма №1. Комплекс сандар арифметикасын орындайтын модуль құрайық.

Тапсырма №2. Y(x)=(1-) функциясының мәнін кесте түрінде шығаратын және оны қосынды түріндегі қатарға жіктейтін программа құрайық. Мұндағы Х-тің мәндері Хn-нен Хк-ға дейін h=(x-x)/10 қадаммен өзгеретін болсын. У(Х)-тің мәнін есептеу функция түрінде, ал S(X)-тің мәнін есептеу процедура түрінде ұйымдастырылсын. Модуль жоба қосылып, құрылған қосымшада орындалатын болсын.
Тапсырманы орындауға әдістемелік нұсқаулар:

Тапсырма №1.Ол үшін Delphi-дің 6-нұсқасында комплекс сандар мен амалдар орындайтын пайдаланушының варианты қарастырылады. Комплекс сандар арифметикасы төрт функция арқылы орындалады:

Unit Cmplx;



Interface

Type


Complex=record

Re,im:real

End;

Function Add(x,y:Complex):Complex;



Function SubC(x,y:Complex):Complex;

Function MulC(x,y:Complex):Complex;

Function DivC(x,y:Complex):Complex;

Const C: Complex=(re:0,1; im:-1);



Implementation

Function Add(x,y:Complex):Complex;

// Комплекс сандарды қосу

begin


Result.re:=x.re+y.re;

Result.im:=x.im+y.im

End;//AddC

Function SubC(x,y:Complex):Complex;

// Комплекс сандарды азайту

begin


Result.re:=x.re-y.re;

Result.im:=x.im-y.im

End;//SubC

Function MulC(x,y:Complex):Complex;

// Комплекс сандарды көбейту

begin


Result.re:=x.re*y.re-x.im*y.im;

Result.im:=x.re*y.im-x/im*y.re

End;// MulC

Function DivC(x,y:Complex):Complex;

// Комплекс сандарды бөлу

var z:real;

begin

Z:=sqr(y.re)+sqr(y.im);



// Z=0 болған жағдайдағы программаның қорғалуы

try


Result.re:=(x.re*y.re+x.im*y.im)/z;

Result.im:=(x.re*y.im-x,im*y.re)/z;

Exept

Result.re:=1,1e309;



Result.im:=1,1e309;

End//DivC

End.

Мұндай модуль құру үшін File-New-Unit опциясын шақыру қажет. Модуль мәтіні cmplx.pas файлында сақталынады: файл аты модуль атымен сәйкес келуі тиіс. Тек сонда ғана Delphi модульді автоматты түрде тауып, оны жаңартады.



Модуль құрғаннан кейін Uses сөйлемінде жаңадан құрылған қосалқы программалар, типтер, тұрақтылар да пайдаланылатын атауды ескерту қажет (біздің модульде complex типі, AddC, SubC, MulC, DivC қосалқы программалары және C тұрақтысы пайдаланылады). Оқу программасының bbRun батырмасын әрбір басқан сайын төрт арифметикалық амал орындалатын екі кездейсоқ комплекс сан құрылады. Оның bbRunClick оқиға өңдеуші төмендегідей болады:

Implementation

Usescmplx;

Procedure Tform1.BbRunClick(Sender:TObject);

var x,y,z:complex;

Procedure Output(Operation:Char);

var S:String;

Begin Case Operation of

'+':z:=AddC(x,y);

'-':z:=SubC(x,y);

'*':z:=MulC(x,y);

'/':z:=DivC(x,y);

end;


S:='('+FormatFloat('+0,0000;-0,0000',x.re)+' FormatFloat('+0,0000j;-0,0000j',x.im)+')'+ Operation+'('+ FormatFloat('+0,0000;-0,0000',y.re)+' FormatFloat('+0,0000j;-0,0000j',y.im)+'='+FormatFloat('+0,0000;-0,0000',z.re)+ FormatFloat('+0,0000j;-0,0000j'x.im);

MmOutput.Lines.Add(S);

End;//Output

begin//BbRunClick

x.re:=random;

x.im:=random;

x.re:=random;

x.im:=random;

Output('+');

Output('-');

Output('*');

Output('/');

MmOutput.Lines.Add(' ');

End;


Орындалатын бөліктің басындағы Uses cmplx сілтемесі cmplx модулінің объектілерін bbRunClick оқиға өңдеуші мүмкін жасайды. Delphi ортасында бұл сілтемені File-Use-Unit опциясын таңдап, пайда болған терезеден cmplx модулінің атын белгілеу арқылы қоюға болады.
Тапсырма №2. Алдымен құрылатын қосымшаның интерфейсін жасау үшін формаға: Label1, Label2, Label3, Edit1, Edit2, SpinEdit1, Button1, Memo1, Button2 компоненттерін орналастырайық. Қосымшаның орындалу нәтижесі 7.2- суретте келтірілген.

Есеп шартына сәйкес, У(Х)-тің мәнін есептеуді функция түрінде, ал S(X)-тің мәнін есептеу процедура түрінде жүзеге асыратын модуль құрайық. Модуль құру үшін бас менюден файл-құру-модуль (Файл-Создать-Модуль)

командаларын орындаймыз. Нәтижесінде бос Unit2 модулі бар терезе ашылады. Содан кейін жоба файлдары сақталған папкаға модульді «UnFuncProc» деген атпен сақтаймыз. Модульдің мәтіні төмендегідей:

unit UnFuncProc;

interface

var n:integer;

Function F(x:extended):extended;

Procedure Sum(x:extended; Var s:extended);

implementation

Function F(x:extended):extended;

begin

F:=(1-x*x*0,5)*cos(x)-0,5*x*sin(x);



end;

Procedure Sum(x:extended; Var s:extended);

var c: extended;

k:integer;

begin

c:=-x*x*0,5;



s:=1;

for k:=1 to n do

begin

s:=s+c*(2*k*k+1);



c:=c*x*x/((2*k+2));

end; end;

end.

«UnFuncProc» модулін жобаға қосу үшін файл-модульді пайдалану командаларын орындаймыз. Нәтижесінде модульді пайдалану сұхбат терезесі ашылады. Бұл терезеде модульдер тізімі орналасады. Біздің жағдайда бір ғана «UnFuncProc» модулі бар, Ок батырмасын басамыз. Одан кейін негізгі Unit1 модуліндегі implementation бөлімінде Uses UnFuncProc операторының орналасқанына көз жеткізуіміз қажет (мұны Delphi өзі автоматты түрде қояды).



Жобаның негізгі файлының мәтіні төмендегідей:

unit ;


interface

Uses


Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialofs, Spin;

type


Tform1=class(Tform)

Label1: Tlabel;

Label2: Tlabel;

Label3: Tlabel;

Edit1:TEdit;

Edit2:TEdit;

SpinEdit1:TSpinEdin;

Button1:TButton;

Memo1:TMemo;

Button2:TButton;

Procedure FormCreate(Sender:TObject);

Procedure Button1Click(Sender:TObject);

Procedure Button2Click(Sender:TObject);

private {private declarations}

public {publicdeclarations }

end;


Type

func=Function(x:extended):extended;

proc=Procedure(x:extended; Var s:extended)

var


Form:TForm1;

implementation

uses UnFuncProc; {$R*.dfm}

Procedure Tform1FormCreate(Sender:TObject);

begin

SpinEdit1.text:='4';



Edit1.text:='5';

Edit2.text:='6';

Memo1.Clear;

Memo1.Lines.Add('Модуль құру');

end;

procedure Tabl(Sum:proc;F:func;n:integer;Xn,Xk,h:extended);



var x,y,s:extended;

begin


Form1.Memo1Lines.Add(#9+'x'+#9+'y');

x:=Xn;


repeat

Sum(x,s);

y:=F(x);

Form1.Memo1Lines.Add(#9+FloatToStrF(x,ffFixed,5,2)+#9+ FloatToStrF(s,ffFixed,6,3)+#9+ FloatToStrF(y,ffFixed,6,3));

x:=x+h;

until x>Xk;



end;

Procedure TForm1Button1Create(Sender:TObject);

var Xn,Xk,h:extended;

begin


n:=StrToInt(SpinEdit1.Text);

Xn:=StrToFloat(Edit1.Text);

Xk:=StrToFloat(Edit2.Text);

h:=(Xk-Xn)*0,5;

Tabl(Sum,F,n,Xn,Xk,h); end;

Procedure TForm1Button2Create(Sender:TObject);

begin

close;


end; end.



7.2-сурет. Модуль құру терезесі
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:

  1. Object Pascal тіліндегі кластар дегеніміз не?

  2. Кластың басқа типтерден қандай айырмашылығы бар?

  3. Кластар негізінде қандай іргелі ұғымдар анықталады?

  4. Инкапсуляция дегеніміз не?

  5. Мүрагерлік принципі дегеніміз не?

  6. Object Pascal тілінің барлық кластары қандай ата-аналық кластан тарайды?

  7. Delphi ортасындағы кластар тармағын қалай сипаттауға болады?

  8. Полиморфизм дегеніміз не?

  9. Өріс дегеніміз не?

  10. Әдістер дегеніміз не және олар қалай бейнеленеді?

  11. Әдістерді динамикалық және статикалық ауыстыруды қалай түсіндіруге болады?

  12. Әдісті алмастыру қандай директивамен хабарланады?

  13. SHOW және HIDE әдістерінің қызметі қандай?

  14. Динамикалық және вертуалдық әдістердің арасында қандай айырмашылық бар?

  15. Конструктор және деструктор әдістерінің қызметі қандай?

  16. Бір атаулы әдістер дегеніміз не?

  17. Бір атаулы әдісті хабарлау үшін қандай қызметші сөз пайдаланылады?

  18. Қасиеттер дегеніміз не?

  19. Қасиеттер қандай қызметші сөздердің көмегімен хабарланады?

  20. Delphi ортасындағы кластардың хабарлауына сипаттама беріндер?

  21. Public, Private, Protected, Automated секцияларының қызметі қандай?

  22. Интерфейс дегеніміз не?

  23. Интерфейс қандай қызметші сөзбен хабарланады?

  24. Интерфейстің кластан айырмашылығы қандай?

  25. Интерфейсте хабарланған мүшелер қай секцияларда орналасады?

  26. Әдеттегі кластан интерфейстік кластың айырмашылығы қандай?

  27. Интерфейстік кластар қандай аталықтан туындайды?


Зертханалық жұмыс №13
Тақырыбы: Варианттар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Вариант бұл компиляция кезеңінде программист өрнектегі қандай да бір мәліметтер типін немесе қосалқы программаны шақыру параметрін көрсете алмаған жағдайда пайдалануға болатын, арнайы жасалған Variant типі. Вариант айнымалысы жадыдан қосымша 2 байт орын алады, онда айнымалының нақты типі жөніндегі ақпарат орналасады. Бұл ақпарат программаны жүргізу кезеңінде типтерге қажетті түрлендіруді жүзеге асыратын компиляторға кодты құру мүмкіндігін береді.

Вариант айнымалысына:


  • бүтін және нақты санды;

  • логикалық мәнді;

  • жолды;

  • уақыт немесе датаны;

  • OLE объектісін;

  • Элементі жоғарыда аталған типтердің бірінен құралатын, өлшемі мен ұзындығы еркін алынған массивті орналастыруға болады.

Варианттар сәйкес түрлендіру нақты болған жағдайда бүтін санды, нақты, логикалық немесе уақыт және дата өрнектеріне қатыса алады. Мысалы, егер кез келген V вариантына ‘1.0’ жолы меншіктелсе, 1+v өрнегінің дұрыс нақты мәні 2.0 болады. Ал, егер v:= ‘Текст’ болса, 1+v өрнегі EVariantError қатесін шақырады.

Варианттық типтің құрылымы төмендегідей сипатталады:

TVarData=packed record

VType:Word;

Reserved1, Reserved2, Reserved3:Word;

Case Integer of

VarSmallInt:(VSmallInt:SmallInt);

VarInteger:(VInteger:Integer);

VarSingle:(VSingle:Single);

VarDouble:(VDouble:Double);

VarCurrency:(VCurrency:Currency);

VarDate:(VDate:Double);

VarOLEStr:(VOLEStr:PWideChar);

VarDispatch:(VDispatch:Pointer);

VarError:(VError:WordBool);

VarString:(VSting:Pointer);

VarArray:(VArray:PVarArray);

VarByRef:(VPointer:Pointer);

End;

Варианттық типі кез келген айнымалы 8 байттық варианттық бөліктен тұратын 16 байттық жазу болып келеді, ол өзіне мәліметті немес адресті (яғни динамикалық орналасқан мәліметтерге сілтеме) сақтайды. Кез келген VType өрісіне компилятор вариант құру мезетінде мәліметтердің жоқ екендігі туралы VarEmpty белгісін орналастырады. Орындалатын программада бұл өрістің мәні варианттық бөлікте орналасқан ағымдағы мәліметтер типіне сәйкес өзгереді. Бұдан программа вариант жазуының өрісіне тікелей кіре алмайды. Варианттық мәліметтер типін VarType функциясының көмегімен алуға болады, ал типті вариантқа жаңа мән меншіктеу жолымен өзгертуге болады.


1   ...   8   9   10   11   12   13   14   15   16


©dereksiz.org 2016
әкімшілігінің қараңыз

    Басты бет