Qiymati
| Animatsiyasi |
Ma`nosi
|
|
|
aviCopyFiles
|
|
Fayllardan nusxa olish
|
|
|
AviDeleteFile
|
|
Fayllarni o`chirish
|
|
|
AviRecycleFile
|
|
Fayllarni korzinaga jo`natish
|
| 13.2. MediaPlayer komponentasi
MediaPlayer komponentasi System panelida joylashgan bo’lib, videorlik, ovoz va ovozli animatsiyalar ko`rish uchun mo`ljallangan.
MediaPlayer komponetasi qo`yilgan formada tugmalar gruppasi paydo bo`ladi. (12.5-rasm.) Bu tugmalarning vazifalari 12.4-jadvalda, MediaPlayer komponentasi hususiyatlari esa 12.5-jadvalda berilgan.
12.5-rasm. MediaPlayer komponentasi
MediaPlayer komponentasining tugmalari 12.4-jadval.
Tugma
|
Ma’nosi
|
nomi
|
Vazifasi
|
|
Boshlash
|
btPlay
|
Animatsiyani qo`yishni boshlash
|
|
Pauza
|
btPause
|
Ko`rsatishda pauza qilish
|
|
Stop
|
btStop
|
Ko`rsatishni to`xtatish
|
|
Navbatdagisi
|
btNext
|
Navbatdagi kadrga o`tish
|
|
Avvalgisi
|
btPrev
|
Avvalgi kadrga o`tish
|
|
Qadam
|
btStep
|
Navbatdagi parchaga o`tish
|
|
Orqaga
|
btBack
|
Avvalgi ovozli parchaga o`tish
|
|
Yozish
|
btRecord
|
Yozish
|
|
Ochish Yopish
|
btEject
|
Disk yuritgishni ochish (yopish)
|
MediaPlayer komponentasning hususiyatlari 12.5-jadval.
Hususiyati
|
Vazifasi
|
DeviceType
|
Qurilma nomi. DtAutoselect – qurilma nomini to’g’ridan-to’g’ri aniqlash; dtCDAudio - CD-proigrivatel; dtAVIVideo — videoproigrivatel.
|
FileName
|
Faylning nomi. Qo`yib eshitilmoqchi bo`lgan ovozli fragment yoki videorolik yozilgan fayl.
|
AutoOpen
|
Ovoz yoki videorolik yozilgan faylni dastur ishga tushganda avtomatik ochish belgisi.
|
Display
|
Sirtida videorolik qo`rsatiladigan komponenta nomi (odatda Panel dan foydalaniladi).
|
VisibleButtons
|
Komponentaning ko`rinadigan tugmalarini belgilaydi. Ayrim tugmalarni ko`rinmaydigan qilish mumkin.
|
Ovozlarni eshitish. Ovozli fragmentlar odatda kengaytmasi WAV bo`lgan fayllarda saqlanadi. Masalan, C:WinntMedia katalogida Windows ning standart ovozli fayllari saqlanadi.
12.2-listingdagi dastur (12.6-rasm) MediaPlayer komponentasidan ovozli (wav) fayllarni eshitish uchun foydalanish usulini namoyish qiladi.
Formada MediaPlayer dan tashqari ListBox va ikkita Label (biri – axborotlarni chiqarish uchun, ikkinchisi - foydalanuvchi tanlagan ovozli fayl nomi) komponentalari joylashtirilgan. Unga ko`ra, ekranda dialog oynasi ochilganidan keyin "Zvuk Microsoft" fragmenti eshitiladi. So`ngra foydalanuvchi taklif qilingan ro`yxatdan C:WindowsMedia papkasidagi ovozli fayllardan birini tanlaydi va eshitish tugmasi chertib, bu faylda qanday ovoz yozilganligini eshitib ko`rish mumkin.
MediaPlayer1 komponentasi hususiyatlari 12.6-jadvalda keltirilgan, qolgan qiymatlari o`zgarmaydi.
MediaPlayer1 komponentasining hususiyatlari 12.6-jadval.
Komponenta
|
Qiymati
|
DeviceType
|
DtAutoSelect
|
FileName
|
C:WindowsMediaZvuk Microsoft-zaпуск.wav
|
AutoOpen
|
True
|
VisibleButtons . btNext
|
False
|
VisibleButtons .btPrev
|
False
|
VisibleButtons . btStep
|
False
|
VisibleButtons . btBack
|
False
|
VisibleButtons . btRecord
|
False
|
VisibleButtons .btEject
|
False
|
12.6-rasm. Microsoft Windows ovozlari dasturining dialog oynasi
12.3-listing. Microsoft Windows ovozlarini tinglash
const
SOUNDPATCH 'c:windowsmedia '; ovozli fayllar papkasi
ModeStr: array[TMPModes] of string ('Not ready', 'Stopped', 'Playing', 'Recording', 'Seeking', 'Paused', 'Open');
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
var SearchRec: TSearchRec;
qidirish shartini qanoatlantiruvchi struktura
begin
Form1.MediaPlayer1.Play;
c: windows media katalogidagi WAV-fayllar ro`yxati
if FindFirst(SOUNDPATCH'*.wav', faAnyFile, SearchRec)0 then
begin katalogda WAV kengaytmali fayl mavjud
Bu faylning nomini ro`yxatga qo`shamiz
Form1.ListBox1.Items.Add(SearchRec.Name);
xozircha papkada WAV kengaytmali boshqa fayllar bor
while (FindNext(SearchRec) 0) do
Form1.ListBox1.Items.Add(SearchRec.Name);
end;
end;
ro`yxatdagi element chertilsa
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Label2 maydonida tanlangan fayl nomini qo`rsatish
Label2.Caption : ListBox1.Items[ListBox1.itemIndex];
end;
MediaPlayer komponentasi tugmasi chertilsa
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
var DoDefault: Boolean);
begin
if (Button btPlay) and (Label2.Caption <> '') then
begin Play tugmasi bosilganda
with MediaPlayer1 do
begin
FileName: SOUNDPATCH Label2.Caption; tanlangan fayl
Open;
MediaPlayer1.Wait : True;
Play;
end;
end;
end;
procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
with Sender as TMediaPlayer do
begin
Form1.Caption : ModeStr[Mode];
Notify : True;
end; end;
end.
Dasturda ishlaganda onFormActivate protsedurasi MediaPlayer1 komponentasiga nisbatan Play metodini qo`llaydi. Shu protseduraning o`zi katalogidagi WAV-fayllar ro`yxatini aniqlaydi. Ro`yxatni hosil qilishda FindFirst va FindNext funksiyalaridan foydalaniladi. Xar ikki funksiyaga parametr sifatida WAV-fayl niqobi (qidirish sharti) hamda Name maydoni qidirish shartini qanoatlantiruvchi fayl nomiga teng bo`ladigan SearchRec struktura-o`zgaruvchisi beriladi.
Ro`yxat elementlaridan birini chertish xodisasiga ListBox1Click protsedurasi javob beradi. U Label2 maydonida foydalanuvchi tanlagan fayl nomini chiqaradi (dastur ishlayotgan vaqtda ItemIndex hususiyatining qiymati ro`yxatdan tanlangan elementning tartib nomeriga teng bo`ladi. ).
MediaPlayer1 tugmalaridan birini chertish MediaPlayer1Slick protsedurasini faollashtiradi. U qaysi tugma chertilganini aniqlaydi. Agar eshitish (btPlay) tugmasi chertilsa, MediaPlayer1 komponentasining FileName hususiyatiga tanlangan fayl nomi yoziladi, Open metodi uni yuklaydi va eshitish jarayonini faollashtiradi.
13.3. Videorolik va animatsiyalarni ko`rish
MediaPlayer komponentasi ovozli fayllarni eshitishdan tashqari, AVI-fayl shaklidagi videorolik va mul’tiplikatsion fil’mlarni tomosha qilishga imkon beradi. AVI - bu Audio Video Interleave so`zidan olingan bo`lib, "ovoz va videoning ketma-ket" qabilida tarjima qilinishi mumkin.
AVI-fayllarni ko`rish uchun MediaPlayer komponentasidan foydalanish jarayonini 12.4-listingdagi dastur yordamida izohlaymiz. Ushbu dastur oynasidagi buyruqli tugma chertilsa, forma sirtida ovozli effektga ega bo`lgan mul’tiplikatsiya - soat strelkasi bo`yicha aylanayotgan Delphi so`zi paydo bo`ladi (bu mul’tiplikatsiya delphi.avi faylidan saqlanadi.). Uning dialog oynasi 12.12-rasmda, MediaPlayer1 komponentasi hususiyatlari esa 12.8-jadvalda berilgan.
|
|
12.12-rasm. MediaPlayer dan foydalanish dasturining dialog oynasi
|
MediaPlayer1 komponentasining hususiyatlari 12.8-jadval.
Hususiyati
|
Qiymati
|
Name
|
MediaPlayer1
|
FileName
|
delphi.avi
|
DeviceType
|
dtAVIVideo
|
AutoOpen
|
True
|
Display
|
Panel1
|
Visible
|
False
|
Ilova formasini ishlab chiqishda Panel1 komponentasi ekran sifatida foydalaniladi. Uning nomi MediaPlayer1 ning Display hususiyatiga beriladi. Shuning uchun formaga dastlab Panel, so`ngra MediaPlayer komponentalarini joylashtirish lozim.
Shuni esda tutish keraki, animatsiyalarni panelga chiqarish sohasi o`lchamlari panelning Width va Height hususiyatlari bilan emas, balki MediaPlayer komponentasi hususiyati bilan belgilanadi. DisplayRect hususiyatining qiymati dastur ishlab turgan paytda
MediaPlayer1.DisplayReet : Rect(0, 0, 60, 60)
buyrug’i bilan o`rnatiladi.
Eslatma: AVI-faylidagi kadr o`lchamlari haqidagi axborotlarni olish uchun, bu fayl saqlanayotgan papkani ochiladi va faylning kontekst menyusidan Свойства buyrug’i tanlanadi va ochilgan oynadan Сводка tugmasi chertiladi.
12.4-listing. Ovozli animatsiyani qo`yib ko`rish
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.MediaPlayer1.Play; animatsiyani qo`yish
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
forma sirtida animatsiya uchun soha o`lchami aniqlanadi
MediaPlayer1.DisplayRect : Rect(0, 0, 60, 60);
end;
end.
Animatsiyalarni ko`rish jarayoni Play metodi yordamida faollashtiriladi.
14-BOB. REKURSIYA
14.1. Rekursiya tushunchasi
Rekursiyani quyidagicha izohlash mumkin. yechilmagan masalani yechish uchun shu masalaning o`zidan foydalaniladi. Boshqacha aytganda, qo`yilgan masalani bir hil boshlang’ich ma`lumotlar uchun yechish maqsadida shu masalaning o`ziga, faqat boshqa boshlang’ich ma`lumotlar uchun murojaat qilinadi. Agar keyingi masalaning yechimi topilsa, dastlabki masala ham yechimini topish mumkin bo`ladi.
Agar dastur o`zini-o`zi protsedura yoki funksiya sifatida foydalanadigan bo`lsa, bunday dasturlarni rekursiv dastur deyiladi. Rekursiv dasturlar ikki turga bo`linadi:
a) To`g’ri rekursiya. Bunda masala o`ziga-o`zi murojaat qiladi.
b) YOndosh rekursiya. Bunda 1-masala 2- masalaga, 2-masala esa 1-masalaga murojaat qiladi.
Rekursiv dastur yozish uchun quyidagi ikki holat aniqlangan bo`lish kerak.
1) rekkurent munosabat;
2) shu munosabat uchun boshlang’ich holat aniqlangan bo`linshi shart.
Rekkurent munosabat deganda biror jarayonning N va N-1 qadamlarini bog’lovchi munosabat tushuniladi. Masalan, N! N(N-1)! formulani N! uchun rekkurent munosabat deb qarash mumkin. Bu munosabat uchun boshlang’ich holat bo`lib, 1! 1 xizmat qiladi. Bu ma`lumotlarni hisobga olsak, faktorialni hisoblash masalasi uchun rekkurent munosabatlar quyidagicha bo`ladi:
Ko`rinib turibdiki, N! ni hisoblash uchun avval (N-1)! ni topish kerak. Lekin, (N-1)! ning ham qiymati noma`lum. Ammo, ma`lumki, (N-l)! (N-2)!∙(N-1) va h.k. SHunday qilib, N!N(N-1)(N-2)...21 . Ko`rinib turibdiki, N! ni hisoblash algoritmi o`z ichiga o`zi "cho`kib" bormoqda. Bu jarayon to boshlang’ich holat sodir bo`lgunga, qadar, ya`ni 1! gacha davom etadi. Shundan keyin, "cho`kish" jarayoni to`xtaydi, 1! 1 ekanligi haqida ko`rsatma olib, yuqoriga "suzib" chiqish jarayoni boshlanadi:
va hokazo. Bu holat to N! hisoblanmaguncha davom etaveradi.
Dastur ishlab chiqish quyidagi g’oyaga asoslanadi: N! ni hisoblash uchun funksiya yaratib, bu funksiya qiymatini hisoblash uchun shu funksiyaning o`ziga, faqat N-1 bo`lgan hol uchun murojaat qilinadi, ya`ni funksiya o`zini o`zi yordamchi funksiya sifatida foydalanadi. 13.1-listingda shu masala uchun yozilgan rekursiv dasturi keltirilgan.
13.1-listing. Rekursiv funksiya
function factorial(n: integer): integer;
begin
if n <> 1
then factorial: n * factorial(n-1)
funksiya o`zini o`zi chaqiryapti
else factorial : 1; boshlang’ich holatga kelindi
end;
N 4 bo`lgan hol uchun rekursiv "cho`kish" va "suzib chiqish" jarayoni quyidagi jadvalda berilgan:
N ning qiymatlari
|
4
4 3 2 1
|
yakuniy rekursiyadan chiqishdagi oraliq qiymatlar
|
N 1 sharti
|
yo`q yo`q yo`q ha
|
|
|
fak(3)*4
fak(2)*3
fak(1)*2
1
|
f ac(4) fac *4 24
fac(3) fac *3 6
fac(2) fac *2 2
fac(1) 1
|
Demak, EHM N 4 bo`lgan hol uchun 24 natijani beradi.
Yuqoridagi dasturda funksiya o`ziga o`zi parametrining qiymati 1 ga teng bo`lmagan hollarda murojaat qilayapti. Agar bu parametr 1 ga teng bo`lsa, funksiya o`z qiymatini hisoblaydi, shu bilan "cho`kish" jarayoni tugab, "suzib chiqish" jarayoni boshlanadi. Faktorialni rekursiv hisoblash dasturining dialog oynasi 13.1-rasmda, dasturining to`la matni esa 13.2-listingda keltirilmoqda.
13.1-rasm. Faktorialni hisoblash dasturining oynasi
13.2-listing. Rekursiv funksiyadan foydalanish.
rekursiv funksiya
function factorial(n: integer): integer;
begin
if n > 1 then
factorial : n*factorial(n-1) funksiya o`zini-o`zi chaqiradi
else factorial : 1; 1! = 1
end;
procedure TForm1.Button1Click(Sender: TObject);
var
k:integer; faktoriali hisoblanayotgan son
f:integer; k faktorialning qiymati
begin
k : StrToInt(Edit1.Text);
f : factorial(k);
label2.caption : Edit1.Text ' sonining faktoriali '
IntToStr(f)' ga teng ';
end;
end.
13.2-rasmda dasturning turli boshlang’ich ma`lumotlar uchun ikkita dialog oynasi keltirilgan. 12.2a-rasmda faktorialni hisoblash dasturi natijasi kutilgan songa mos keladi. 13.2b-rasmda berilgan natija esa bunday emas. Katta sonlar (masalan, 45) faktorialini hisoblashda bajarish vaqtida hatolik yuzaga kelib qoldi. Buning sababi shuki, 44! soni juda katta son va Integer tipidagi sonlar diapazonidan chetga chiqib ketadi.
Delphi tili dasturda o`zgaruvchilar qiymatlarini belgilangan diapazondan chetga chiqib ketishini nazorat qilishi mumkin. Buning uchun Project Options (13.3-rasm) dialog oynasining Compiler tugmasi chertish, ekranda ochilgan oynadan Runtime errors (bajarish vaqtidagi
13.2a-rasm. N12 bo`lgan hol uchun dasturning dialog oynasi
13.2a-rasm. N45 bo`lgan hol uchun dasturning dialog oynasi
hatoliklar) guruhidagi Overflow checking (to`lib ketishni nazorat qilish) bayroqchasini o`rnatish lozim.
14.2. Fayllarni qidirish
Rekursiyadan foydalanishga yana bir misol sifatida berilgan faylning mavjud yoki mavjud emasligini tekshirish masalasini ko`ramiz.
Aytaylik, foydalanuvchi ko`rsatgan papka va uning ichki papkalarida joylashgan barcha .bmp kengaytmali fayllar ro`yxatini aniqlash talab qilingan bo`lsin. Bu masala algoritmini quyidagicha ifodalash mumkin:
1. Qidirish shartini qanoatlantiruvchi barcha fayllar ro`yxatini chiqarilsin.
2. Agar papkaning ichki papkalari mavjud bo`lsa, ko`rsatilgan fayl ulardan ham qidirilsin.
Bu algoritm (blok-sxemasi 13.4-rasmda keltirilgan) rekursiv hisoblanadi. Belgilangan faylni ostkataloglardan ham qidirish lozim. Buning uchun qidirish protsedurasi o`ziga murojaat qiladi. Dasturning dialog oynasi 13.5-rasmda, matni esa 13.3-listingda berilgan.
Fayl (Edit1) maydoni qidirilayotgan faylning nomi yoki niqobi (bir hil tipdagi fayllar) uchun foydalaniladi. Qarash lozim bo`lgan papka nomini bevosita Папка maydonida ko`rsatish yoki standart Обзор папок dialog oynasidan tanlanishi mumkin. (13.6-rasm.) Bu oyna ekranga argumenti WhideChar ko`rinishidagi satr bo`lgan Selectdirectory funksiyasi yordamida chaqiriladi. Oddiy satrni StringToWhideChar funksiyasi yordamida WhideChar tipiga aylantirish mumkin.
Обзор папок dialog oynasi Папка tugmasi chertilganda ochiladi.
13.3-rasm. Project Options dialog oynasi Compiler buyrug’ining oynasi
|
|
13.4-rasm. Fayllarni qidirish ning rekursiv algoritmi
|
13.5-rasm. Dasturning dialog oynasi
|
Ushbu dasturda asosiy masalani Find rekursiv funksiyasi hal qiladi. Bu funksiya yagona parametr - searchRec strukturasiga ega bo`lib, undan FindFirst va FindNext funksiyalari mos ravishda qidirish shartini mos keluvchi birinchi va navbatdagi fayllarni topish uchun foydalanadi.
13.3-listing. Fayllarni qidirish dasturi.
var
FileName: string; // qidiriladigan faylning nomi yoki niqobi
cDir: string;
n: integer; // qidirish shartini qanoatlantuvchi fayllar
// joriy katalogda faylni qidirish
procedure Find;
var
SearchRec: TSearchRec; //fayl yoki katalog haqida ma`lumot
begin
GetDir(0,cDir); // joriy katalog nomini olish
if cDir[length(cDir)] <> '\' then cDir := cDir+'\';
if FindFirst(FileName, faArchive,SearchRec) = 0 then
repeat
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
begin
Form1.Memo1.Lines.Add(cDir + SearchRec.Name);
n := n + 1;
end;
until FindNext(SearchRec) <> 0;
// joriy katalogning ostkataloglarini qayta ishlash
if FindFirst('*', faDirectory, SearchRec) = 0 then
repeat
if (SearchRec.Attr and faDirectory) = SearchRec.Attr then
begin
// .. va . ham papka , ularga kirish kerak emas
if SearchRec.Name[1] <> '.' then
begin
ChDir(SearchRec.Name);// papkaga kirish
Find; // ostkatalogdan qidirish
ChDir('..');// papkadan chiqish
end;
end;
until FindNext(SearchRec) <> 0;
end;
// foydalanuvchi tanlagan katalog
function GetPath(mes: string):string;
var
Root: string; // o`zak katalog
pwRoot : PWideChar;
Dir: string;
begin
Root := ''; // o`zak katalog - Rabochiy stol papkasi
GetMem(pwRoot, (Length(Root)+1) * 2);
pwRoot := StringToWideChar(Root, pwRoot, MAX_PATH*2);
if SelectDirectory(mes, pwRoot, Dir)
then
if length(Dir) = 2 // foydalanuvchi o`zak papka tanladi
then GetPath := Dir+'\'
else GetPath := Dir
else
GetPath := '';
end;
// topilsin tugmasini chertish
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear; // Memo1 maydonini tozalash
Label4.Caption := '';
FileName := Edit1.Text; // nima qidiriladi
cDir := Edit2.Text; // qaerdan qidiriladi
n:=0; // topilgan fayllar soni
ChDir(cDir); // qidirish boshlangan papkaga kirish
Find; // qidirishni boshlash
if n = 0 then
ShowMessage('Qidirish shartini qanoatlantirgan fayllar yo`q.')
else Label4.Caption := 'Topilgan fayllar soni :' + IntToStr(n);
end;
// Papka tugmasini chertish
procedure TForm1.Button2Click(Sender: TObject);
var
Path: string;
begin
Path := GetPath('Papkani tanlang');
if Path <> ''
then Edit2.Text := Path;
end;
14.3. Gil’bert egri chizig’i
Quyidagi dastur Gil’bert egri chizig’ini chizish uchun mo`ljallangan. 13.7-rasmda 1, 2 va 3-tartibli Gil’bert egri chiziqlari tasvirlangan.
Agar diqqat bilan qaralsa, 2-tartibli Gil’bert egri chizig’i to`rtta 1-tartibli Gil’bert egri chiziqlarini to`g’ri chiziq bilan birlashtirishdan, 3-tartibli Gil’bert egri chizig’i esa to`rtta 2-tartibli Gil’bert egri chiziqlarini birlashtirishdan hosil bo`ladi. Sрunday qilib, Gil’bert egri chiziqlarini chizish algoritmi rekursiv bo`ladi. 5-tartibli Gil’bert egri chiziqlari (13.4-listing) joylashgan dialog oynasining ko`rinishi 13.8-rasmda keltirilgan.
13.7-rasm. 1, 2 va 3-tartibli Gil’bert egri chiziqlari
13.8-rasm. Beshinchi tartibli Gil’ber egri chizig’i
13.4-listing. Gil’bert egri chiziqlari
var
p: integer 5; egri chiziqning tartibi
u: integer 7; shtrix uzunligi
{ Gil’bert egri chizig’i birlashtirilgan to`rtta a, b, c va d elementlardan iborat. Har bir elementni mos protsedura chizadi. }
procedure a(i:integer; canvas: TCanvas); forward;
procedure b(i:integer; canvas: TCanvas); forward;
procedure c(i:integer; canvas: TCanvas); forward;
procedure d(i:integer; canvas: TCanvas); forward;
egri chiziq elementlari
procedure a(i: integer; canvas: TCanvas);
begin
if i > 0 then begin
d(i-1, canvas); canvas.LineTo(canvas.PenPos.Xu,canvas.PenPos.Y);
a(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Yu);
a(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);
c(i-1, canvas);
end;
end;
procedure b(i: integer; canvas: TCanvas);
begin
if i > 0 then
begin
c(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);
b(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);
b(i-1, canvas); canvas.LineTo(canvas.PenPos.Xu,canvas.PenPos.Y);
d(i-1, canvas);
end;
end;
procedure c(i: integer; canvas: TCanvas);
begin
if i > 0 then
begin
b(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);
c(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);
c(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Yu);
a(i-1, canvas);
end;
end;
procedure d(i: integer; canvas: TCanvas);
begin
if i > 0 then
begin
a(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Yu);
d(i-1, canvas); canvas.LineTo(canvas.PenPos.Xu,canvas.PenPos.Y);
d(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);
b(i-1, canvas);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Form1.Canvas.MoveTo(u,u);
a(5,Form1.Canvas); Gil’bert egri chizig’ini chizish
end;
Dasturda a elementni chizayotgan protsedura o`zidan tashqari, d va b protseduralarini chaqiradi. Kompilyator hatolik haqida axborot bermasligi uchun protsedura forward xizmatchi so`zi bilan birga e`lon qilingan. Bu hol "e`lonlar keyinroq beriladi" demakdir. Shunday qilib, a protsedurasini kompilyatsiya qilish jarayonida kompilyator b va d nomlari protseduralarni anglatishini "tushunadi".
Do'stlaringiz bilan baham: |