7.2-сурет. Модуль құру терезесі
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:
Object Pascal тіліндегі кластар дегеніміз не?
Кластың басқа типтерден қандай айырмашылығы бар?
Кластар негізінде қандай іргелі ұғымдар анықталады?
Инкапсуляция дегеніміз не?
Мүрагерлік принципі дегеніміз не?
Object Pascal тілінің барлық кластары қандай ата-аналық кластан тарайды?
Delphi ортасындағы кластар тармағын қалай сипаттауға болады?
Полиморфизм дегеніміз не?
Өріс дегеніміз не?
Әдістер дегеніміз не және олар қалай бейнеленеді?
Әдістерді динамикалық және статикалық ауыстыруды қалай түсіндіруге болады?
Әдісті алмастыру қандай директивамен хабарланады?
SHOW және HIDE әдістерінің қызметі қандай?
Динамикалық және вертуалдық әдістердің арасында қандай айырмашылық бар?
Конструктор және деструктор әдістерінің қызметі қандай?
Бір атаулы әдістер дегеніміз не?
Бір атаулы әдісті хабарлау үшін қандай қызметші сөз пайдаланылады?
Қасиеттер дегеніміз не?
Қасиеттер қандай қызметші сөздердің көмегімен хабарланады?
Delphi ортасындағы кластардың хабарлауына сипаттама беріндер?
Public, Private, Protected, Automated секцияларының қызметі қандай?
Интерфейс дегеніміз не?
Интерфейс қандай қызметші сөзбен хабарланады?
Интерфейстің кластан айырмашылығы қандай?
Интерфейсте хабарланған мүшелер қай секцияларда орналасады?
Әдеттегі кластан интерфейстік кластың айырмашылығы қандай?
Интерфейстік кластар қандай аталықтан туындайды?
Зертханалық жұмыс №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 функциясының көмегімен алуға болады, ал типті вариантқа жаңа мән меншіктеу жолымен өзгертуге болады.
Варианттарды мәліметтердің басқа типіне түрлендіру
Варианттар өрнектерде, олардың мәндеріне басқа типтерді меншіктегенде пайдаланылған жағдайда мәліметтер варианттарында орналасқан типтер төмендегі ереже бойынша түрленеді:
Варианттардағы типтердің түрлендірілуі
Қолда-нылуы
|
Варианттардағы мәліметтер типі
|
Var
Epty
|
Бүтін
|
Нақты
|
Дата уақыт
|
Жолдық
|
Логикалық
|
Бүтін
|
0
|
Сәйкес типке түрлен-діру
|
Бүтінге дөңге-лектеу
|
Бүтінге дөңге-лектеу
|
Бүтін типке түр-
лен-
діру
|
False
үшін 0,
әйтпесе – 1, Byte үшін 255
|
Нақты
|
0.0
|
Сәйкес типке түрлен-діру
|
Сәйкес типке түрлен-діру
|
Сәйкес типке түрлен-діру
|
Нақты типке түр-
лен-
діру
|
False
үшін 0,
True үшін – 1
|
Дата уақыт
|
30.12.
1899
00:00:00
|
Double – ге түрлен-діру
|
Double – ге түрлен-діру
|
Түрленді-рілмейді
|
Датаға түрле
неді
|
Double – ге түрлен-діру
|
Жолдық
|
Бос жол
|
Символ-дық түрге түрлен-діру
|
Символ-дық түрге түрлен-діру
|
Символ-дық түрге түрлен-діру
|
Түрлен-
діріл-
мейді
|
False
үшін 0,
True үшін – 1
|
Логикалық
|
False
|
0 – False
әйтпесе - True
|
0 – False
әйтпесе - True
|
0 – False
әйтпесе - True
|
‘False’
- 0 -
False
әйтпесе - True
|
Түрленді-рілмейді
|
Мұндағы
Бүтінге: VarByte, VarSmallInt, VarInteger, VarError;
Нақтыға: VarSingle, VarDouble, VarCurrency;
Жолдыққа: VarString, VarOleStr жатады.
Варианттармен жұмыс істеуге арналған қосалқы программалар
Варианттармен жұмыс істеу үшін төмендегідей қосалқы программаларды пайдалануға болады:
Function VarAsType(ConstV:Variant; VarType:Integer):Variant;
Procedure VarCast(VArDest:Variant; const Sourse:Variant; VarType:Integer);
Procedure VarClear(var V:Variant);
Procedure VarCopy(VarDest:Variant; const Source:Variant);
Function
VarForm_DateTime(DateTime:TDateTime):Variant;
Function VarIsEmpty(const V:Variant):Boolean;
Function VarIsNull(const V:Variant): Boolean;
Function VarToDateTime (const V:Variant):TDateTime;
Function VarToStr(const V:Variant):string;
FunctionVarType(const V:Variant):Integer;
1 – функция – кез келген варианттың мәліметін VarType параметрімен анықталатын типке түрлендіреді.
2 – прцедура – Sourse вариантының мәліметін VarType параметрімен анықталған типке түрлендіріп, нәтижені Dest айнымалысына орналастырады.
3 – процедура динамикалық жадыны босатады, егер ол вариантпен байланысты болса және оған VarEmpty типін береді.
4 – процедура Dest вариантына Sourse параметрін көшіреді.
5 – функция – типі дата – уақыт болып келген DataTime мәліметтерінен тұратын вариантты береді.
6 – функция – егер V – да мәліметтер болмаса, True мәнін береді.
7 – функция – егер V варианты анықталмаған мәліметтер типінен тұратын болса, True мәнін береді.
8 – функция – V варианттының мәліметтерін дата – уақыт типіне түрлендіреді.
9 – функция – V варианттының мәліметтерін жолға түрлендіреді.
10 – функция – Вариантта сақталған мәліметтер типін береді.
Вариантты массивтер
Варианттың мәні мәліметтер массиві болуы мүмкін, мұндай вариаттар – вариантты массивтер деп аталады. Вариантты массив элементтерінің мәндері вариант үшін мүмкін болатын кез келген мәндер болуы мүмкін, бірақ оған VarString жолы кірмейді. Вариантты массив элементтерінің мәндері варианттарда бола алады, олай болса мұндай массивте бір мезгілде әртүрлі мәліметтер типі сақталады.
Var
V:Variant;
Begin
//5 элементтен тұратын бір өлшемді вариатты массив құрайық
Var:=VarArrayCreate([0,4],varVariant);
//Толтырамыз:
V[0]:=1;
V[1]:=1234.5678;
V[2]:= ‘салем’;
V[3]:=True;
//Массивтің 5 – элементі тағы бір массив болсын.
V[4]:=VArArrayof([1..10,100..1000]);
Caption:=V[2];
LBOutput.Caption:=InttoStr(V[4][2]);
End;
Вариантты массивтермен жасалатын барлық әрекеттер төмендегі процедуралар мен функциялардың көмегімен жүзеге асырылады:
Function VarArrayCreate(const Bounds:array of integer; Vartype:Integer):variant; - Bounds параметрі арқылы мөлшері мен шекарасының өлшемі көрсетілген типті элементтерден вариантты массив құрады;
Function VarArrayDimCount(const A:Variant):Integer; - Варианты А массиві өлшемінің мөлшерін (санын) береді, егер А массив болмаса, 0 – ге тең.
Function VarArrayHighBound (const A:Variant: Dim:Integer):Integer; - Dim өлшемі бойынша вариантты А массиві жоғарғы шекарасының индексін береді;
Function VarArrayLock(var a:Variant):Pointer; - массивті бұғаттап, мәліметтерге байланысты көрсеткішті береді;
Function VarArrayLowBound (const A:Variant; Dim:Integer):Integer; - Dim өлшемі бойынша А вариатты массиві төменгі шекарасының индексін береді;
Function VarArray (const Values:array of Variant):Variant; - Values ашық массивіндегі мәндерден тұратын бір өлшемді вариантты массив құрады. Бұл жағдайда вариантты масивінің төменгі шекарасының индексі 0 – ге тең;
Procefure varArrayRedim(Var A:variant; HighBound:Integer); - А вариантты массивтің жоғарғы индексінің шекарасын шамасына өзгердеді. Егер массив VarArrayLock функциясымен бұғатталған болса, онда процедураның шақырылуы жойылады;
Function VarArrayRef(const A:Variant):Variant; - Вариантты массивке сілтемені береді. АРІ функцияларды шақыруда пайдаланылады;
Procedure VarArrayUnlock(var A:Variant) – VarArrayLock функциясының әрекетін жоққа шығарады.
Пайдаланушының варианттары
Delphi – дің 6 – нұсқасынан бастап, варианттың мәндеріндегі сипатындағы шектеулерді толық алып тастайтын пайдаланушының варианттары жұмыс істейді. Бұл варианттың қасиеттерімен толық танысу үшін төмендегідей вариантты қарастырайық: комплекстік сандарды сақтап, оларды басқа типке түрлендіріп және олармен қажетті әрекетті жүзеге асыратын вариантты пайдаланайық. Пайдаланушының вариантын құру – ондағы сақталатын мәліметтердің күрделілігіне тәуелді болады. Delphi – ді жасаушылардың құрған VarCmplx модуліне қосылған вариантты пайдаланайық. Төмендегідей оқиға өндеушісін құрайық.
Uses VarCmplx;//Бұл сілтеме міндетті түрде қажет!
Procedure TfmExample.bbRunClick(Sender:TObject);
Var
V1,V2:Variant;
Begin //кездейсоқ екі комплекс сан құрамыз:
V1:=VarComlexCreate(Trunc(Random*1000)/100,Trunc(Random*1000)/ 100);
Width mmOutput.Lines do
Begin
Add(‘ ’); //Бос бөлінетін жол
Add(‘1-ші сан’#9+V1);
Add(‘2-сан’#9+V2);
Add(‘қосу’#9+(V1+V2));
Add(‘Азайту’#9+(V1-V2));
Add(‘Көбейту’#9+(V1*V2));
Add(‘Бөлу’#9+(V1/V2));
End;
End;
Енді түсініктеме берейік:
Trunc(Random*1000)/100 конструкциясы комплекс санмен 3 мәнді цифр алынуы үшін қажет.
Келтірілген мысалдан байқап отырғанымыздай жаңа вариант комплекстік сандармен жақсы сүйемелденеді: VarComlexCreate функциясы комплекстік саннан құралатын вариант құрады, ары қарай вариант математикалық операцияларды орындап, оны жолдық типке түрлендіреді. Сондай – ақ, VarCmplx модулінің мәтіні вариантқа қосымша қасиет береді (ескертусіз Source\RT1\Common\ VarCmplx.pas – та орнаалсады), көлемі 30000 байттан астам.
Пайдаланушының вариантын құру үш кезеңде жүреді.
Алдымен TVarData жазуына жаңа мәліметтер орналасады немесе оған сілтеме жасалады.
TCustomVariantType арнайы кластың тікелей немесе жанама ұрпағы болып табылатын класс хабарланады. Бұл класта варианттың қасиеттерін жүзеге асыруға қажетті барлық әдістер қарастырылады: оған жаңа мәндер меншіктеу, сақталған мәндерді басқа типтерге түрлендіру, қажетті математикалық операцияларды орындау.
Жаңа кластың ұрапқтарын хабарлауға және олардың типін анықтауға қажетті қосымша әдістер құрылады.
Көрсетілген қадамдарды орындағаннан кейін жаңа қасиеттермен байытылған толық вариант алынады: ол тек жоғарыда кестеде келтірілген мәндерді ғана сақтап қоймай, басқа да кез келген мәндерді, оның ішінде қасиеттер мен әдістерді де сақтай алады.
Тапсырма:
Тапсырманы орындауға әдістемелік нұсқаулар:
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:
Вариант дегеніміз не?
Вариант айнымалысы ретінде қандай типтерді алуға болады?
Варианттық типтің құрылымы қалай сипатталады? Мысал келтіріңіз.
Мәліметтер вариантында орналасқан типтерді қалай түрлендіруге болады?
Варианттармен жұмыс істеуге арналған қандай қосалқы программалар бар?
Варианттық мәліметтер типін қандай функцияның көмегімен алуға болады?
Вариантты массивтер дегеніміз не? Олардың негізгі айырмашылығы неде?
Пайдаланушының варианттарының қандай ерекшелігі бар?
Пайдаланушының вариантың құру қанша кезеңнен тұрады? Әрбір кезеңге сипаттама беріңіз.
Зертханалық жұмыс №14
Тақырыбы: Файлдар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:
Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:
Файл ұғымы туралы жалпы түсінік
Файл деп дербес компьютердің сыртқы жадысының атау берілген бөлігін түсінеміз. Кез келген файлдың өзіне тән үш ерекшелігі болады. Біріншіден, файлдың атауы бар, программаға осы атауы бойынша бір мезгілде бірнеше файлмен жұмыс істеуге мүмкіндік береді. Екіншіден, ол бір типті компоненттерден тұрады. Файлдан басқа Object Pascal–дың кез келген типі компоненттер типі бола алады. Үшіншіден, файлдың ұзындығы жөнінде оны хабарлауда ешнәрсе айтылмайды, ол тек сыртқы жады құрылғысының көлемімен шектеледі. Файлдық типті төмендегі үш тәсілдің бірімен беруге болады:
<аты>=File of <тип>;
<аты>=TextFile;
<аты>=File;
Мұндағы <аты> - файлдық типтің аты; File of - қызметші сөздер (файл, содан); TextFile - стандартты мәтіндік файл типінің атауы; <тип> - файлдан басқа Object Pascal –дың кез келген типі.
Мысалы,
Type
Product=Record
Name: String;
Code: word;
Cost: Comp
End;
Text80=File of String[80];
Val F1: File of char;
F2:TextFile;
F3:Text80;
F4:F4 of Product;
Файлдармен жұмыс
Хабарлау тәсіліне қарай, файлды үш түрге бөлуге болады: мәтіндік, типтік және типтік емес.
Ақпарат ASCII кодымен берілген файл мәтіндік файл болып табылады. Мәліметтердің кез келген қарапайым типі осылай беріледі. Жеке мәндер файлда жол болып беріледі. Мұндай жазулар ақпарат бөліктері болып бірігуі мүмкін. Мәтіндік физикалық файлдың атауы үшін оның заты .txt, .doc болып беріледі. Программалау тілдеріндегі программа мәтіндегіфайлдар үшін заты тілдің белгісін білдіреді, мысалы, .pas, .bas. Физикалық мәтіндік файл тізбекті кіру мүмкіндігі бар файл болып табылады.
Типтік файл – бұл компоненттері – мәндері екілік кодпен берілген, файлдық типтен басқа, жай және құрылымдық типті файл. Файл компоненті деп файл жөніндегі дербес мәліметті айтады. Мысалы, integer немесе real типті файл. Типтік файл тікелей кіру мүмкіндігі бар файл болып табылады, бірақ өзінің компоненттеріне тізбекті түрде кіру мүмкіндігін де береді.
Типтік емес файл – бұл компоненттері 0 мен 1 екілік цифрлардан құралған сегіз битті тізбек болып табылады. Мысалы, жадының кез келген ұяшығындағы кез келген типті ақпарат түрінде көз алдымызға елестетуге болады. Файлдарға төмендегідей ұғымдар тән: файл атауы, файл типі, файл компоненті, файлды жазу, файлды жазудың соңы және файл соңы. Бұл ұғымдардың бәрі логикалық та, физикалық та бола алады. Мысалы, файлдың логикалық атауы және файлдың физикалық атауы. Файлды жазудың соңы – тасымалдаушыға физикалық жазудан кейін қойылатын белгі. Ол EOL (End Of Line) деп аталады. Ол физикалық файлмен жұмыс барысында жазудың соңы кездессе мәнін қабылдайды.
Файлдың соңы – тасымалдаушыға физикалық файл компонентінің соңын жазғаннан кейін қойылатын белгі. Ол EOL (End Of Line). Сондай-ақ, физикалық файлмен жұмыс барысында файлдың соңы кездессе, true мәнін қабылдайтын Паскальдың бұл айнымалы функциясы да осылай аталады.
Физикалық файлдар оның компонентіне кіру тәсіліне қарай тізбекті және тікелей болып екіге бөлінеді. Осы бөлінуге сәйкес файлдар тікелей кіру және тізбекті кіру мүмкіндігі бар файл деп аталады.
Файлға тікелей кіру жағдайында файлдың кез келген компоненттерімен жұмыс істеу үшін тікелей кіруге болады. Тікелей кіру мүмкіндігі бар файлдың барлық компоненттері нөмірленген. Нөмір нольден басталады, яғни 1-компоненттің нөмірі - 0, екінші компоненттің нөмірі 1 және т.с.с. Бұдан, файлдың соңына n+1–ші орынға n–нөмірлі компонент орналасады. Тікелей кіру мүмкіндігі бар файлды тасымалдаушының кез келген бөлігіне тікелей кіруге мүмкіндік беретін ақпарат тасымалдаушыларда ғана орналастыруға болады, мысалы, магнитті дискілерде.
Тізбекті түрде кіру мүмкіндігі бар файл компоненттерін оқу тек бірінші компоненттен басталады. Сондықтан, тасымалдаушының қандай да бір компонентін оқу үшін ізделінді компонент табылғанынша алдыңғыларын өткізіп отыру қажет. Тізбекті файлдың қарапайым мысалына магнитті лентада жазылған файл жатады.
Object Pascal тілінде файлдармен төмендегідей жұмыс түрін ұйымдастыруға болады:
файл құру;
мәліметтерді файлға жазу;
мәліметтерді файлдан оқу;
файлды түрлендіру.
Файлмен жұмыс істеу үшін логикалық атауы бойынша логикалық файл сипатталуы тиіс. Одан кейін логикалық файл физикалық файлмен сәйкес құрылғыда, ақпаратты тасымалдаушыда байланысуы тиіс. Одан кейін физикалық файлды ашуға мүмкіндік болуы қажет. Файл тек оқу үшін, тек жазу үшін немесе оқу және жазу үшін ашылады. Оператор арқылы логикалық файл мен физикалық файлды байланыстырғаннан кейін файлмен жұмыс істеуде файлдың логикалық атауы пайдаланылады. Бұдан кейін жұмыс физикалық файлмен орындалады.
Логикалық файлдың сипатталуы
Файл үшін логикалық және физикалық файл ұғымы енгізіледі. Логикалық файл – бұл ақпараттың қандай да бір абстракт көлемі. Физикалық файл – бұл физикалық тасымалдаушыда жазылған логикалық файл: диск, дискет, дисплей экраны, магнитті лента және т.б. Мысалы, сыныптағы оқушылардың аты-жөнінің тізімі логикалық файл болып есептеледі. Сондай-ақ, қағазға немесе дискіге жазылған Object Pascal программасының мәтіні де физикалық файл болып табылады. Логикалық файл мен физикалық файлды байланыстыру стандартты AssignFile процедурасы арқылы жүзеге асырылады:
AssignFile(<логикалық файл аты>,<физикалық файл аты>);
Мұндағы <логикалық файл аты> – программада файлдық айнымалы ретінде хабарланған файлдық айнымалы, <физикалық файл аты> – файл атынан тұратын мәтіндік өрнек, егер қажет болса файлға кіру маршруты толық көрсетіледі.
Паскаль тілінде логикалық файл ретінде мәліметтердің арнайы типі – файл құрылымы енгізілген.
Файлды ашу
Программада файлдармен жұмыс істеу үшін алдымен оны ашу қажет. Бұл әрекет алдын-ала хабарланған файлдық айнымалыны бұрын құрылған файлдың немесе жаңадан құрылатын файлдың атымен байланыстырылғаннан кейін, сондай-ақ, ақпарат алмасу бағытын көрсетуді қамтиды: файлдан оқу немесе оған жазу.
Файлмен жұмыс істеу үшін – ашу, ал жұмыс аяқталғаннан кейін – жабу қажет. Оқуға арналған файл RESET(FF) операторымен, жазуға арналған файл REWRITE(FF) операторымен ашылады. APPEND(FF) – мәтіндік физикалық файлға мәліметтер қосып жазуға арналған.
Мәліметтерді оқу және жазу белгілі READ/WRITE операторларының көмегімен жүзеге асырылады, тек тізімінің басында файлдық айнымалының аты көрсетіледі:
READ(FF,тізім)
WRITE(FF,тізім)
Файлдың жабылуы CLOSE(FF) операторымен орындалады.
Файлды шартты түрде басы бар, соңы тіркелмеген лента түрінде елестетуге болады. Файлдың компоненттері осы лентаға бірінен соң бірі тізбектеліп жазылады.
REWRITE командасы жазуға арналған файлды ашып, файлды жазу режимінің бастапқы күйіне келтіреді, маркер нольдік позицияға орналасады. Егер FF файлы бұрын болса, онда ол жойылады.
RESET командасы бойынша диск каталогындағы физикалық файлдың бар екендігіне көз жеткізеді, егер физикалық файл табылмаса, онда файл табылған жоқ деген хабарлама беріледі. Егер файл табылса, маркер көрсеткіші нольдік күйге келтіріледі, файл мазмұны жойылмайды.
APPEND командасы бойынша файл көрсеткіші оның соңына орналастырылып, бұрыннан бар файлға қосымша мәліметтер тіркеліп жазылады.
Файлдармен жұмыс істеуге арналған процедуралар мен функциялар
Файлдың кез келген түріне пайдалануға болатын процедуралар мен функциялардың тізімін келтірейік.
Procedure AssignFile(var F; FileName,:String); - Fфайлдық айнымалысын FileName атты файлмен байланыстырады;
Function ChangeFileExt(const FileName, Extensions:String):String; - файлдың затын Extension параметрімен берілген файл затына өзгертеді;
Procedure ChDir(Path:String); - Ағымдағы каталогты өзгертеді: Path -ескертусіз орнатылған каталогқа баратын жолды көрсететін жолдық өрнек;
Procedure CloseFile(Var F); - Файлды жабады, бірақ F файлдың айнымалысымен AssignFile процедурасымен алдын-ала орнатылған байланыс сақталады. CloseFile процедурасының функциясы программа жұмысы дұрыс аяқталған жағдайда барлық ашылған файлдар автоматты түрде жабылады.
Function DateTimeToFileDate(DataTime:TDataTime):Integer; - DataTime мәнін файл құру уақытының жүйелік форматына аударады;
Function DiskFree(D:Byte):LongInt; – көрсетілген дискідегі бос орынның байттық көлемін береді; D - диск нөмірі (0 ескертусіз құрылғы; 1 - диск А; 2 – диск В және т.б.). Функция, егер жоқ дискінің нөмірі көрсетілсе 1 деген мәнді береді.
Function EOF(Var F):Boolean; – Файлдың соңын көрсетеді, егер файлдық көрсеткіш файлдың соңында тұрса, онда True мәнін береді. Жазуда бұл кезекті компонент файлдың соңына қосылғанын, ал оқуда файлдың жойылғанын көрсетеді.
Procedure Erase (Var F): - F файлын өшіреді. Процедураны орындар алдында файлды жбау қажет.
Function FileAge(const FileName: String):integer; - FileName файлы үшін оның соңы жаңартылған (қайта жазылған) уақытын береді (жүйелік форматта); егер мұндай файл болмаса, онда – 1-ге тең.
Function ExcludeTrailingBaslash(const S: String): String; - Sжолын тұйықтайтын “/” символын өшіреді (егер бұл символ жолды тұйықтамаса, онда S–ті өзгеріссіз қалдырады);
Function ExpandFileName(const FileName: String):String; - файл атын ағымдағы каталогпен толықтырады;
Function ExpandUncFileName(const FileName: String):String; – файл атын ағымдағы желілік каталогпен толықтырады;
Function ExtractFileDir(const FileName: Srting):String; – файлдың толық атауынан оған кіру маршрутын шығарады (соңғы “/”символынсыз);
Function ExtractFileExt(const FileName: String): String; – файлдың толық атауынан оның затын нүктесімен шығарады;
Function ExtractFileName(const FileName: String): String: String; –файлдың толық атауынан оның атын затымен шығарады;
Function ExtractFilePath(const FileName: String): String; – файлдың толық атауынан оған кіру маршрутын символымен қоса шығарады;
Function ExtractRelativePath(const BaseName, DestName: String): String; – файлдың толық атауынан DestName–ге қатысты маршрут атын шығарады (аралық каталогтар: “/” символымен алмастырылады).
Function FileDateTimeToDateTime (DataTime: Integer):TDateTime; –жүйелік форматы FileDate файлының құрылу уақытын дата-уақыт форматына түрлендіреді.
Function FileExists(const FileName: String):Boolean; – егер FileName атты файл бар болса, онда True мәнін береді;
Procedure FindNext(Var F:TSearchRec); – FindFirst/FindNext функциясымен файлды іздеуге бөлінген жадыны босатады;
Function FindNext(Var F: TSearchRac): Integer; - F файлының каталогтағы келесі файлдың атын береді;
Procedure Flash(var F); – дискідегі файлдың соңғы өзгертулерін сақтай отырып, файлдың ішкі буферін тазартады;
Procedure GETDir(D:Byte; var S:String); – Ағымдағы каталогты береді: D - құрылғы нөмірі; 1 – А дискісі; 2 – В дискісі және т.б. S – String –типті айнымалы, ол көрсетілген дискідегі ағымдағы каталогқа баратын жолды көрсетеді;
Function IncludeTrailingBackslash(const S:String); – “/” символымен файлға кіретін толық маршрутты береді;
Function IOResult: Integer; – соңғы енгізу – шығару операциясының шартты белгісін береді;
Function ISPathDelimiter(const S:String; Index:Integer):Boolean; – егер S жолындағы Index символында “/” белгісі болса, онда true мәнін береді;
Function MatchesMask(const FileName, Mask: String):Boolean; – Егер FileName аты Mask топтық атауына сәйкес келсе, true мәнін береді;
Procedure MKDir(Dir: String);– көрсетілген дискіде жаңа каталог құрады: Dir каталогты іздеу маршруты. Бұрын құрылған каталогтар атауы қайталанбауы тиіс;
Procedure Rename(var F; NewName:String);–F файлының атын өзгертеді; NewName - файлдың жаңа атынан тұратын жолдық өрнек. Процедураны орындамас бұрын файлды жабу қажет;
Procedure Reset(Var F:File; [RecSize:World]); – бұрын құрылған файлды ашады. RecSize–дың тек типтік емес файлдар үшін ғана мағынасы бар және мәліметтер блогының өлшемін береді;
ProcedureRewrite(Var F:File; [RecSize:World]); – жаңа файл құрады. RecSize-дың тек типтік емес файлдар үшін ғана мағынасы бар және мәліметтер блогының өлшемін береді.
Procedure RmDir(Dir:String); – Dir каталогын өшіреді. Өшірілетін каталог бос болуы тиіс.
Файлдардың жадыдағы бейнеленуі
Файлдарды бейнелеу үш тәсілмен жүзеге асырылады.
Файлдарды құру және ашу
Алдымен файл
Function FileCreate(FileName:String):Integer;
функциясының көмегімен құрылып,
Function FileOpen(const Filename:String; Mode:LongWord): integer; функциясының көмегімен ашылады.
Екі функцияда да FileName– файл аты, файлға кіру маршруты көрсетілуі мүмкін. Mode параметрі файлға кіру режимін анықтайды және төмендегі мәндердің біреуін ғана қабылдайды: fmOpenRead - тек оқу үшін, fmOpenWrite - тек жазу үшін, fmOpenReadWrite - жазу және оқу. Or операциясының көмегімен бұл тұрақтыларды бірнеше программалар файлына бірлесе кіру мүмкіндігін реттейтін төмендегі операторлармен топтастыруға болады:
fmShareExclusive - бірлесе кіру мүмкіндігі рұқсат етілмейді; fmShareDenyWrite - басқа программаларға жазуға рұқсат етілмейді; fmShareDenyRead - басқа программаларға оқуға рұқсат етілмейді; fmShareDenyNone - бірлесе кіру шектелмеген. Егер операция ойдағыдай орындалмаса екі функцияда құрылған (ашылған) файлдың дескрипторын береді немесе 0-ге тең.
Бейнелеу объектісін құру
Екінші кезеңде жадыда бейнелеу объектісі құрылады. Ол үшін төмендегідей функция пайдаланылады:
Function CreateFileMapping(hFile:Thandle;
lpFileMappingAttributes: PsecurityAttributes; flProtect,
dwMaximumSizeHeigh, dwMaximumSizeLow: Dword;
lpName:PChar):Thandle;
Мұндағы hFile – файл дескрипторы; lpFileMappingAttributes - құрылатын объектінің ұрпақ объект құра алатындығы жөніндегі құрылымды анықтайтын көрсеткіш; flProtect - файлды бейнелеу терезесінде қолданылатын қорғау типін анықтайды; dwMaximumSizeHeigh, dwMaximumSizeLow - сәйкес үлкен және кіші 32 разрядты файл өлшемі, егер ұзындығы 4 ГБайтқа дейінгі файлды бейнелеу қажет болса, онда – ноль мәні меншіктеледі, ал dwMaximumSizeLow – файл ұзындығы, егер екі параметрде нольге тең болса, онда бейнелеу терезесінің өлшемі файл өлшеміне тең; lpName - бейнеленетін объектінің атауы.
FlProtect параметрі – файлды көру терезесіне қолданылатын қорғау типін береді және ол төмендегі мәндердің бірін қабылдауы мүмкін:
PAGE-READONLY-файл тек оқу үшін (файл fmOpenRead режимінде ашылған немесе құрылған болуы мүмкін); PAGE-READWRITE - файлды оқуға және оған жаңа мәндер жазуға болады (файл fmOpenReadWrite режимінде ашылады); PAGE-WRITECOPY - файл жазу немесе оқу үшін ашылады, бірақ жаңартылған мәліметтер жадының жеке қорғалған бөлігінде сақталады (бейнеленген файлдар программалармен бөлінуі мүмкін), бұл режимде әрбір программа жадының жеке бөлігінде өзгерісті сақтайды; файл fmOpenReadWrite немесе fmOpenWrite режимінде ашылады; қорғаудың бұл типін Windows 95/98–де пайдалануға болмайды. Or операциясының екі гімен ашылады.
у және ашун жүзеге асырылады.
а мағынасы бар және мәліметтер блогының өлшемін береді.
көмегімен flProtect параметріне төмендегідей атрибуттарды жалғауға болады:
Sec_Commit - бейнелеуге арналған физикалық жадыны бөліп көрсетеді; SEC_IMAGE - файл образын атрибуттарды бейнелеу жөнінде ақпарат алынады; SEC_NoCaSHE - бейнеленетін мәліметтерге оперативті жадыдан орын бөлінбей, тікелей дискіге жазылады; SEC_RESERVE - физикалық жадыдан орын бөлінбей, бірден бөлім беттері резервтеледі.
Көру терезесін құру
Үшінші кезеңде көру терезесі құрылады, яғни мәліметтерді программаның адрестік кеңістігінде бейнелеу:
function MapViewOfFile(hFileMappingObject: Thande; dwDesiresAccess: DWord; dwFileOffSetHigh, dwFileiffSetLow, dwNumberBytes – ToMap:DWord):Pointer.
Мұнда hFileMappingObject -объектіні бейнелеу дескрипторы, dwDesiresAccess - мәліметтерге кіру тәсілін анықтайды және төмендегі мәндердің біреуін қабылдауы мүмкін: File_Map_Write - оқуға және жазуға мүмкіндік береді, бұдан CreateFillMapping функциясында PageReadONLY немесе Page_ReadWrite атрибуты пайдаланылуы мүмкін; File_Map_All_Access атрибутының жұмысы File_Map_Write жұмысымен бірдей; File_Map_Copy - мәліметтерді оқуға және жазуға болады, бірақ жаңартылған мәліметтер жадының жеке қорғалған бөлігінде сақталады; CreateFileMapping функциясында Page_Write атрибуты пайдаланылуы тиіс; dwFileOffSetHeigh, dwFileiffSetLow - файл басынан ығысатын сәйкес үлкен және кіші разрядтарды анықтайды және сол жерден бейнелеу орындалады; dwNumberBytesToMap - бейнелеу терезесінің ұзындығын анықтайды (0 – ұзындық файл ұзындығына тең).
Бейнелеу ресурстарын босату
Бейнеленген мәліметтерді пайдаланғаннан кейін терезені бейнелеу ресурстарын
Function UnMapViewOfFile(lpBaseAdress:Pointer):Bool;
функциясының көмегімен босату керек, оны шақыратын жалғыз параметр бірінші бейнеленген байттың адресінен тұруы тиіс, яғни ол MapViewOfFile функциямен шақырылатын адрес.
Бейнелеу объектісін және файлдың өзін жабу
Function CloseHandle(hObject:THandle)
функциясының көмегімен орындалады.
Файлдармен жұмыс істейтін объектілі модель
Delphi ортасында TStream абстрактылы класы пайдаланылады (мәліметтер ағыны), ол объектілермен жұмыс істегендегідей файлдар жұмысы үшін негіз болады. Объектілер жағдайында ақпарат тасымалдаушы дискілік файл, таспалық тасымалдаушы немесе оперативті жады болып табылады. TStream арнайы ұрпағында файлдық объектіге толық кіру мүмкіндігін ашатын Read, Write және Seek стандартты әдістері анықталған. Объект конструкторымен құрылып, деструкторымен өшіріледі.
Келесі мысалда Edit1.Text атауымен сақталған файл Edit2.Text файлына көшіріледі.
Procedure TForm1.CopyFileClick(Sender: TObject);
Var
Stream1,Stream2:TStream;
Begin
Stream1:=TFileStream.Create(Edit1.text, fmOpenRead or fmShareDenyWrite);
Try
Stream2:= TFileStream.Create(Edit2.text, fmOpenCreate or fmShareDenyRead);
Try
Stream2.CopyForm(Stream1, Stream1:Size);
Finally
Stream2.Free;
Finally
Stream1.Free;
End;
TStream абстрактылы Read класы Write және кілттік әдістерді хабарлайды, ол төмендегі операцияларды орындау үшін оның мұрагерлерінде жабылады:
TFileStream - файлдармен мәліметтер алмасу;
TSringStream - ұзын жолмен (жадыда) мәліметтер алмасу;
TMemoryStream - жадыдағы мәліметтермен алмасу;
TBLOBStream – BLOB типті мәліметтер өрісін оқу/жазу (Binary Large Object – үлкен екілік объект);
TWinSocketStream – OLE сокетті жалғанатын мәліметтермен алмасу;
TOLEStream – OLE форматыфндағы мәліметтермен алмасу.
Кез-келген мұрагер CopyForm әдісінің көмегімен басқа ағынның мазмұнын оқи
алады. Осындай тәсілмен, файлдық мәліметтерді жадыға орналастыруға немесе керісінше – жадыда орналасқан мәліметті дискідегі файлға жазуға болады.
Дәл осылайша TStream класынан басқа да пайдалы әдістер жиынтығы шығады, оның ішінде:
Seek - ағынның ағымдағы орнынан бастап, қажетті байт мөлшерін жібереді;
ReadBuffer - ағынға буферден қажетті байт мөлшерін оқиды;
ReadComponent - ағыннан компонент қасиетін оқиды;
WriteBuffer - берілген ұзындықтағы буфердегі мәлімет мазмұнын ағынға жазады;
WriteComponent - ағынға компонент қасиетін жазады.
Келесі BbRunClick оқиға өңдеушісі mmOutput редакторына bbRun батырмасының қасиетін шығарады;
Программаға түсініктеме. Алдымен компоненттің қасиеті MemSourceStream ағынына жазылады. Осылайша алынған екілік мәліметтер оқылатын түрге келу үшін ObjectBinarryToText процедурасы пайдаланылады, ол MemSourceStream ағынынан мәліметтерді түрлендіріп MemSourceStream ағынына орналастырады. Осы екінші ағындағы мәліметтерді mmOutput терезесіне шығарады.
ТАПСЫРМА:
Тапсырма №1. 100000 кездейсоқ нақты саннан тұратын дискілік файлды құратын программа мысалын қарастырайық (файлдың ұзындығын «массив ұзындығы» редакторының мәнін өзгерту арқылы таңдауға болады). “Test.dat” атты файл файлды жадыда бейнелеу жолымен құрылады – жады батырмасы және дәстүрлі тәсілмен файл батырмасы. Екі жағдайда да уақыты көрсетіледі (процессор – 400 МГц, жады – 64 МБайт). Жиілік пен жады қаншалықты көп болса, уақыттың арасындағы айырмашылықта соғұрлым үлкен болады.
Тапсырма №2.
Memo өрісіне мәтіндік файлдың мазмұнын шығаратын программа құру.
Тапсырма №3.
Күндік температура туралы ақпараттан тұратын, мәтіндік файл түрінде құрылған “Ауа райы” мәліметтер қорына мәлімет қосатын программа жазыңдар. Датаны енгізу үшін MonthCalendar компонентін пайдаланыңдар.
Тапсырма №4.
N aдамнан тұратын оқушылардың оқу үлгерімі жөніндегі тізімдегі мәліметті файлға жазатын және одан оқитын программа құрайық. Файлдың әрбір жазуы оқушының аты-жөнінен және үш пәннен: математика, физика, химия пәндерінен алған бағаларынан тұратын болсын. Сонымен қатар, жазулар алфавиттік ретпен сұрыпталып, мәтіндік файл түрінде сақталсын.
ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:
Тапсырма №1.
Unit Unit1;
Interfase
Uses
Windows, Messages, SysUnits, Classes, Graphics, Countrols, Forms, Dialogs, StdCtrls, ComCtrls, Spin;
Type
TForm1=class(TForm)
btMem:Tbutton;
btFile:Tbutton;
se:TSpinEdit;
Label:TLabel;
Pb:TProgressBar;
Label2:TLabel;
btMem:Tlabel;
btFile:Tlabel;
Procedure btMemClick (Sender:TObject);
Procedure btFileClick (Sender TObject);
Private {Private declarations}
Public {Public declarations }
End
Var
Form1:TForm1;
Implementation {SR*.DFM}
Procedure TForm1.btMemClick (Sender:TObject);
//Бейнелеу жолымен файл құру
Type
Real=^Real;
Var HfileHMap:Thandle;
AdrBase, AdrReal:PReal;
K:integer;
Fsize:Cordinal;
BegTime:TdateTime;
Begin
BegTime:=Time; //Жіберілу уақытын тіркейміз.
//ProgressBar-ны дайындаймыз.
Pb.Max:=se.Value;
Pb.Position:=0;
Pb.Show;
Fsize:=se.Value*SizeOf(Real);//Файл ұзындығы!
HFile:=FileCreate(‘test.dat’);//Файл құрамыз!
If Hfile=0 then //қате!
Raise Exception.Create(Файл құруда қате бар!)
Try//Файлды жадыда бейнелейміз.
HMap:=CreateFileMapping(HFile, Nill, Page_ReadWrite, 0, Fsize, Nill);
If Hmap=0 then //қате!
Raise Exception.Create(‘Файлы бейнелеуде қате бар’);
Try//көру терезесін құрамыз:
AdrBase:=MapViewOfFile(Hmap, File_Map_Write, 0, 0, FSize);
IfadrBase=Nil then //қате!
Raise Exception.Create(‘Файлы көру мүмкін емес’);
//Құру терезесін дұрыс шығару үшін бастапқы адресті сақтаймыз:
AdrReal:=AdrBase;
For k:=1 to se.Value do
Begin
AdrReal^:=Random; //Файлға жаңа санды орналастырамыз!
//Ағымдағы адресті шығарудан бұрын оны Integer немесе Cardinal типіне келтіру қажет!
AdrReal”=Pointer(Integer(AddReal)+SizeOf(Real));
LbMem.Caption:=IntToStr(k);
Pb.Position:=k;
Application.ProcessMessage;
End; //Көру терезесін бостамыз!
Unmap ViewofFile(AdrBase)
Finally //Бейнелеуден босатамыз
CloseHandle(HMap) End;
Finally //Файлды жабамыз!
CloseHandle(HFile) End; //Есептеу уақытын хабарлаймыз.
Pb.Hide;
LbMem.Caption:=TimeToStr(Time_BegTime) End;
Procedure Tform1.btFileClick(Sender.TObject);
//Файлды әдеттегі әдіспен құру
var F: File of Real; K: Integer;
BegTime:TdateTime;
R:Real; //Writе операторына арналған буферлік айнымалы
Begin
BegTime:=Time; //Уақытты іске қосамыз
//ProgressBar дайындалады:
Pb.Max:=se.Value;
Pb.Position:=0;
Pb.Show; //Файл құрамыз
AssignFile(F, ‘test.dat’);
Rewrite(F);
For I:=1 to se.Value do
Begin R:=Random;
//Write операторын шақыру параметрі тек //айнымалы болуы мүмкін
Write(F,R); LbFile.Caption:=IntToStr(k);
Pb.Position:=k;
Application.ProcessMessages;
End;
CloseFile(F); Pb.Hide;
LpFile.Caption:=TimeToStr(Time_BegTime)
End; End.
Тапсырма №2.
//мәтіндік файлды көру және жөндеу
unit rd_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
Type
TForm1=class(TForm)
Memo1:TMemo;
Edit1:TEdit;
Button1:TButton;
Button2:TButton;
CheckBox1:TCheckBox;
Procedure Button2Click(Sender:TObject);
Procedure Button1Click(Sender:TObject);
Procedure Edit1KeyPress(Sender:TObject; var Key:Char);
Procedure CheckBox1Click(Sender:TObject);
Private {Private declarations}
Public {Public declarations}
End;
Var
Form1:TForm1;
Implementation {SR*.dfm} //жөндеу алаңында клавишты басу
Procedure TForm1.Edit1KeyPress (Sender:TObject; var Key: Char);
Begin
If Key=#13 // клавишы
Then Button1.SetFocus;
End;
//ашу батырмасын басу
Procedure TForm1.Button1Click(Sender:TObject);
Var f:TextFile; //файл
fName:String[80]; //файл аты
buf:String[80]; //жолды оқуға арналған буфер
begin
fName:=Edit1.text;
AssignFile(f, fName);
Try Reset(f); //файлды оқу үшін ашу
except
on EInOutError do
begin
ShowMessage(‘Файлға кіруде қате бар’+ fName);
Exit; end; end; //файлдан оқу
While not EOF(f) do
Begin
Readln(f, buf); //файлдан жолды оқу
Memo1.Lines.Add(buf); //Memo1 өрісіне жол қосу
End;
CloseFile(f); //файлды жабу
end; // Сақтау батырмасын басу
procedure TForm1.Button2Click(Sender: TObject);
var
f: TextFile; // файл
fName: String[80]; // файл аты
i: integer;
begin
fName:=Edit1.Text;
AssignFile(f, fName);
try
Rewrite(f); // файлды қайта жазу үшін ашу
except
on ElnOutError do
begin
ShowMessage(‘Файлға кіруде қате бар’+fName);
exit;
end;
end;
// файлға жазу
for i:=0 to Memo1.Lines.Count do // Memo редакторындағы жолдар нөлден бастап нөмірленген
writeln(f, Memo1.Lines[i]);
CloseFile(f); // файлды жабу
MessageDlg(‘мәліметтер файлға жазылды’,mtInformation,[mbOk],0);
end;
// Тек оқу үшін ауыстырып қосқышын басу
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if not CheckBox1.Checked then
begin
Memо1.ReadOnly:=False;
Button2.Visible:=True
end
else
begin
Memo1.ReadOnly:=True; // жөндеуді шектеу
Button2.Visible:=False; // Сақтау батырмасы жұмыс істемейді
end;
end;
end.
Тапсырма №3.
unit pogoda_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
Type
TForm1=class(TForm)
MonthCalendar1: TMonthCalendar;
Label1: TLabel;
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure ButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
implementation
{ $R*.dfm }
const
DBNAME=’pogoda.txt’;
var
db:TextFile; //файл – мәліметтер қоры
//Жұмыстың басы. Мәліметтер қоры файлын ашамыз немесе құрамыз.
Procedure TForm1.FormCreate(sender:TObject);
var
r:integer; // пайдаланушының жауабы
begin
AssignFile(db,DBNAME);
Try
Append(db); // қате болу мүмкін
except
on E:EInOutError do
begin
r:=MessageDlg(‘(pogoda.txt)мәліметтер қоры файлы табылған жоқ.’+
#13+’Файл құру керек
?’,mtWarining,[mbOk,mbCancel],0);
if r=mrOK
then begin
Rewrite(db); //Файл құрамыз
ShowMessage(‘мәліметтер қоры файлы құрылады!’);
End
Else Application.Terminate; //Программа жұмысын аяқтау
End;
End;
Edit1.Enabled:=True;
Button1.Enabled:=True;
End;
//Температура өрісінде клавишты басу
Procedure TForm1.Edit1KeyPress(Sender:TObject; var Key:Char);
Begin
Case Key of
‘0’..‘9’,#8: ; // цифрлар және
#13: // клавишы
If Length(Edit1.Text)<>0
then Button1.SetFocus;
‘,’,’.’ begin // ондық нүкте
Key:=DecimalSeparator;
If Pos(DecimalSeparator,Edit1.Text) <> 0
then
then
else Key:=Char(0);
else Key:=Char(0); // қалған символдар рұқсат етілмейді
end;
end;
// Қосу батырмасын басу
Procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(Edit1.Text)=0
then ShowMessage(‘Температураны енгіз’)
else begin
writeln(db,
FormatDateTime(‘dd/mm/yy’,MonthCalendar1.Date),
‘’,Edit1.Text);
Edit1.Text:=’’;
End;
End;
//Программа жұмысының аяқталуы
Procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseFile(db); //Файлды жабу
end;
end.
Тапсырма №4.
Файлдарды сақтау және оқу жұмысын SaveDialog1 және OpenDialog1 компоненттері арқылы ұйымдастырылады. Бұл компоненттер бетінде Dialogs орналасқан (ол жөнінде ІV тарауда айтылған).
Енді оқиғаны өңдеуші процедуралар құруды қарастырайық. әрбір компоненттің Name қасиетін: BitBtn1-ді -BitBtnNew, BitBtn2-ні -BitBtnOpen, BitBtn3-ті -BitBtnSort, BitBtn4-ті – BitBtnSave деп алмастырайық. Әрбір батырманы жылдам екі рет басу арқылы сәйкес оқиғаларды өңдеуші процедураларды ашып, төмендегі программа мәтінін енгіземіз.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Buttons, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
BitBtnNew: TBitBtn;
BitBtnOpen: TBitBtn;
BitBtnSort: TBitBtn;
BitBtnSave: TBitBtn;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
SpinEdit1: TSpinEdit;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure BitBtnSortClick(Sender: TObject);
procedure BitBtnNewClick(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
procedure BitBtnOpenClick(Sender: TObject);
procedure BitBtnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var mzap:array[1..20] of zap; //жазулар массивін хабарлау
FileZap:file; // мәтіндік файлды хабарлау
FileNameZap,FileNameText:String; //жазулар файлы мен мәтіндік файлдардың атаулары
n:integer; //жазулар массивінің ағымдағы элементтер саны
//форма құру процедурасы
var
Form1: TForm1;
Implementation {$R *.dfm}
type
zap=record // жазуды хабарлау
fio:string[20];
mat, phiz, chem:integer;
end;
var mzap:array[1..20] of zap; // жазулар массивін хбарлау
fileZap:file of zap; // жазулар файлын хабарлау
fileText:textfile; //мәтіндік файлды хабарлау
filenameZap,FileNameText:string; // жазулар файлы мен мәтіндік файлдардың атаулары
n:integer; //жазулар массивінің ағымдағы элементтер саны
//форма құру процедурасы
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
with stringGrid1 do
begin //StringGrid 1 ұяшықтарын толтыру
Cells[0,0]:='ғ';
Cells[1,0]:='fio';
Cells[2,0]:='matem';
Cells[3,0]:='phyzics';
Cells[4,0]:='chemstry';
end;
BitbtnSort.Hide; // батырманы жасыру
{BitbtnSave.Hide;}
end;{}
// Сұрыптауды орындайтын процедура
procedure TForm1.BitBtnSortClick(Sender: TObject);
var i,j:integer; vper:zap;
begin
for i:=1 to n do
with StringGrid1, mzap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
phiz:=StrToInt(Cells[3,i]);
chem:=StrToInt(Cells[4,i]);
end; // көпіршікті сұрыптау әдісі
for i:=2 to n do
for j:=n downto i do
if mzap[j-1].fio>mzap[j].fio then
begin
vper:=mzap[j-1];
mzap[j-1]:=mzap[j];
mzap[j]:=vper;
end;
for i:=1 to n do // StringGrid1 ұяшығын жазулар массивінің өрістерімен толыру
with StringGrid1, mzap[i] do
begin Cells[0,i]:=intTostr(i);
Cells[1,i]:=fio;
Cells[2,i]:=intTostr(mat);
Cells[3,i]:=intTostr(phiz);
Cells[4,i]:=intTostr(chem);
end;
end;
// жаңа жазу файлын құру
procedure TForm1.BitBtnNewClick(Sender: TObject);
var
i:integer;
begin
if MessageDlg('Файл мазмұнының өшірілмейтініне сенімдісі
бе?',mtConfirmation, mbYesNoCancel,0)<>mrYes
Then
begin
for i:=1 to n do
with StringGrid1, mzap[i] do
begin
fio:=Cells[1,i];
mat:=StrToInt(Cells[2,i]);
phiz:=StrToInt(Cells[3,i]);
chem:=StrToInt(Cells[4,i]);
end;
with SaveDialog1 do
begin
Title:='Create file'; // сұхбат терезе тақырыбы
if Execute then
begin
FileNameZap:=Filename;
AssignFile(FileZap, FileNameZap);
Rewrite(FileZap); //файлды жазу үшін ашу
for i:=1 to n do
write(FileZap, mzap[i]); // файлға жазулар массивін жазу
end;
end;
end;
end;
// батырманың өлшемінің өзгеруін басқаратын батырма
end;
//батырманың өлшемінің өзгеруін басқаратын батырма
procedure TForm1.SpinEdit1Change(Sender: TObject);
var i,m:integer;
begin
SpinEdit1.Text:='5';
m:=StrToInt(SpinEdit1.Text); // өлшемге жаңа мән меншіктеу
with StringGrid1 do
begin
RowCount:=m+1; // жолдар санын есептеу
if m>n then
for i:=n+1 to m do
begin
Cells[0,i]:=intToStr(i);
Cells[1,i]:='';
Cells[2,i]:='';
Cells[3,i]:='';
Cells[4,i]:='';
end;
end;
n:=m;
end;
//Open батырмасының процедурасы
procedure TForm1.BitBtnOpenClick(Sender: TObject);
var i:integer;
begin
with OpenDialog1 do
begin Title:='Openfile'; // сұхбат терезе тақырыбы
if Execute then
begin
FileNameZap:=FileName;
AssignFile(FileZap,FileNameZap);
Reset(FileZap);
n:=0; while not E of (FileZap) do
begin n:=n+1;
read(fileZap,Mzap[n]);
end;
SpinEdit1.text:=IntToStr(n);
StringGrid1.RowCount:=n+1;
for i:=1 to n do
with StringGrid1, MZap[i] do
begin
Cells[0,i]:=IntToStr(i);
Cells[1,i]:='fio';
Cells[2,i]:=IntToStr(mat);
Cells[3,0]:=IntToStr(phiz);
Cells[4,0]:=IntToStr(chem);
end; clouseFile(FileZap); end; end;
BitbtnSort.Show; BitbtnSave.Show; end; end;
// мәліметтерді мәтіндік файлда сақтау процедурасы
procedure TForm1.BitBtnSaveClick(Sender: TObject);
var i:integer;
begin
with SaveDialog1 do
begin
if Execute then
begin
Filenametext:=FileName;
AssignFile(FileText, FilenameText);
Rewrite(Filetext);
for i:=1 to n do
with MZap[i] do
writeln(Filetext, i:3,fio:20,mat:5,phiz:5,chem:5);
CloseFile(FileText);
end; BitbtnSort.Hide;
end;
end;
end.
Достарыңызбен бөлісу: |