Нысан конструкторлары
Нысандардың қашан және қалай жасалатынын қарастырайық, яғни оларға қашан жады бөлінеді және бастапқы меншіктеу жүргізіледі. Әдеттегі айнымалыларға келетін болсақ екі нұсқа мүмкін болар еді: статикалық және динамикалықайнымалылар. Егер айнымалы статикалық болса, сәйкес блоктың орындалар алдында олар үшін автоматты түрде жады бөлінеді – ауқымды айнымалылар үшін бағдарлама жүктелгенде және жергілікті айнымалылар үшін процедураны шақыру кезінде. Егер айнымалы динамикалық болса, онда ол үшін жады new операторын шақыру арқылы қолдан бөлінеді. Класс типті айнамалылар Object Pascal-да статикалық сияқты сипатталады:
Var AMyObject:TMyObject;
Бірақ осы тілде олар тек динамикалық бола алады. Бұл AMyObject айнымалысының нысан адресін қамтитын нұсқауыш екенін және қолдан бөліну керек екенін білдіреді. Дегенмен әдістер мен өрістерге қатынас (^) символын қолданусыз орындалады. Басқа нысанды-бағдарланған тілдерде, мысалы, С++-те бұлай емес. Оларда статикалық та және динамикалық нысандар да болуы мүмкін. Статикалық нысандар автоматты түрде, ал динамикалық – қолдан құрылады. Нысанды жасау нысанды инициализациялайтын арнайы әдісті - конструкторды шақыру жолымен жүзеге асырылады. Жасалған экземпляр басқа әдіспен – деструктормен жойылады.
Конструктор – қажетті нысанды жасайтын және инициализациялайтын арнайы әдіс. Конструктордың сипаттамасы процедураның сипаттамасына ұқсас, бірақ constructor сөзінен басталады. Мысалы:
Constructor Create;
Constructor Create(AOwner:TComponent);
Сипаттамада айнымалы типі көрсетілмесе де, конструкторды класс атауы арқылы шақырғанда, ол құрылған нысанға сілтемені қайтарады.
Класстың бірден артық конструкторы болуы мүмкін, бірақ бір ғана конструкторы да болуы мүмкін. Әдетте конструктор атауы Create.
Нысан құру үшін конструктор класс атауын көрсету арқылы шақырылады. Нысан емес, дәл осы класс атауы (яғни, айнымалы емес, типі), себебі нысан әлі құрылған жоқ.
Нысанды құру мысалы:
Var MyObject:TMyObject;
MyObject:=TMyClass.Create;
Осы кезде келесі әрекеттер орындалады:нысан өрістеріне динамикалық жады бөлінеді, барлық скаляр өрістердің мәндері үшін 0 орнатылады, класс типінің барлық нұсқауыштары мен өрістеріне nil орнатылады, жол типті барлық өрістерге «бос жол» мәні меншіктеледі. Ары қарай конструкторда сипатталған әрекеттер орындалады. әдетте бұл нысан өрістерін инициализациялау. Мұнда тек нольдік емес және бос емес өрістерді инициализациялау қажет, ал қалғаны автоматты түрде инициализацияланады. Боған соң конструктор жаңа ғана бөлінген және инициализацияланған нысанға нұсқауышты қайтарады. Қайтарылатын мәннің типі конструктор шақырылған класс типіне сәйкес келеді.
Егер конструктор айнымалы атауы арқылы шақырылған жағдайда - нысанға сілтеме жасалғанда, класс атауы арқылы шақырылған жағдайдан айырмашылығы – жаңа нысан жасалмайды, сәйкесінше конструктор мән қайтармайды. Конструктор денесінде сипатталған әрекеттер ғана орындалады.
Конструкторлар бірнешеу болуы мүмкін. Бұл кезде overload қызметші сөзі қолданылады, ол әдісті қайта жүктелетіндей мүмкіндік береді. Қайта жүктелуді алдыңғы дәрістерде қарастырамыз.
Конструктордың үш нұсқасы болады: үнсіз келісім бойынша конструтор, инициализациялау конструкторы және көшіру конструкторы:
- үнсіз келісім бойынша конструктордың әдетте параметрлері болмайды және нысан өрістеріне үнсіз келісім бойынша мәндер береді.
- инициализациялау конструкторы нысан өрістеріне меншіктелетін мәндерді параметр ретінде алады.
- көшіру конструкторы параметр ретінде сондай типті нысанға нұсқауыш алады да, өзінің өрістеріне алынған нысанның өрістерінің мәндерін меншіктейді. Яғни нысан қалпы көшірілгендей болады. Конструкторларды қолдану мысалы:
Type
TMyObject = class;
Property A:integer read GetA write SetA;
Property B:integer read GetB write SetB;
Property C:real read GetC write SetC;
constructor Create; overload; {үнсіз келісім бойынша}
constructor Create (pA,pB,pC: integer); overload; {инициализациялау}
constructor Create(CopyMyObject:TMyObject); overload; {көшіру}
…
end;
constructor TMyObject.Create;
begin
A:=1;
B:=1;
{C 0-ге тең болып қала береді}
end;
constructor TMyObject.Create(pA,pB,pC:integer);
begin
A:=pA;
B:=pB;
C:=pC;
End;
constructor TMyObject.Create(CopyMyObject:TMyObject);
begin
A:=CopyMyObject.A;
B:=CopyMyO bject.B;
C:=CopyMyObject.C;
End;
. . .
Var
A1MyObject:TMyObject;
A2MyObject:TMyObject;
A3MyObject:TMyObject;
Begin
A1MyObject:=TMyObject.Create; {үнсіз келісім конструкторы}
A2MyObject:=TMyObject.Create(10,20,0.5); { инициализация конструкторы }
. . .
A1MyObject.B:=1000;
A3MyObject:=TMyObject.Create(A1MyObject); {көшіру конструкторы}
. . .
End;
A1MyObject нысанын құру кезінде оның өрістері (1,1,0) мәндерін алады, A2MyObject нысанын құру кезінде оның өрістері – (10,20,0.5) мәндерін алады, A3MyObject нысанын құру кезінде оның өрістері – (1,1000,0) мәндерін алады.
Нысан деструкторлары
Нысандар, яғни класс типті айнымалылар конструкторды шақыру арқылы жасалады. Object Pascal-да барлық класс типті айнымалылар динамикалық, сондықтан констрнуктор айқын түрде шақырылуы керек. Класс типті статикалық айнымалылар үшін конструкторды шақыру автоматты түрде орындалады. Кез-келген жағдайда конструкторды шақыру кезінде нысан өрістеріне жады тарату мен параметрлерді инициализациялау жүргізіледі. Ал таратылған жады бос болу керек. Және де тікелей нысандардың өрістері алып тұрған жады да, сол сияқты өздері алып тұрған динамикалық жады да босатылуы керек. Сол сияқты қолданылатын ресурстар да, мысалы файлдар босатылуы керек. Осы амалдар деструкторлар арқылы жүзеге асырылады. Динамикалық нысандар үшін деструкторлар айқын түрде шақырылуы керек.
Деструктор — бұл өзі шақырылған нысанды жойып, жадыны босататын арнайы әдіс. Деструктордың сипаттамасы процедура сипаттамасы сияқты destructor сөзінен басталады.
Мысалы: destructor Destroy;
Класс біреуден артық деструкторға ие бола алса да, әрбір класс үшін бір ғана Destroy деп аталатын деструктор болуы ұсынылады.
Деструкторды жойылуға тиіс нысан арқылы шақыру керек (конструктордағы сияқты сияқты класс арқылы емес). Мысалы:
Var
MyObject:TMyObject;
. . .
MyObject.Destroy;
Деструторды шақыру кезінде алдымен деструкторда сипатталған операторлар шақырылады. Әдетте олар нысан өрістері сілтеме жасайтын динамикалық жадыны босатудан және нысан үшін берілген ресуртсарды босатудан тұрады, мысалы файлдарды жабу. Содан кейін, нысаның өзі үшін берілген жады босатылады. Object Pascal-да нысандарды жою үшін мұраға алынған Free әдісі қолданылады, ол алдымын нұсқауышты тексереді (оның nil-ға теңдігін ), содан кейін Destroy шақырады.
Мысал келтірейік. Стек класының сипаттамасын деструктордың алдыңғы мысалдарымен толықтырайық.
1. Массивтегі стек.
TSObStack = class(TObject)
Stack:array[1..1000] of TElem;
Top:integer;
Constructor Create; {үнсіз келісім бойынша}
Destructor Destroy;
procedure InStack(Elem: TElem}:boolean;
function OutStack(var Elem:TElem):Boolean;
end;
Constructor TSObStack .Create;
Begin
Top:=0; {жасамауға да болар еді}
{үнсіз келісім бойынша конструктор қажет емес}
End;
Destructor TSObStack.Destroy;
Begin
{ешқандай әрекеттер қажет емес}
End;
2. Динамикалық стек
TDObStack=class(TObject)
Top:TERef;
Constructor Create; {үнсіз келісім бойынша}
Destructor Destroy;
procedure InStack(Elem: TElem}:boolean;
unction OutStack(var Elem:TElem):Boolean;
end;
Constructor TDObStack .Create;
Begin
Top:=nil; {жасамауға да болар еді}
{ үнсіз келісім бойынша конструктордық қажеті жоқ}
End;
Destructor TDObStack.Destroy;
Var
Elem:TElem;
Begin
While OutStack(Elem) do;
End;
Қолданылуы:
Var
DStack:TDObStack;
SStack:TSObStack;
. . .
A:TElem;
Begin
DStack:=TDObStack.Create;
SStack:=TSObStack.Create;
{қолданылуы}
DStack.Destroy;
SStack.Destroy
End.
Конструкторлар мен деструкторлар туралы қорытындылай отырып, келесіні айту керек: егер нысан болып табылатын стандартты визуалды компонеттері көп Object Pascal-да жазылған кез-келген программаны алатын болсақ, онда конструкторлар мен деструкторларды көрмейсіздер. Мәселе мынада: визуалды жобалау кезіндегі қолданбаға компоненттер палитрасынан қойылған кез-келген компонент белгілі бір иерархияға қосылады. Бұл иерархия формада тұйықталады: оның барлық құраушы бөліктері үшін конструкторлар мен деструкторлар бағдарламалаушыға көрінбей шақырылады. Форманың өзінің жасалуы мен жойылуы үшін қолданба жауап береді (Application атты ауқымды нысан). Жоба файлында (DPR кеңейтілуі бар) Application. CreateForm әдісінің шақырылуын көре аласыздар. Динамикалық түрде (қолданба орындалуы кезінде) жасалатын нысандарға қатысты алғанда, онда мұнда конструкторлар мен деструкторларды немесе Free әдісін айқын шақыру керек.
Дәріс №3. Класстар. Класстарды құрудың негізгі құралдары. Класстарды құрудың қосымша құралдары.
Object Pascal тіліндегі кластар деп өрістен, әдістен және қасиеттерден тұратын арнайы типтерді айтады. Кез-келген басқа типтер тәрізді класс объект деп аталатын нақты экземплярды құру қызметін атқарады. Turbo Pascal жүйесіндегі жасалған программалармен үйлесімділікті сақтау үшін жүйені құрушылар Object Pascal тіліндегі бұрынғы объектілі модельді сүйемелдейтін Object – объект типін қалдырған. Кластың басқа типтерден басқа маңызды айырмашылығы кластың объектілері барлық уақытта топқа бөліне алады. Сондықтан объект айнымалылар жадының динамикалық бөлігінде көрсеткіштің рөлін атқарады. Дегенмен, басқа көрстекіштерден айырмашылығы объектінің мазмұнына сілтемеде объектінің атауынан кейін «^» символын пайдалануға болмайды:
Type
TmyClass=class(TObject)
Field: Integer;
…
end;
var
MyClass: TmyClass;
begin
…
MyClass^.Field:=0; // Қате! Ол былай жазылуы тиіс.
MyClass.Field:=0;
…
end.
Кластың құраушылары
Өріс
Өріс деп кластағы инкапсуляцияланған мәліметтерді айтады. Өріс кез келген типті болуы мүмкін, оның ішінде класта болуы мүмкін;
Мысалы:
type
TMyClass=class
AIntField:integer;
AstrField:String;
AObjectField:Tobject;
……………
End;
Әрбір объект өрістер жиынтығын алады, бірақ осы кластың барлық объектілері үшін жалпы қасиеттер мен әдістер жиынтығы бар. Инкапсуляцияның іргелі принципі өріске кластың әдістері мен қасиеттерінің көмегі арқылы қатынас жасау керектігін талап етеді. Бірақ Object Pascal тілінде өріске тікелей шығуға рұқсат етіледі.
type
TMyClass=class
AIntField:integer;
AstrField:String;
AObjectField:Tobject;
……………
End;
Var aObject. TMyClass;
Begin
……………
AObject.FindField:=0;
AObject.FStrField:=’символдар жолы’;
………………….
end;
Класс- ұрпақ өзінің барлық аталарынан барлық өрістерді ала алады және оны өзінікімен толықтырады, бірақ алдын ала анықтай алмайды немесе өшіре алмайды. Сөйтіп, тармақ иерархиясында класс қаншалықты төмен орналасса, соншалықты оның объектілерінен мәліметтер ала алады.
Әдістер
Класта инкапсуляцияланған процедуралар мен функциялар әдістер деп аталады. Олар әдеттегі қосалық программалар тәрізді хабарланады:
Тype TMyClass=class
Function MyFunc(aPar:Integer):integer;
Procedure MyProc;
End;
Кластың әдістеріне кіру оның өрістеріне кіргендей құрама атаулардың көмегімен жүзеге асырылады.
Var
AObject:TmyClass;
Begin
………
AObject:MyProg;
………
end;
Жоғарыда айтылғандай кластың әдістері ұрпақтарында жабылып тұруы мүмкін. Мысалы,
Type
TparentClass=Class
Procedure DOWork;
End;
TChildClass=Class(TParentClass);
Procedure DOWork;
End;
Екі кластың ұрпақтары да DOWork процедурасының атауы бойынша ұқсас әрекеттерді орындау мүмкін. Бірақ, бұл жалпы жағдайда әртүрлі орындалады. Әдістерді мұндай ауыстыру статикалық деп аталады, яғни компилятормен программаны жүргізу кезеңінде жүзеге асырылады. Object Pascal тілінде программаны жүргізу кезеңінде әдістерді динамикалық ауыстыру жиі пайдаланылады. Мұны жүзеге асрыу үшін аталық класта оранласқан әдіс динамикалық (dynamic директивасымен) немесе виртуалды (virtual) түрде хабарлануы тиіс. Осындай хабарлауды кездестіргеннен кейін компилятор екі кесте құрады: DMT (Dynamic Method Table) және VMT (Virtual Method Table), оларды сәйкес динамикалық немес виртуалдық әдістердің кіру нүктесіндегі адреске орналастырады. Әрбір ауыстырылатын әдіске оралған компилятор сәйкес кестелердің бірінен қосалқы прогаммаға кіру нүктесінің адресін шығаруға мүмкіндік беретін кодты қояды.
Класс ұрпағына әдісті алмастыру override (жабу) директивасымен хабарланады. Осы нұсқауды алғаннан кейін, компилятор программаны жүргізу кезеңінде ата-аналық кестесіне класс-ұрпақ әдісінің кіру нүктесін орналастырады, ал аталыққа жаңа әдістің көмегімен қажетті әрекетті орындауға мүмкіндік береді.
Мысалы, аталық класс Show және Hide әдістерінің көмегімен экранда бейнені көрсетеді немесе жасырады. Бейнені құру үшін длогикалық параметрі бар DRAW әдісін пайдаланады:
Type
TVisual Object=class(TWinControl)
Procedure Hide;
Procedure SHOW;
Procedure DRAW(IsSHOW:Boolean):Virtual;
End;
TVisualChildObject=class(TVisual Object)
Procedure DRAW(IsSHOW:Boolean):override;
end;
Show және Hide әдістерінің жүзеге асырылуы өте қарапайым:
Procedure TVisual Object.SHOW;
Begin
DRAW(True);
End;
Procedure TVisual Object.Hide;
Begin
DRAW(false);
End;
Аталық және ұрпаққа DRAW әдісінің жүзеге асырылуы әртүрлі және әртүрлі бейнелер құрылады. Нәтижесінде, SHOW және Hide аталық әдістері - өзінің кез келген ұрпағындағы DRAW әдісінің нақты жүзеге асырылуына тәуелді болады. Динамикалық байланыстыру толығымен кластар полиморфизмін жүзеге асырады.
Динамикалық және виртуалдық әдістердің арасындағы айырмашылығы- динамикалық әдістер кестесінде осы класта тек dynamic ретінде хабарланған әдістер адрестері болады, ал виртуалдық кестесінде сол кластын вертуалдық әдістерімен қатар, оның барлық аталықтарының да адрестері сақталады. Көлемі айтарлықтай VMT келесі жылдам іздеуді жүзеге асырады, сондай-ақ, динамикалық әдіске оралғанда программа алдымен DMT объектінің кестесін қарап шығады, одан кейін аталық класын қажетті кіру нүктесі табылғанша іздейді.
Динамикалық жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай әдістер абстрактылы әдістер деп аталады, олар ұрпақтарында жабылуға міндетті. Прогаммист abstract директивасымен хабарлау арқылы абстракт әдісі шығаруға тосқауыл қоя алады. Мысалы:
Type
TvisualObject=class(TWinControl)
….
Procedure DRAW(IsSHOW:Boolean);
Virtual;abstract; end;
TVisualChildObject=class(TWinControl)
......
Procedure DRAW(IsSHOW:Boolean):override;
End;
Var
aVisualObject:TvisualObject;
aVisualChild:TvisualChildObject;
begin
…
aVisualObject.SHOW; {қате / Абстракт әдіс шақырылды}
aVisualChild.SHOW {Шақыру дұрыс. TVisualChildObject класындағы DRAW әдісі жабылған}
End;
Жабылмаған абстракт әдісті шақыру орындалу барысында қате болып есептеледі. Сауатты құрылған прогрммада абстракт әдіс шақырылмайды.
Кез-келген класстың құрамына екі арнайы әдіс кіреді: конструктор және деструктор. Tobject класында бұл әдістер Create және Destroy деп аталады. Конструктор динамикалық жадыда объектілерді үлестіреді және жадының осы адресіне SELF айнымалысын орналастырады, ал автоматты түрде класта хабарланады. Конструктор және деструктор процедура болып табылады, бірақ Constructor және destructor қызметші сөздерінің көмегімен хабарланады:
Type
TMyClass=class
IntField:integer;
ConstructorCreate(Value:integer);
Destructor Destroy;
End;
Көптеген конструкторлар объектінің дұрыс жұмыс істеуіне қажетті қандай да бір әрекетті орындайды. Сондықтан класс ұрпақ конструкторында алдымен өзінің аталық конструкторын шақыру қажет, одан кейін қосымша әрекеттер жүзеге асырылады. Аталық кластағы кез-келген әдісті шақыру Inherited (мұрагер) қызметші сөзінің көмегімен жүзеге асырылады:
Constructor TMyClass.Create (Value:integer);
Begin
InheritedCreate; // Мұрагер конструкторды шақыру
Inherited:=Value //Қосымша әрекетті орындау
End;
Кейбір әдістер объектіні құрмай және иницилизация жасамай-ақ шақырылуы мүмкін. Мұндай әдістер кластың әдістері деп аталады, олар Class қызметші сөзінің көмегімен шақырылады.
Type
TMyClass=class(TObject)
Class Function GetClassName:String;
End;
S:string;
Begin
S:=TmyClass.GetClassName;
…..
End;
Кластың әдістері өрістерін шақыра алмайды, жалпы жағдайда объект құрмай –ақ шақырылады. Әдетте класс туралы қызметші ақпаратпен шектеледі: класс аты, аталық класс аты, әдістің адресі және т.б.
Бір атаулы әдістер
Бір кластың шеңберінде бірнеше бір атаулы әдістерді пайдалануға болады. Жоғарыда сипатталған аталық әдісті жабу тәсілі ұрпақтың жабылған аталық әдісті «көрмеуіне» әкеледі. Оны тек Inherited қызметші сөзінің көмегімен шақыруға болады.
Бір атулы әдіс табылатын болса, Delphi компиляторы класта осыған ұқсас әдіс басқа параметрмен келтірілгендігі туралы ескертеді.
Бір атаулы әдісті хабарлау үшін reintroduce қызметші сөзі пайдаланылады.
Келесі мысалда TForm 1 класында 4 бір атаулы әдіс-Close пайдаланылады. Олардың тек біреуі-параметрсіз мұрагер әдіс-өзінің негізгі қызметін атқарып, терезені жабады. Ал, қалған үшеуі параметржинағымен ерекшеленіп, терезе тақырыбына хабарлама шығарады.
Бос формаға төрт TButton батырмаларын орналастырып, оған OnClickын өңдеушілерін жазыңдар:
Procedure TForm1.Button1Click(Sender:TObject).
Begin
Close(“символдар жолы”)
End;
Procedure TForm1.Button2Click(Sender:TObject);
Begin
Close(123)
end;
Procedure TForm1.Button3Click(Sender:TObject);
Begin
Close(20,300)
end;
Procedure TForm1.Button4Click(Sender:TObject);
Begin
Close
end;
Енді Private бөліміне TForm1 класының хабарлануы үшін төмендегідей үш Close әдісін орналастыруға болады:
Private{ Private declaration}
Procedure Close (S:String); reintroduse; overload;
Procedure Close (I:Integer); reintroduse; overload;
Procedure Close (I,J:Integer); reintroduse; overload;
Одан кейін Implementation е хабарланған әдістердің сипатталуын жазыңдар:
Procedure TForm1. Close (S:String);
Begin
Caption:=S
End;
Procedure TForm1. Close (i:integer);
Begin
Caption:=IntToStr(i)
End;
Procedure TForm1. Close (i,j:integer);
Begin
Caption:=IntToStr(i*j)
End;грамма орындалғанда алғашқы үш батырма TForm1 класының Close әдісін шақырады және терезенің тақырыбы ауысады, сонымен қатар Button4 батырмасы тәрізді аталық TForm класының Close әдісін шақырып, терезені жабады.
Қасиеттер
Қасиеттер – бұл өріске кіру мүмкіндігін реттейтін кластардың арнайы механизмі.
Қасиеттер property, read және write қызметші сөздерінің көмегімен хабарланады (read және write сөздері тек қасиетті хабарлау контексінде пайдаланатын қызметші сөздер). Әдетте қасиет қандайда бір өріспен байланысты болады және осы өріске жазуда немесе одан оқуда пайдаланатын кластың әдістерін көрсетеді. Мысалы:
Type
TaClass=class
IntField:integer;
Function.GetField:integer;
Procedure SetField (Value&integer);
Property IntegerValue:integer read
GetField write SetField;
End;
Программа контексінде қасиет өзін әдеттегі өріс ретінде көрсетеді.
Сондай-ақ, төмендегідей операторларды жазуға болады:
Var
aClass:TaClass;
Value:integer;
Begin
aClass:=TaClass.Create {емесе қасиетті шақырар алдындағы конструктордың міндетті шақырылуы}
aClass.InterValue:=0;
…
Value:=aClass.InterValue;
…
aClass.Destory; // керек емес объектіні өшіру
Мұнымен бірге, төмендегідей меншіктеу операторының жазылуы мүмкін:
aClass.IntField:=NewValue;
Бұл оператормен төмендегі оператордың арасындағы айырмашылық-қасиетті шақырғанда SetField әдісі автоматты түрде қосылады және арнайы әрекеттер орындалады.
Оқу программасында келтірілген
LbOUTPUT.CAPTION:=’жол’
Операторын еске түсірейік.
Label компонентінің Caption қасиеті SetText әдісін шақырады, ол ішкі айнымалыдағы символдар жолын сақтап қана қоймай, жаңа мәтінді де еске сақтайды.
Егер қасиетті арнайы оқу немесе жазу үшін қажеттілік болмаса сәйкес әдістің атауының орнына өріс атауын көрсетуге болады:
Type
TaClass=class
IntField:integer;
Procedure SetField (Value:integer);
Property IntegerValue:integer read IntField write SetField;
End;
Егер қасиет тек оқу немесе жазу үшін ғана қажет болса, онда оған сәйкес бөлігін жазбауға болады. Қасиет өріспен байланыспауы да мүмкін.
Шынында, ол қасиеттің өзінің типіндей мәліметтерден қандайда да бір әрекетті жүзеге асыратын бір немесе екі әдісті сипаттайды.
Кластарды хабарлау
Жаңадан құрылатын кез келген класс төмендегідей қызметші сөздермен анықталатын секциялардан тұрады: Private (жабылған), protected (қорғалған), public (мүмкін) және automated (автоматтандырылған). Әрбір секцияның ішінде басында өріс, одан кейін әдістер мен қасиеттер анықталады.
Секциялар класы сипаттау элементтерінің көрінетін бөлінгін анықтайды. Public секциясы ондағы көрсетілген өрістердің көріну бөлігіне шектеулер жасамайды, әдістер мен қасиеттерді кез келген басқа программа модулінде шақыруға болады. Published секциясы көріну бөлігін шектемейді, бірақ мұнда тек орындалу кезеңінде ғана мүмкін болатын қасиеттер ғана емес, программа құру кезеңіндегі қасиеттер жащылады (яғни объектілір инспекторы терезесінде).
Published секциясы тек стандартты мес компоненттерді жасауда пайдаланылады. Delphi ортасы формаға орнатылған компоненттерді сипаттауды арнайы аты жоқ секцияғаорналастырады, ол класс тақырыбынан кейін жазылады да, бірінші хабарланған секцияға дейін жалғасады. Бұл секция Published деп аталады.
Private секциясы көріну бөлінген ең төменгі деңгейде дейін кішірейтеді: жабық элементтердің сипатталуы осы кластың ішіндегі, яғни класс сипатталған модульде орналасқан әдіс пен қосалқы программаға ғана пайдаланылады. Protected секциясы тек сол кластың әдістері үшін, сондай-ақ, кез келген оның ұрпақтары үшін пайдаланылады, бірақ оның орналасуына тәуелсіз.
Private секциясында хабарланған элмент, егер ол басқа модульде орналасқан болса, тіпті кластың жақын ұрпақтары үшін де пайдаланылмайды. Automated секциясы OLEін автоматтандыру интерфейсінде қосылатын қасиеттер мен әдістерді хабарлау үшін пайдаланылады; бұл секцияның мүшелерінің көріну бөлігі шектелмеген.
Object Pascal де кез келген секцияны бірнеше рет, яғни қажетіне қарай хабарлай беруге болады, секцияларды пайдаоанушы қалауынша орналастыруына болады. Кез келген секция бос болуы мүмкін. Келесі программа фрагменті секциялардың экрандағы көріну бөлігін сипаттайды.
Unit Unit1;
Interface
Uses Controls, Forms;
Type
TForm1=class(TForm)
Button1:TButton;
Private
FintField: integer;
Procedure SetValue(Value:Integer);
Function GetValue:Integer;
Published
Property IntField: read GetValue write SetValue
Protected
Procedure Proc1;
Public
Procedure Proc2;
End;
Var
Form1:TForm1;
Implementation
Procedure TForm1. Proc1;
Button1.Color:=clBtnFace;
FIntField:=0;
IntField:=0;
Proc1;
Proc2;
End;
Begin
Form1.Button1.Color:=clBtnFace;
Form1. FLintField:=0;
Form1. IntField:=0;
Form1.Proc1; //Бұл жазу қате!
Form1.Proc2;
End;
Unit Unit1;
Interface
Uses Controls, Unit1;
Type
TForm2=class(TForm1)
Button2:TButton;
Procedure Button2
Procedure Button2Click(Sender:TObject);
End;
Var
Form2:TForm2;
Procedure Tform2.Button2Click(Sender:TObject);
Begin
Button1,Color:=clBthFace;
FintField:=0; // Бұл жазу қате!
Proc1;
Proc2;
End;
Begin
Form1.Button1.Color:=clBthFace;
Form1.FintField:=0; // Бұл жазу қате!
Form1.IntField:=0;
Form1.Proc1;//Бұл жазу қате!
Form1.Proc2;
End;
Класс — ұрпақты хабарлауда класс элементтерін бір көріну бөлігінен басқа бөлігіне алмасиыруға болады. Алдыңғы мысал үшін төмендегідей хабарлауды жазуға болады:
Type
Tform2=class(TForm2)
...
Public
Procedure Proc1;
...
end;
Осындай хабарлаудан кейін Unit2 модулін былай шақыруға болады:
Form2.Proc1;
Private секциясына алмастыру жасағаннан кейін хабарлау элементі ұрпақтарына көрінбейді (егер ұрпақ басқа модульде хабарланған болса), онда кейін оны басқа секцияға орналастыруға болмайды.
Класс модульдің тек интерфейстік бөлігінде немесе жүзеге асырудың бастапқы кезеңінде хабарланады. Класты қосалқы программаның сипаттау бөлігінде анықтауға болмайды.
Дәріс №4. Қолданбалар пішімі. Пішімнің компоненттері.
Программалар жобасымен жұмыс істеу процесінде сізге формалар мен модульдер жиындығын құру қажет. Бұл мәліметтерді жеке папкада файлдар түрінде сақтаған дұрыс. Оның ішінде өзініздің жұмыс папканызды құруға болды. «My_fist_program» деген атпен папка құрыңыз, оның ішіне өздерініздің программанызды сақтайтын папка құрыңыз.
Екіншіден, Delphi ортасының стандартты келтірілген күйіне өзгеріс енгізу қажет. Бұл сіздің құрған программаңыздың соңғы нұсқасының автоматты түрде сақталу үшін керек.
Ол үшін Tools/Environment Options менюін таңданыз, пайда болған сұхбат терезесінде Preferences бетінің екеніне назар аударыңыз. Осы беттің сол жақ жоғарғы бұрышында Autosave Options тобында “Editor Files”және “Desktop” деген ауыстырып қосқыштары бар. Ауыстырып қосқыштары екпінді жасау- программа коды терезесінің мәтінін және Delphi терезесінің жалпы орналасуын автоматты түрде сақтайды. Бұл программаны жоғалудан қорғайды. Тышқанмен белгілеу арқылы осы ауыстырыа қысқыштарды екпінді жасаймыз. Компиляция барысын қадағалап отыру үшін Compiling және Running тобындағы Show Compiler Progress ауыстырып қосқышын екпінді жасаңыз. Сондай –ақ, программа кодына түсіндірмені – мәтін фрагменттерін сақтауға болады, ол программа жұмысына әсер етпейді, бірақ оның мәтінін түсінікті етіп көрсетеді. Мәтін шығару үшін шрифті тағайындау қажет:
Tools/ Editor Options Display бетінде Editor Font–қа Times New Roman шрифт түрін тағайындау қажет.
Енді алғашқы программаны жүргізуге бәрі дайын болды. Негізі терезеден батырмасын немесе F9 басқару клавишын басыңыз. Сонымен, Delphi ортасындағы программа үш кезеңнен өтеді: компиляция – компоновка – орындау.
Компиляция кезеңінде код терезесінде дайындалған программа мәтіні Object Pascal тіліне ауыстырылады; комппоновка кезеңінен дайын программа жедел жадыға шақырылып, орындалуға жіберіледі.
F9 клавишін басқаннан кейін Save Unit1 As сұхбат терезесі пайда болады, яғна Delphi Unit1.pas модулі үшін файлдфң аты мен ол орналысатын папканың атын сұрайды, сондай-ақ, модульдің де атын өзгерту қажет (немесе әрбір есепке жеке папка ашып, Save All командасы арқылы бәрін сақтаған дұрыс).
Delphi- дегі атаулары. Delphi- дегі атау латын әріптерінен басталатын әріптер, цифрлар және сызғыш болуы тиіс, атау цифрдан басталуы керек, ұзын атау бере беруге болады.
Форманың қасиеттерін өзгерту
Алдымен модуль ұғымына тоқталайық. Әрбір жаңа форма құрғанда модуль құрылады. Программаны компиляциялау кезінде Delphi заты .PAS, .DFM және .DCU болып келген файлдарды әрбір модуль үшін құрады: .PAS файл- программа коды терезесіндегі мәтін көшірмесінен тұрады; заты -.DFM файылында форма терезесінің мазмұны сақталады; ал файылында – екі файлдан алынған мәтінді машиналық нұсқауға түрлендіру нәтижесі сақталады. .DCU файлдары компилятормен құрылады және ол компоновщиктің жұмысы үшін қажетті базаны береді. Одан кейін ол заты .EXE болып келген біртұтас шақырылатын файлға түрленеді. Енді программаны түрлендіру көрейік, алдымен терезе тақырыбын өзгертейік. Алғаш Delphi жүйесіне кіргеннен кейін, терезе тақырыбы форма тақырыбына сәйкес келеді. Тақырыпты өзгерту үшін Объектілер Инспекторы терезесіне беру қажет. Form1 программасының терезесін жабыңыз. Объектілер Инспекторы терезесінің Caption жолын тышқанмен белгілеңіз. Осы жолдың оң жағында жыпылықтаған курсор болады. Клавиатураны кириллицияға ауыстырып, «программа» деп жазыңыз, одан кейін F9 ды басыңыз. Программаның бұл орындалуы – тақырыбы «программа» деп аталатын терезе құру. Объектілер Инспекторы терезесі арқылы программалар терезесінің бір қасиетін – тақырыбын өзгертейік. Дәл осылай формалардың кез келген қасиетін өзгертуге болады.
Формаға жаңа компоненттер орналастыру
Формаға жаңа компонент орналастыруды қарастырайық. Ол үшін алдымен орналасатын компонентті таңдау қажет, одан кейін форма терезесіндегі компонент орналасытын орынды тышқанмен белгілеу жеткілікті.
Енді программалар терезесіне әртүрлі жазуларды, түсініктемелерді орналастыруға арналған Label(белгі) компонентін орналастырайық. Алдымен, компоненттер политрасынан Standard бетінің ашылғанына көз жеткізу қажет. Курсорды әрбір компоненттің үстінен жүгізгенде оның аты жазылады. Компоненттер политрасына курсорды келтіріп, тышқанмен белгілейміз, одан кейін форма терезесінде белгінің орнын көрсетеміз.
Жаңа компоненттің стандартты аты Label1, батырмадағы жазудың да аты осындай болады. Объектілер Инспекторы терезесіндегі жолының көмегімен бұл жазуды оңай өзгертуге болады: «программа N1» деп енгіземіз. Бұл енгізілген жазу формадағы компоненттен көрінеді.
Енді жазудың түсі мен шрифті өзгертейік. Ол үшін Объектілер Инспекторы терезесіндегі Font қасиетін тышқанмен белгілейміз, батырманың көмегімен жолдың оң жақ бөлігінен шрифті түзететін сұхбат терезесі ашылады. Size тізімінен шрифтің өлшемін 24, Color тізімінен қажетті түсті таңдаймыз. ОК батырмасымен терезені жабамыз. Форма терезесіндегі компоненттегі жазу өзгеруге сәйкес қасиетін өзгертеді.
Дәріс №5. Оқиғалы-басқармалы программалау. Оқиға және оқиғаларды өңдеу процедурасы.
Оқиғалар. Программалық код терезесі.
Delphi -де программа түрлі оқиғалар арқылы басқарылады.
Оқиға- программамен жұмыс істеу барысында обьект жағдайының белгілі бір әрекетке жауап ретінде өзгеруі. Мысалы: пайдаланушы программа құру үшін алдымен формаға компонент орнатуы, форманы не формада орналастырылған компонентті тышқан арқылы шерту мүмкін. Оның әр іс-әрекеті оқиға шығарады. Delphi -де әр оқиға атау беріліп қойылған. Әр обьектіге байланысты оқиғалар көп . Мысалы: формаға байланысты өқиғалар саны 35. Олар қасиеттер терезесінің Events қосымша бетіне еңгізілген. Терезеде оқиға атауларының алдына On прифексі (қосымшасы) тіркестіріліп жазылған. Ол-атаудың оқиға екендігін білдіретін белгі:
Delphi ортасында жиі кездесетін оқиғалар
OnClick-тышқан түймесін бір рет басу.
OnDblClick-тышқан түймесін екі рет басу.
OnKeyDown-клавишті басу.
OnGreatе-форманы екі рет шерту басу т.б.
Проект екі бөлімнен тұрады: автоматты түрде project1 атауы берілген проекті файлы
(негізгі модуль) және Unit1.pas атауы берілген модуль. Олар жеке терезелерде орналасқан. Модульге оқиғаларға сәйкес іс-әрекеттерді орындайтын программа мәтіні (процедуралар) еңгізіледі. Программа мәтінің программалық код деп , ол еңгізілетін процессі деп атайды. Формада код терезесіне өту және код терезесінен формаға өту үшін F12 клавишін басу жеткілікті.
Формасы екі рет шерткен кезде ол терезесіне еңгізілген процедура дайындамасы көрсетілген. Оқиғаға байланысты құрылатын процедура Оқиғаны өңдуіш не өңдеу процедурасы делінеді. Процедура дайындамасының жазылу түрі:
Procedure <атау> (Sender:TObject);
<сипаттау бөлімі>
begin
<процедура денесі>
еnd;
Мұндағы: Sender- құрылатын процедураның қай класқа тиістілігін анықтайтын параметр.
Терезенің сол бөлігінде –браузер терезесі.
Онда код терезесінде барлық жариялаулардың құрылым көріп шығуға болады.
- Берілгендерді еңгізу және шығару. InputBox функциясы ShowMessage процедурасы. Типті түрлендіру функциялары.
Delphi -де айнымалы мәнің еңгізу үшін меншіктеу командасын, еңгізу терезесін не форманың Edit компонентің өрісін пайдалану мүмкін.
Delphi -де нәтижені ShowMessage процедураның терезесіне шығаруға болады. Процедураның жазылу түрі:
ShowMessage(FloatStr(S));
ShowMessage(FloatTostrF(S,ffgeneral,7,3));
Жүйе соңғы операторды оқып шығып, 7 цифрдан тұратын нақты санды символдық типте
ShowMessage терезесінде көрсетеді.
1.Мысалы: х=4,8 үшін у=3х+5/3 функциясының мәнің есептеу керек. Х мәні InputBox терезесі арқылы еңгізілсін, у мәні ShowMessage терезесінде көрсетіледі.
1. File-New Application командасын беріп, жаңа жоба ашу Form1 терезесі көрінеді.
2. Форма екі рет шерту Unit1.pas атаулы модель құрылады да, On Greate оқиғасын өндеуіне процедурасының дайындамасы көрінеді.
Form1 Form Greate форманы екі рет шерту оқиғасынан жауап ретінде құрылатын процедураның құрама атауы.
( Delphi -де әр қайсысы ұқсас толық бір іс-әрекетті орындайтын программалар тобы не, басқаша айтқанда, әдістер немесе қасиеттер орталығымен сипатталатын обьектілер жиынтығы класс деп, олардың біреуі класс данасы делінеді. Обьект орындай алатын әрекет әдіс деп аталады)
Екіншісі процедураның аты. Ол обьект және оқиға атауларының қосындысынан тұрады (оқиға атауының алдында On қосымшасы жазылмайды)
Көбінесе программа әр қайсысы нақты оқиғаны өндеуге арналған процедуралар жиынтығынан тұрады. Жиынтыққа қосалқы программа-процедура, функциялардың еңгізілуі де мүмкін.
Дәріс №6. VCL Delphi кітапханасының компоненттері. VCL Delphi кітапханасының батырмалары, индикаторлары, басқару элементтері.
Delphi7 oртасында ішкі программаларды пайдалану жолдары көрсетіледі. Бұл тақырып бойынша негізгі түсініктерді және ұғымдарды беруде оларды жаттықтырушы есептермен бекітіп отырған қолайлы болады. Мыалдарды күрделі емес, ықшам етіп, және 1-мысалды екі тәсілмен (процедура мен функция) көрсету оқушылардың тез түсінулеріне ықпал етеді деп ойлаймыз. Енді оқушыларға 2-мысалды функциямен, 3-мысалды процедурамен шығаруды талап етуге болады. Содан кейін оқушыларға жеке орындауға арналған тапсырмалар ұсынылады. Оқушыларға теориялық мағлұматтарды нәтижелі меңгерту үшін осындай практикалық жаттығу есептерін олардың орындалу іс-әрекетін ретпен көрсету арқылы ұсыну қолайлы деп есептейміз.
Компоненттер дегеніміз жұмыс істейтін программада құрылатын, көрінетін бейнелер тұрғызылатын элементтер болып табылады. Компоненттер палитрасының ішінде бейне ретінде көрінбейтін де компоненттер жеткілікті. Сонымен, бұл тарауда біз Delphi ортасының негізгі компоненттеріне тоқталамыз.
3.1. SТANDARD беті
SТANDARD бетінде программа құруға ең қажетті Windows-ге арналған стандарты интерфейстік элементтерден тұратын компоненттер палитрасы орналасқан.
3.1-сурет. Sтandard беті.
Frame – басқа компоненттерді орналастыруға арналған контейнер қызметін атқарады (қызметі форма терезесімен бірдей). Формадан айырмашылығы компоненттерге дайындық құра отырып, компоненттер палитрасында орналасады.
MainMenu – Программаның бас менюі. Бұл компонент күрделі иерархиялық меню құрып жұмыс істеуге мүмкіндік береді.
Label – форманың бетіне мәтін шығаруға аранлаған. Компоненттің қасиеті мәтіннің түрі мен орналасуын анықтайды.
Edit – енгізу өрісі – символдар жолынжөндеуге арналған.
Button – командалық батырма.
Memo – бірнеше жолдан тұратын мәтіндік редактор құру элементі болып табылады.
RadioButton – қызметі басқа батырмалардың қызметімен байланысты болатын тәуелді батырма болып табылады. Егер сұхбат терезесінде бірнеше ауыстырып қосқыш пайдаланылатын болса, онда әрбір топты RadioGroup компоненті арқылы беруге болады.
CheckBox – басқаларға тәуелсіз ауыстырып қосқыш батырманы сипаттайды.
ListBox – қажетті элементті таңдауға болатын тізімді береді.
ComboBox – енгізу өрісіне мәліметтерді клавиатурадан теріп енгізуге немесе тізімнен таңдауға мүмкіндік береді.
ADDITIONAL беті
Additional бетінде сұхбат терезелерінің түрін түрлендіруге мүмкіндік беретін 18 қосымша компоненттер орналасқан.
3.2 – сурет. Additional беті.
Достарыңызбен бөлісу: |