SlideShare a Scribd company logo
Windows үйлдлийн системийн ерөнхий зохион байгуулалтын талаар
товчхон
Windows-н өмнөх хувилбарууд MS-DOS үйлдлийн системтэй сайн зохицон
ажилладаг боловч үйлдлийн систем гэсэн утгандаа бүрэн хүрч чадахгүй байсан
бол өнөөгийн Windows95 өөрөө 1 цогц үйлдлийн системийг илэрхийлж чадах
болжээ.
Windows95 үйлдлийн систем нь ерөнхийдөө 3 дэд системд хуваагддаг.
1. Win KERNEL
2. Win GDI
3. Win USER
Windows95 нь 16 болон 32 битийн программуудыг ажиллуулахдаа системийн
виртуаль машин болон дээрхи 3 дэд системийн тусламжтайгаар зохион
байгуулдаг. Системийн виртуаль машин гэдэг нь Windows-н бүх ажлыг дэмжиж
байдаг Windows95-н бүрэлдхүүнд ордог үйлдлийн орчин юм. Мөн дээрхи 3 дэд
системийн ажлыг дэмжиж байдаг.
32 битийн win гэдэг нь санах ойн 32 битийн моделийг ашиглаж байдаг windows-н
шинэ хэрэглээ юм. Харин 16 битийн win гэдэг нь бидний урьд өмнө хэрэглэж
байсан windows-н хуучин хувилбарууд юм. Тэдгээр нь санах ойн сегментийн
хаяглалтийг буюу чухамдаа 80286 процессорын санах ойн моделийг ашигладаг.
Тэдгээр нь Windows 3.x –нх шиг ажиллахдаа Windows95 нх шиг нэгдмэл нэг
орон зайг хуваан эзэмшдэг бөгөөд олон бодлогын зарчимтай зохицодоггүй.
Windows95-н хэрэглээний программийн төвшинд Windows 3.x –н API бүрэн
тохирч ажилладаг.
Win32 API нь Microsoft –н WinNT, Win32S, Win3.1-н өргөтгөл win32 битийн
интерфейс юм. Windows95 үйлдлийн систем нь олон бодлогын аргад үндэслэн
дээрх application-уудыг жолооддог. Бүрхүүл гэдэг нь хэрэглэгчийг системтэй
харилцах үйлдлийг хангаж байдаг 32 битийн Windows application юм.
Windows95-н бүрхүүл нь windows3.x-н программ менежер, файл менежер
зэргийг нэгтгэсэн application юм.

KERNEL
KERNEL нь windows-н доод түвшиний динамик санах ойн функцүүдээр хангаж
өгч байдаг үйлдлийн системийн цөм юм. Энэ нь 16 ба 32 битийн windows-н
үйлдлүүд тохирох
үйлчилгээг хангадаг.

GDI
GDI нь graphic device interface гэсэн товчилсон үг. Энэ нь Windows95-н график
боломж болон дэлгэцэнд харуулах өнгө, хэлбэр дүрс, resolution-г хангаж байдаг.
Win32 –т байдаг бүх шинэ боломжуудыг агуулна.

USER
USER нь дэлгэцийн диспетчер юм. Windows-н интерфейсийг үүсгэх, удирдах
функцүүдийн цргц юм. Жишээ нь Хэрэглэгч хэд хэдэн MS-DOS –н Prompt гарган
ашиглаж болно.
Хэрэглэгч арай илүү виртуалчилах боломжийг хангадаг хэд хэдэн давуу тал гарч
ирлээ.

Системийн виртуаль машин
Windows-н API функцийн төвшин
Дээр харлуулсан орон зайг хамтарч эзэмшинэ. Энэдээс Windows95 нь 16 битийн
программуудад тусад нь орон зай гарган өгч орчинийг нь бүрдүүлж өгдөг нь
харагдаж байна.
Windows
32 bit
Windows
32 bit
16 bit
16 bit
Бүрхүүл
Windows-н дэд систем
Win KERNEL
KERNEL
Win USER Win GDI

Файл удирдах дэд систем
Сүлжээ удирдах дэд систем
Үйлдлийн системийн үйлчилгээ
Виртуал машин удирдах дэд
систем
Хөтлөгч хэрэгслүүд
Бүрхүүл
Энэ нь хэд хэдэн системийн удирдлагыг хэрэглэх нөөцүүдийн боломжуудаар
хангах программ юм. Windows95-үйлдлийн системийн бүрхүүл нь дэлгэц
системийн нөөцүүдтэй харилцан ажиллахыг удирдан зохион байгуулдаг.
API
Хэд хэдэн зуун API функцүүд windows-н бүх системийн хийх үйлдчилгээг хангаж
өгдөг. Windows-н орчин бол интерфейс баазын дуудалтаар ханддаг. Үүнийг API
гэдэг.
Системийн виртуаль машин
Windows-н бүх application ситемийн виртуаль машины тухайн хил хязгаарт
үйлдлээ гүйцэтгэдэг. 16 битын application –ууд өөрийн нэгдмэл хаяглалын орон
зайд ажилладаг.
Энэ нь application бүрийн өөрийн орон зайн хаяглалтыг 32 битын хаяглалтаар
хангаж дэмжиж өгдөг.
MS-DOS-н виртуаль машин
Windows95 олон тооны MS-DOS-н программыг хамгаалалтын горим эсвэл 8086
виртуаль үйл ажиллагаа ажиллуулж дэмжиж байдаг. MS-DOS-н виртуаль машин
хэд хэдийг үүсгэж болно.
Виртуаль машины диспетчер
Виртуаль машины диспетчер нь үнэндээ үйлдлийн системийн зүрх юм. Энэ нь
доод түвшиний санах ойн удирдлага болон драйверуудын виртуаль зохион
байгуулалтын үйлчилгээг хянаж ажилллаж байдаг.
| Windows95 –н диспетчерүүд
Windows95 –н виртуаль машины диспетчер дотор хоёр диспетчер ажиллаж
байдаг.
Үүнд: Үндсэн диспетчер. (primary scheduler)
Энэ нь thread-дын приоретитүүдийг тооцоолж хариу өгнө.
Квантын диспетчер (timeslice scheduler)
Энэ нь хугацааны квантуудад хувааж хэсэгчлэн ажилуулана.
Үнэн хэрэгтээ квантын диспитчер аль thread-н ямар хувийг нь ямар хугацаанд
процессороор үйлчлүүлэхийг тооцоолно.
Процесс 0-31 хүртэл приоритеттой байдаг ба үүнийг үндсэн диспетчер бодоод
квантын диспетчер лүү гаргана. Хэрвээ процессийн хугацааны квант 100 хувь
болсон бол VMStat_Background эсвэл VMStat_High_Pri_Background гэдэг
төлвийг үлдээдэг.

DELPHI ДЭЭР АНХНЫ АЛХАМ ХИЙЦГЭЭЕ
Та мэдэж байгаа Delphi бол Borland пүүсийн Windows-ийн орчны програмыг
бичдэг дээд түвшний програм юм. Delphi -ээр та Windows -ийн орчны
программыг урьд байгаагүйгээр хялбар бөгөөд хурдан бичих боломжтой.
Win32 эсвэл Win32 graphical user interface (GUI) -ийг та нээж ажиллуулж
болно. Win32 GUI -ийг ажиллуулснаар та дээд түвшний програмчлалын
хэлний үнэн хүч чадлыг мэдрэх болно. Мөн та Web browsers –ийг минутийн
дотор үүсгэдэг шигээ form дээрх ActiveX control -оор тусгай програмуудыг
үүсгэж болно. Энэ мэт олон зүйлийн давуу талууд Delphi -д байдаг ба
Delphi нь өөрөө кодоо үүсгэдэг тул програмын биелэлт хурдан байдаг.
Танд л гэж хэлэхэд Pascal -ын программчлалыг жаахан судлах хэрэгтэй.
Delphi нь Windows програмчлалын доод түвшний нарийн зүйлүүдийг нуудаг
ба энэ нь танд чухал биш. Эцэст нь та програмист л болохыг хүсч байгаа
бол энэ нь бүгдийг судлах хэрэгтэй. Delphi нь танд урьд байгаагүй хөгжил
таашаалыг авчрах болно. Ингээд ханцуйгаа шамлан бүх ажилдаа орогтун.
Delphi сэтгэлийн таашаалыг авчрах агуу программ юм.
Delphi IDE -ийг өнгөц харъя
Энэ хэсэг нь Delphi integrated development environment (IDE) -ийг агуулна.
Windows програмчлалыг судлах бүхэнд энэ нь хэрэгтэй юм. Та одоо Delphi
-ийг эхлэх урам зоригтой байгаа гэж бодож байна. Программыг эхлүүлэхэд
та хоосон form ба IDE -ийг харах болно.




Delphi IDE нь 3 хэсэгт хуваагдана. Дээд хэсгийг нь үндсэн цонх гэдэг. Энэ
нь toolbars болон Component palette -ийг агуулдаг. Delphi toolbars нь
compiling project, хадгалах, нээх үйлдлүүдийг нэг товшилтоор гүйцэтгэх
боломжийг танд олгоно.
Component palette нь wide array of components агуулдаг ба түүнийг form
дээр чирч тавьж болно. Component -ууд нь text labels, edit controls, list
boxes, buttons ба бусад болно. . Componentууд нь бүлгүүдэд хуваагдсан
байна. Component palette -ийн дээд талын tab -ыг харав уу?
Дээр нь очоод click хийвэл өөр өөр component гарч ирнэ. Form дээрээ
component -оо байрлуулахын тулд Component palette -ийн компонентын
button дээр click хийж component -оо харагдах хэсэгт нь очоод click хийх
хэрэгтэй. Яаж хэрэглэх үр дүнд юу болох бол гэж санаа зовох хэрэггүй.
Эдгээр нь хормын дотор болно.
Шинэ нэр томъёо: Component гэдэг бол software -ийн 2 хэсгийг агуулсан
ба тусгай урьдчилан тодорхойлогдсон функц үйлдлийг нь гүйцэтгэж
байдаг. Жишээ нь: text label, edit control, list box.
Обьектийн инспектор
Үндсэн цонхны доор дэлгэцийн зүүн талд Object Inspector байна. Энэ нь
component -ийн properties ба events -үүдийг өөрчлөхөд ашиглагддаг. Delphi
-тэй ажиллах явцдаа үргэлж Object Inspector -ийг та хэрэглэх болно. Object
Inspector нь 2 хэсэгтэй. Properties tab ба Events. Component -ийн properties
нь component -ийг яаж ажиллуулахыг удирдана. Жишээ нь : Color property -
ийг өөрчлөхөд background color -нь өөрчлөгддөг.
Шинэ нэр томъёо: property –нь component -ийн үйл ажиллагааг
тодорхойлдог.
Events хэсэг нь component -ын event -уудын жагсаалтуудаас бүрдэнэ.
Component дотор үйлдэл хийхэд event -ийг ашигладаг. Жишээ нь
component дарагдахад event нь component дарагдсан байна шүү гэж танд
хэлнэ.Та component -д хамаарах код бичиж болох ба тусгай үйлдлийг
гүйцэтгэхэд хэрэглэж болно.
Шинэ нэр томъёо: event бол цонх ба хэрэглэгчтэй ажиллах component -
ийн харилцан ажиллагааны үр дүн юм.
Delphi –ийн ажлын талбар
Delphi IDE -ийн үндсэн хэсэг нь ажлын талбар юм. Ажлын талбар нь Form
Designer -ийг үүсгэнэ. Энэ нь гайхмаар юм биш Form Designer нь өөрөө
form үүсгэдэг. Delphi -д form гэдэг нь программын цонхыг хэлнэ. Form нь
программын үндсэн цонх байж болно, dialog box эсвэл цонхны янз бүрийн
хэлбэртэй байж болно.
Form Designer -ийг, form -ийг үүсгэх процессийн хэсэгт component -уудыг
нь байрлуулах, зөөх зэргээр ашиглаж болно. Form Designer -ийн ард Code
Editor байдаг. Программын кодыг Code Editor дээр бичдэг. Application -ийг
үүсгэн ажиллах явцад Object Inspector, Form Designer, Code Editor, ба
Component palette -ууд нь харилцан уялдаатай байдаг. Та Delphi IDE-ийг
мэддэг боллоо одоо ямар нэг зүйлийг хийж үзье.

Таны эхний програм: Hello World
Дэлгэцэнд Hello World гэж хэвлэх нь бүх програмчлалын хэлний сурах
бичигт байдаг уламжлалт програм юм. Заавал ийм байх албагүй гэж би
боддог. Pascal хэлийг өмнө нь судалсан бол сайн юм. Та гайхаж магадгүй
юм, Delphi танд одоогийн Windows program -ийн Hello World -д хүрэх
хамгийн хялбар замыг зааж өгнө.
Програм бичих
Та яг одоо Delphi -ийг ажиллуулж байгаа бол blank form -ийг харсан байх
ёстой. Form нь Form1 гэж нэрлэгдсэн байдаг. Form -ийн зүүн хэсэгт Object
Inspector form -ийн properties -үүдийг харуулна. Object Inspector -ийн title bar
дээр товш. Caption property нь идэвхжих ба cursor нь тэнд юу хийхийг
хүлээнэ. Hello World! гэж бичин form -ийн caption -ийг өөрчил.
Санамж: Properties -ийг өөрчлөх бол Delphi шууд өөрчлөлтийг нь гаргадаг.
Caption -ийг өөрчлөх үед form -ийн window caption нь өөрчлөгдөж байгааг
ажигла.
Toolbar дахь Run товчийг товш. Form нь гарахдаа caption нь Hello World!. -
ийг гаргана. Энэ тохиолдолд ажиллаж байгаа программ нь бараг л blank
form шиг харагдана.
Програмыг өөрчлөх
Одоо программаа жаахан өөрчилье. Hello World чинь байгаа бол Close
button дээр товшин хаах хэрэгтэй. Form Designer дахин гарч ирэх ба form-
ийг өөрчлөх боломжтой. Программыг илүү сайжруулахын тулд цонхны төвд
текст нэмэх хэрэгтэй. Үүнийг хийснээр form -доо text label -ийг та нэмж өгнө.
1. Эхлээд Component palette -ийн Standard хэсэгт товш.
2. Label button -ийг товшоод form -ийн хаа нэгтээ товш. Label
component нь form -ийн дотор байна.
3. Object Inspector дээр буцаад оч. Label1 -ийн properties -ууд гарч
ирсэн байгаа. Caption property нь бас идэвхжсэн байгаа.
4. Object Inspector эсвэл Caption property -ийн titlebar дээр товш
тэгээд Hello World! гэж бич. Form -дээрх label нь Hello World!. гэж
гаргана.
5. Үүнийг хийсэн бол label -ийн text -ийн хэмжээг өөрчилж чадна.
Font property дээр 2 товш. Property нэмэлт font attribute -ийг
харуулахын тулд өргөн болно.
6. Font -ийн Size property -ийг 24 болгоод form -дээрээ товш. Label
шинэ хэмжээтэй болно.
Програмаа хаах
Delphi -д жаахан дурласан бол энэ нь бүхнээс илүү таны сонирхлыг татна.
Дараа нь юу хийх вэ гэвэл одоогийн прожектийг хаах хэрэгтэй. File цэсний
Close All -ыг сонго. Project1 -ийн өөрчлөлтийг хадгалах бол No -ийг сонго.
Таны 2 дахь программ: Hello World, II хэсэг
Pascal -ийг судлахаасаа өмнө Delphi хэрхэн ажиллдаг талаар мэдэх
хэрэгтэй. Танд Pascal –ийн олон төрөл дээр ажиллахад энэ нь хэрэг болно.
Энэ хэсэг нь Delphi -ийн үнэн хүчийг хальт агуулна.




Санамж: Компонентийн properties -ийг өөрчилсөн бол design-time өөрчлөлт
хийсэн гэсэн үг. Харин кодоор property -ийг нь өөрчилсөн бол runtime
өөрчлөлт гэж нэрлэгддэг.
Ажиллах үед нь Caption property -ийг өөрчлөхийн тулд:
1. Form дээрх button –ийг 2 товш. Ингэхэд Delphi нь event handler -ийг
button -ийн OnClick event дээр үүсгэнэ. Үүсгэсэн код нь дараах
байдалтай байна
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
2. Засварлагч курсор нь begin ба end гэсэн зарлагааны хооронд
байдаг ба таныг код бичихийг хүлээж байдаг.
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := `Hello World, Part II';
end;

Энэ код маш энгийн юм. Энэ нь Hello World, Part II гэсэн өгүүлбэрийг
Caption property -руу шилжүүлдэг.
3. Одоо toolbar -т байгаа Run товчин дээр дарж программыг ажиллуул.
Программыг ажиллуулахад label -ийн caption нь Label1 гэж хэвээр
байгааг анхаарна уу. Form -ийн button дээр дарж label -ийн гарчгийг
өөрчил. Гайхамшигтай байгаа биз. Зүгээр л Delphi ажиллаж байгаа
юм. Иймэрхүүгээр олон дасгалыг ойрын хэд хоногт хийж form -ийн
бусад компонент labels, button –уудын талаар их туршлагатай болно.
Би үйл явдлын ард нь юу болдгийг бүхэлд нь тайлбарлах гээгүй
харин дараа нь бүх тайлбар хийхийг л хүсэхггүй байна.
Object Pascal хэлийг нягтлан харах нь
Delphi -ийн RAD онцлогийг суралцахаасаа өмнө обьект Паскал хэлний
үндсийг судлах хэрэгтэй. Энэ ном магадгүй хамгийн сайн нь биш юм шиг
танд санагдаж болох юм гэхдээ та юуны өмнө обьект Паскалийг судал.
Обьект Паскалийг дараалаар нь судалбал сайн хэрэг. III бүлгийн
хичээлийн дараа та обьект Паскалийн бүрэн дүр зурагтай болсон байна.
Хоромхон зуурын ухвар ойлголтонд бүү хуурт.
Зарим нь обьект Паскалийг бүрэн ойлгохыг шаарддаг ба энэ нь бодит
туршлага юм. Ойрын хэдэн өдрийн турш та зарим кодын хэсгийг харах ба
энэ нь обьект Паскалийн зарим онцлогийг дүрслэн үзүүлдэг. Та зарим
дасгал хийх ба таны олсон шинэ мэдлэгийг бататгана .Эхний хэдэн өдөр та
зөвхөн Delphi application -ийг жаахан хэсэгт харна.
Юун түрүүнд би Delphi IDE болон Visual Component Library (VCL) -ийг
судалмааргүй байна. Та бүрэн ойлголттой болсныхоо дараа эхлэх хүртлээ
бага багаар ахих хэрэгтэй.

Түүхийн шар хуудас
1994 онд Borland пүүс нь RAD хэрэгсэл дээр ажиллаж эхэлсэн ба энэ код
нь Delphi гэж нэрлэгдсэн байна. RAD -ийг хэрэгжүүлэх хамгийн шилдэг зам
нь компонентийн загвар архитектур байна гэж шийдэгдсэн байсан. Энэ нь
системийн гол цөм байх програмын хэлний асуудлыг шийдсэн байв.
Тэр үед Borland пүүс нь Pascal –ийн зах зээл дэх ганц борлуулагч байв.
Borland нь Pascal -ийн хэрэгсэлийг үйлдвэрлэдэг хамгийн сайн компани
байв. Та Pascal -ийн програмист байсан бол Borland -ийн TurboPascal -ийг
хэрэглэн амтанд нь орох байсан биз. Borland пүүс Pascal хэлийг хуулийн
хүрээнд бүрэн эзэмшдэггүй боловч Pascal -ийн ертөнцөд том байр эзэлдэг
гэдэгт эргэлзээ байдаггүй.
Энэ нь Pascal хэлний онцлогийг нэмэгдүүлэх тал дээр том байр эзэлдэг.
Энд хэлэхэд Pascal -ийн стандарт хороо байдаггүй ба Pascal хэлийг
тодорхойлон бичигдсэн стандарт байдаггүй. Borland пүүс Delphi -ийг Pascal
-ийн үндсэн дээр бичсэн юм. (Borland -ийн нэр нь програмын хэлний нэр
болсон) Delphi хэрэглээнд гарахаас өмнө Borland пүүс Pascal хэлийг
өөрчилсөн. Жишээлбэл : Pascal -ийг обьект Pascal болгон өөрчилсөн байв.
Энэ нь обьект Pascal нь Pascal -ийн хувьд C++ нь C -ээс ямар ялгаатай
байдаг шиг обьект Pascal нь классийг Pascal -д нэмсэн ба үүгээр обьект
хандлагат програмчлалд Pascal орж ирсэн. Delphi хөгжихийн хирээр шинэ
хэлний онцлог ба түлхүүр үг нэмэгдэн орж ирэн компонент загвартай
зохицож эхэлсэн. Түлхүүр үгүүд ба property өөр бусад нэмэгдэн орж ирсэн.
Энэ нь Borland -д компонент загварын бүрэн хүчийг хэрэгжүүлэх боломжийг
олгосон.
Компонентод тохируулан Паскал хэлийг өөрчилснөөрөө Borland нь RAD -
ийг хэрэгжүүлэх боломжтой болсон. Гол нь обьект Паскал хэл нь
өөрчлөгдсөнөөрөө Delphi -ийн боломжуудыг нээж өгсөн. Үр дүнд нь
компонент загвар ажиллаж эхэлсэн. Хэдийгээр Паскалийг өөрчилсөнөөрөө
Borland нь том алхам хийсэн боловч урьдах зүйлтэй холбоотой. Microsoft
компани BASIC хэлийг авч өөрчлөн Visual Basic хэлийг гаргасан байдаг.
Энэ шинэ хэл нь баазад ажилладаг эх Basic хэлнээсээ ялгагдахгүй шахам
байсан. Borland пүүс Паскал өөрчилснөөрөө эрсдэлтэй алхам хийсэн. Бүх
юмны дараа хэрэглэгчид таатай бус хүлээн авсан. Одоог хүртэл Borland нь
Паскалийн зах зээл дээр хатуу байр суурьтай байгаа ба энэ хэвээрээ
байгаа билээ. Үүнд алдаа хийхгүй бол обьект Паскал хүчирхэг хэл ба би
зарлалтыг нь тэгж хөнгөн хийхгүй байхсан.
Обьект Паскал нь сургалтанд бол хамгийн хүчирхэг байгаа билээ. Би
Обьект Паскалийг бүх онцлогийг агуулсан гэж хэлэхгүй. Паскал бол
програмчлалд түгээмэл хэрэглэгддэг.
Санамж: Юу хийхийг тодорхойлохдоо Delphi нь хэд хэдэн нэр томъёог
хуулан авсан. Delphi -ийн үндсэн хэл бол мэдээж обьект Паскал ба зарим
хүмүүс үүнийг Паскал гэж хэлдэг. Зарим Паскал дээр хийж байна хэлдэг.
Эцэст нь юу гэж хэлэхээ та шийд. Обьект Паскал нь обьект хандлагат
програмчлалд бүрэн зохицсон болно.
Шинэ нэр томъёо: Обьект - урьд нь компонентыг тодорхойлж байсан шиг
тусгай програмчлалын хоёр тал юм. (Компонент бол обьект юм, харин бүх
обьект нь компонент биш)
Pascal Unit -ууд
Програмчлал бол код бичихээс илүү ажил юм. Эцсийн эцэст энэ бол
програмын цогц бөгөөд код бичих нь програмчлах зорилгыг нь биелүүлж
байгаа болно. Таны бичсэн код бол зөвхөн текст файл руу ордог.
Компьютер тэр текст файлыг аван машины кодод хөрвүүлэлт хийн
ойлгодог. Delphi -ийн код агуулдаг текст файлыг unit гэдэг.
Шинэ нэр томъёо: unit бол кодын модульд хөрвүүлэгдэх боломжтой текст
файл юм.

Unit -ийн төрлүүд
Delphi GUI application нь багадаа хоёр unit -ийг агуулдаг. Project source unit
нь project source кодыг агуулдаг. Project source код нь DPR өргөтгөл байдаг.
Та project source unit -ийг Project | View Source -ийг үндсэн цэсээс сонгон
үзэж болно. Project source unit -ийг өөрчлөх хэрэгцээ нэг их байдаггүй.
Үнэндээ project source unit -ийг юу хийхээ мэдэхгүйгээр хийх хэрэггүй. Та
хэрэв project source unit -ийг санамсаргүй өөрчилсөн бол application тань
ажиллахгүй болно.
Delphi GUI application -ийн хоёр дахь төрөл нь үндсэн form -ийн unit байдаг.
Form unit гэдэг бол тухайн form -тай хамтардаг source code unit байдаг. Unit
-ийн энэ төрөл нь PAS өргөтгөлтэй файл байдаг. Delphi -д та энэ төрлийг
нь голлон хэрэглэнэ. Delphi GUI application нь голдуу нэг form unit -тэй
байдаг. (Үндсэн form -ийн хувьд) Харин энэ нь нэгээс илүү form unit -тэй
байж болно. Жишээ нь: About box -ийг гаргадаг application нь үндсэн form
unit -тэй байх ба About box -ийн unit байна.
Тэмдэглэл: "Delphi GUI application." нь console mode application -ийн GUI
application -ээс ялгаатай байдаг. Console mode application бол console
window (DOS box) -ийг ажиллуулдаг 32-bit Windows application юм.
Console application -д үндсэн form байдаггүй ба өөр form -уудыг агуулж ч
болно, агуулахгүй ч байж болно. Хэдий ийм боловч console application нь
нэг эсвэл түүнээс илүү unit -тэй байж болно.
Delphi application -д та 3 дахь unit -ийг хэрэглэж болно. Энэ төрлийн unit нь
source кодыг агуулдаг. Зөвхөн unit -ийг агуулдаг код нь project -ийн бусад
unit гэж дуудагддаг.

Delphi Unit –ийн бүтэц
Delphi unit нь урьд тодорхойлогдсон форматыг дагах ёстой. Unit урьд
тодорхойлогдсон форматанд байх ба энэ нь хөрвүүлэгч unit -ийг уншиж
чадах ба unit -ийн кодыг компиляц хийж чадна. Delphi project unit нь unit -
ийн нэртэй програмын түлхүүр үгийг агуулдаг ба кодын хэсэг нь begin ба
end гэсэн түлхүүр үгээр тэмдэглэгддэг. Та үндсэн unit -ийг Delphi -ийн
үндсэн цэсээс View | Project Source -ийг сонгон харж болох ба default Delphi
project -ийн project source unit -нь дараах байдалтай байна.
Тэмдэглэгээ: Доорх мөрийн дугаарууд нь unit -ийн өөрийнх нь хэсэг биш
болно. Үүнийг зөвхөн дарааллыг заахад ашигласан. Заримд нь ийм дугаар
байгаа ба заримд нь байхгүй болно. Аль алинд нь Паскал хэл нь бусад
хэлүүд шиг мөрийн дугаар авдаггүй гэдгийг ойлгох хэрэгтэй. (онцолбол,
BASIC).
Cтандарт DELPHI PROJECT –ийн PROJECT SOURCE
01: program Project1;
02:
03: uses
04: Forms,
05: Unit1 in ‘Unit1.pas’ {Form1};
06:
07: {$R *.RES}
08:
09: begin
10: Application.Initialize;
11: Application.CreateForm(TForm1, Form1);
12: Application.Run;
13: end.

/
1 мөрөнд програмын түлхүүр үг програмын үндсэн source unit -ээр энэ unit
-ийг тодорхойлсон. Үүнийг та unit -ийн нэр Project1 нь програмын түлхүүр
үгээ даган яваагаас харж болно. (Delphi таныг нэр өгөх хүртэл өөрөө
нэрийг нь автоматаар өгдөг)
3 мөрөөс эхлэн түлхүүр үгээр тодорхойлогдсон хэсгийг харж байна. Ямар ч
unit -ийн нэр нь цэгтэй таслалтай түлхүүр үгийг дагадаг ба компиляци энэ
дарааллаар хийгдэнэ.
7 мөрөнд компиляцийн директив нь Delphi нь project -ийн resource file -ийг
агуулдгийг харна. Resource файлууд нь VIII бүлгээр яригдана. “Creating
Applications in Delphi."
9 мөрөнд begin түлхүүр үг ба 13 мөрөнд end түлхүүр үгийг агуулсан.
Сүүлийн түлхүүр үг цэгээр төгссөн байгааг ажигла. (unit нь олон түлхүүр
үгтэй байж болох ба харин ганц төгсгөлийн end –тэй байна.)
10, 11, 12 -р мөрүүдэд код нь application -ийг үүсгэж байгаа ба application -
ийн үндсэн form -ийг үүсгэх ба application -ийн биелэлтийг эхлүүлнэ. Та энэ
кодын нарийн хэсэгт анхаарах хэрэггүй.
Тэмдэглэгээ: begin ба end нь кодыг блоклоно. Кодын блок нь кодын хэдэн
мөрийг агуулж болох ба мөн хэдэн зуун мөрийн кодыг ч агуулж болно.
Номонд ч бас ийм байгааг та харж болно. Та ном хэрэглэдэг бол яаж, хэзээ
хэрэглэхийг мэдэх болно.
Паскал unit -ийн өөр хэсэгт харцгаая. Үндсэн цэсээс File | New -ийг сонгоно.
New Items гарч ирэхэд icon -ийг байрлуулан 2 товшилт хий. Delphi шинэ unit
-ийг нээх ба харуулахдаа Code Editor -д unit код нь үүснэ.

Хоосон UNIT
01: unit Unit2;
02:
03: interface
04:
05: implementation
06:
07: end.
Цөөн байгаа биз? Энэ unit нь 2 зүйлтэй. Эхнийх нь unit нь нэр нь түлхүүр
үгтэйгээ байгаа. Түлхүүр үгтэй программ эхэлж байгаа ба код нь unit
түлхүүр үгтэй ба харин хэдхэн ерөнхий элементтэй байна. Pascal unit нь
unit нэртэйгээ байгаа түлхүүр үгээр эхлэх ба end нь хоёулангийнх нь сүүлд
байдаг. Энд end түлхүүр үг нь бас сүүлдээ цэгтэй байгаа.
Програмын main source unit -ийнх биш unit нь interface ба implementation -
уудыг агуулдаг. Энэ хоёр түлхүүр үг нь The interface Section" and
"Implementation Section," зэрэг хэсгүүдэд нарийн тодорхойлогдсон байгаа
болно. Программын үндсэн unit нь begin and end -ийг хоёуланг нь авч явах
ба харин source unit -нь төгсгөлдөө л end -тэй байна. Дараагийн хэсэг нь
Pascal unit дотор хэрэглэгддэг түлхүүр үгийг тодорхойлно.
Uses жагсаалт
Шинэ нэр томъёо: uses жагсаалт бол гаднах unit -уудын жагсаалт.
3 мөрөнд uses түлхүүр үгийг хэрэглэсэн байгаа. Uses нь бусад unit -уудын
жагсаалтыг агуулсан хэсгийн эхлэлтийг тодорхойлж байгаа бөгөөд энэ unit
нь түлхүүр үгээсээ хамаарна.
Application.CreateForm(TForm1, Form1);
Кодын энэ мөр нь бусад unit -уудад байрлах мэдээллийг агуулах ба энэ
unit -д олдохгүй. Application.CreateForm гэж тодорхойлогдсон процедур нь
Forms.pas гэгдэх Delphi unit -д байх ба TForm1 ба Form1 идентификаторууд
нь прожектийн main form unit-д байрлах ба Unit1.pas гэж хэлэгдэнэ. Та
холболтыг нь харав уу? Uses жагсаалт нь unit -ийг компиляци хийхэд
хэрэгтэй нэмэлт мэдээллийг агуулдаг гэж үзнэ. Энд uses жагсаалтийг
харуулав.
uses
Forms,
Unit1 in ‘Unit1.pas’ {Form1};
Uses жасгаалт нь 2 unit нэртэй байна. Forms ба Unit1. Заримдаа энэ нь
сайн жишээ биш байдаг. Яагаад гэвэл 2 -р unit жагсаалт нь нэмэлт текстийг
агуулсан байдаг. (Unit1 in ‘Unit1.pas' {Form1}).
Энэ текст нь form -ийг онцлоход хэрэглэгдэх ба unit -дээ байдаг бөгөөд
прожектийн main source unit -ээр л хэрэглэгддэг. (Угалзан хаалтанд байх
текст нь кодын бусад хэсэгт байх тайлбар)
Uses жагсаалтыг байгуулахад мэдвэл зохих 2 зарчим байдаг:
• Эхлээд жагсаалт дахь unit бүр дараах unit -ээсээ таслалаар
тусгаарлагдах ёстой.
• Дараа нь сүүлийн unit-ийн жагсаалт нь цэг таслалтай байх. Цэг таслал
нь uses жагсаалтыг төгссөнийг заана.
Ерөнхийдөө жагсаалт нь идэвхтэй unit -ийн нэрсийг агуулах ёстой. Uses
жагсаалт нь uses түлхүүр үг, цэг таслалтай end -ээр тодорхойлогдох ёстой.
Тэрнээс гадна uses жагсаалт нь яаж зохион байгуулагдсанаасаа
хамаарахгүй. Жишээ: Дараах 2 uses жагсаалтууд ижил:
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;
Unit нь uses жагсаалт нь ямар ч тоотой байж болно.
Тэмдэглэгээ: Зарим тохиолдолд Delphi нь танд uses жагсаалтанд unit -ийг
нэмж өгдөг. Энэ нь File | Use Unit цэсээр хийгддэг. Энэ онцлог нь IV бүлгээр
нарийвчлан яригдана.
Интерфейс хэсэг
Өмнөх кодонд интерфейс түлхүүр үг байгааг анзаарсан болов уу.
Интерфейс хэсэг бол идентификатор нь unit -ээсээ авч ирэн зарлагдсан
unit –ийн хэсэг юм. Ихэнх unit -ууд нь өөр unit –уудад хэрэглэгдэх кодыг
агуулсан байдаг. Энэ код нь класс, процедур, функц, хувьсагчаар
хангагдсан байж болно.
Аль ч обьект нь интерфейс хэсгээрээ нэг unit -ээс нөгөө unit -руу зарлагдах
боломжтой. Та интерфейс хэсэг нь жагсаалтыг агуулдаг гэдгийг хэлж
чадна. Интерфейс хэсэг нь интерфейс түлхүүр үгээр эхэлдэг ба
implementation түлхүүр үгээр дуусдаг.
Implementation хэсэг
Шинэ нэр томъёо: implementation хэсэг бол тухайн unit -ийн кодыг
агуулдаг хэсэг юм.
Implementation хэсэг implementation түлхүүр үгээр эхэлдэг ба дараагийн unit
-ийн түлхүүр үгээр дуусдаг. Дараагийн unit -ийн түлхүүр үг нь голдуу unit -
ийн төгсгөл end түлхүүр үг байдаг. Паскалийн тал байгаа учир илүү юм
ярих боломжгүй байна. Хэдий ийм боловч интерфейс ба implementation -
ийн жишээ нь танд ойлголтыг жаахан төрүүлэх болно.
DoSomething гэж нэрлэгдэх процедур нь unit -ийг үүсгэнэ. Та бусад unit -
уудад DoSomething –ийг дуудагдахыг хүсч байна уу? Энэ тохиолдолд
DoSomething процедурыг интерфейс хэсэгт зарлах ба implementation хэсэгт
тодорхойлох хэрэгтэй. Доорх хэлбэртэй байна.
PUBLIC функцтэй unit
unit Unit2;
interface
procedure DoSomething;
implementation
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
DoSomething процедур нь interface section -д зарлагдсан байгааг анзаар.
Тэгээд implementation section -д тодорхойлогдсон байгаа.
Initialization ба finalization хэсэг
Initialization ба finalization хэсэг нь unit -ийн шаардлагатай кодыг цэвэрлэх,
эхлэл хийх, гүйцэтгэх боломжтой. Initialization section -д ямар ч код unit
санах ойд ачаалагдах үед биелэгддэг. Finalization section -д unit санах
ойгоос ачаалагдаагүй байхаас өмнө биелэгддэг. Initialization section -
гүйгээр та finalization section -тай байх боломжгүй. Энэ хоёр нь хоёул
сонголт юм.
Unit –д хэрэглэгддэг түлхүүр үгүүд
Pascal unit бусдыг агуулж болдог ба сонголтын түлхүүр үг нь өөр өөр
зорилгоор нь хэсгүүдийг ангилдаг. Эдгээр түлхүүр үгүүдийн зарим нь олон
хэрэглээтэй. Дараах хэсэг нь unit –д хамаарагдах түлхүүр үгийг л
тодорхойлсон байгаа.
Const түлхүүр үг
Ер нь unit нь нэг түүнээс илүү const хэсгийн сонголттой байх боломжтой.
Const хэсэг бол түлхүүр үгээр тодорхойлогдсон байдаг. Тогтмолоор
зарлагдсан хувьсагчаар const хэсэг нь тодорхойлогдоно.
Constant бол өөрчилж болохгүй идентификатор юм. Жишээ нь таны
програмд олон хэмжигдэхүүн байдаг гэе. Үүндээ та тогтмол хувьсагчийг
ашиглах боломжтой. Const section -ийг доорх програмд нэмье гээд
төсөөлөөд үзье. Та const хэсэгт нэг тогтмолыг нэмэх ба өөр const хэсэг нь 2
тогтмолыг нэмсэн.
unit Unit2;
interface
const
AppCaption = ‘My Cool Program 1.0’;
procedure DoSomething;
implementation
const
BaseX = 20;
BaseY = 200;
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
AppCaption Тогтмол нь interface section -д зарлагдсан учир unit -ийн аль ч
хэсэгт энэ нь хэрэглэгдэж болох ба uses жагсаалтанд байгаа аль ч unit -
ийн хувьд мөн адил байна. BaseX and BaseY хувьсагчууд нь unit дотроо
боломжтой яагаад гэвэл тэд implementation section -д зарлагдсан.
Тогтмол түлхүүр үг нь нэгээс илүү хэрэглээтэй байж болно.
Type түлхүүр үг
Шинэ нэр томъёо: Type түлхүүр үг нь таны програм хэрэглэх шинэ
төрлийг зарлахад хэрэглэгддэг. Шинэ төрлийг зарлах нь esoteric
програмчлалын технологи бөгөөд энд тайлбарлах нь хэцүү болно. Доор 20
байтын массив таны application -д хэрэгтэй байгаа ба энэ төрөл нь дахин
дахин хэрэглэгдэнэ. Та доорх шиг зарлаж болно.
Type
TMyArray = array [0..19] of Byte;
Та одоо array [0..19] гэж бичихийн оронд TMyArray гэсэн төрлийг ашиглах
боломжтой.
“Var “Түлхүүр үг
Шинэ нэр томъёо: Энэ түлхүүр үг нь хувьсагчууд байдаг кодын хэсгийн
зарлалтын үед хэрэглэгддэг.
Энэ түлхүүр үгийг та элдэв хувьсагчуудыг зарлахад хэрэглэж болно. Var -
ийг зарлах хэдэн байрлал байдаг. Unit -ийн түвшинд var -ийг та зарлаж
болно. Мөн процедур, функцийн түвшинд var -ийн хэсэг байж болно.
unit Unit2;
http://www.csms.edu.mn/cheri/
interface
type
TMyArray = array [0..19] of Byte;
const
AppCaption = ‘My Cool Program 1.0’;
var
X : Integer;
MyArray : TMyArray;
procedure DoSomething;
implementation
const
BaseX = 20;
BaseY = 200;
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
Const түлхүүр үг шиг, var -т бас олон хэрэглээ байдаг. Энэ нь бас функц,
процедурын параметр, хувьсагч параметруудыг зарлахад хэрэглэгддэг.
Тэмдэглэгээ: var -аар тодорхойлогдсон хэсэг нь түлхүүр үгээр эхэлж,
дараагийн unit -ийн түлхүүр үгээр дуусна.
Кодын тайлбар
Паскал хэл рүү нарийвлан орохын өмнө кодын тайлбарын тухай товч
танилцуулъя. Тайлбар нь таны source кодод текст хэлбэрийн тайлбар өгөх
зорилготой байна. Тайлбар нь код юу хийхийг тодорхойлоход хэрэглэгдэх
ба зохиогчийн эрхийн мэдээллийг хангах, өөртөө эсвэл бусдад тэмдэглэл
хийхэд л ашиглагддаг.
Тайлбар нь ялгаатай 3 аргаар тодорхойлогддог. Дараах зүйлүүд нь бүгд
шугмын хувьд хүчинтэй байна.
{ Don't forget to free this memory! }
{
ADTAPI.PAS 2.50
Copyright (c) TurboPower Software 1996-98
}
(* Оюутнуудаа энэ кодыг засах хэрэгтэй *)
// Энэ үнэн зэрлэг код
{ Энэ код дээр дараа тухтай ажиллана }
Магадгүй Delphi –д ихэнх тайлбарын төрөл нь угалзан хаалтыг хэрэглэдэг.
“{“ нь эхлэх үед тайлбарыг, ”}” –нь тайлбарын төгсгөлд хэрэглэгдэнэ.
Тайлбарын өөр нэг нь (*тайлбар эхлэх,ба *) байдаг. Энд бас нэг тайлбарын
тэмдэг байдаг: (*/*) тайлбарын тэмдэглэгээ нь том хэмжээний тайлбарыг
хийхэд болно. Эдгээр тайлбарын төрлүүд нь нэг эсвэл олон мөрт
тайлбарыг хийхэд ашиглагдана.
Тэмдэглэгээ: Угалзан хаалт нь Паскалд өөр хэрэглээтэй байдаг. $ -ийг
хэрэглэх үед хаалт нь компиляторын директорыг заадаг. Компиляторт
compiler hints үүсгэхгүй гэж зааж өгөн source коддоо {$HINTS OFF} гэж
бичих хэрэгтэй. Компилятор энэ мөрийг хараад unit -д дохио өгөхөө
{$HINTS ON} –тэй тулаад зогсооно.
Тайлбарын 3 дахь хэлбэр нь давхар зураас байдаг. Энэ нь голдуу С -
хэлбэрийн тайлбар гэгддэг яагаад гэвэл С ба С++ үүнийн хэрэглэдэг. Энэ
хэлбэр нь нэг мөрөнд хэрэглэгддэг. Delphi -д энэ хэлбэр ажилладаггүй
гэдгийг хэлье.
Тэмдэглэгээ: Энд угалзан хаалт хэрэглэсэн байгаа. ”//” -ийг богино
тайлбарт болон тестийн зорилгоор ашигласан .
Аль ч тайлбарлагдсан текст нь компиляторт хамааралгүй байдаг. Хэрэв та
default Delphi IDE settings -ийг ашиглаж байгаа бол бүх тайлбар мөр нь
бичмэл хөх текст байгаа. Энэ нь тайлбарыг хурдан ялгахад дөхөм байдаг.
Тэмдэглэгээ: Хэрэв та багийн бүрэлдэхүүнтэй програмчлалын ажил
хийдэг бол та хамтран ажиллагчдынхаа код, бичлэгийг уншдаг байх.
Кодонд товч тайлбар хийх нь аль ч програмистад цагийг нь хэмнэнэ. Та
ганцаараа ажилладаг гэсэн ч тайлбар бичих нь чухал. Та бичсэн кодоо
ямар амархан мартаж байгаагаа хараад л гайхна. Сайн кодын тайлбар нь
таны хамтрагчийн цагийг хэмнээд зогсохгүй таныг ч бас аварна. Кодын
тайлбар бичихээ бүү март!
Хувьсагчид
Хувьсагчид нь хэрэглэгдэхээсээ өмнө зарлагдсан байдаг. Та хувьсагчдыг
кодын тусгай хэсэгт зарлах ба var түлхүүр үгээр тодорхойлох хэрэгтэй.
Жишээ нь:
var
X : Integer; { X хувьсагч нь integer төрөлтэй }
Y : Integer; { Байршлын y утга }
Өмнө нь “var” түлхүүр үгийн тухай Паскалийн unit -ийн нэр томъёонд
дурдсан билээ. Тэр хэсэгт unit -д хувьсагчуудыг хэрэглэдэг ба unit -ийн var
хэсэгт зарладаг гэж үзсэн билээ. Тэр нь үнэн ч та бас функц,
процедуруудыг энэ хэсэгт зарлаж болно. Функц, процедурт хувьсагчуудыг
зарлах боломжийг энэ нь танд олгож байгаа болно. Доорх жишээ нь
процедурт var хэсэг байна.
procedure TForm1.Test;
var
S : string;
begin
S := ‘Hello World!’;
Label1.Caption := S;
end;
Та хувьсагчаа зарласны дараа үүнийгээ санах ойд өгөгдлийг зохицуулахад
хэрэглэж болно. Энэ мэдээж танд нэг их сэтгэгдэл төрүүлэхгүй байх гэхдээ
хэдэн жишээг танд танилцуулъя. Дараах кодын хэсэг нь X, Y гэж
зарлагдсан хувьсагчуудыг хэрэглэсэн. Мөр болгоны эцэст байгаа тайлбар
нь юу биелж байгааг тайлбарлана.
X := 100; { ‘X’ нь одоогийн утга нь: 100 }
X := X + 50; { ‘X’ нь одоогийн утга нь: 150 }
Y := 150; { ‘Y’ нь одоогийн утга нь: 150 }
X := X + Y; { ‘X’ нь одоогийн утга нь: 300 }
Inc(X); { Нэмэгдүүлж байна. ‘X’ нь одоогийн утга нь: 301 }
Хувьсагч бол компьютерийн санах ойд байрласан хэсэг утга юм. Эрхэм
уншигч та энэ кодны тухай зарим зүйлсийг тэмдэглэж аваарай. Юуны
түрүүнд Х хувьсагчийн өөрчлөлт (Бид дараа Object Pascal хэлний
хувьсагчийг удирдах оператор, функц, процедурын тухай үзэх болно.)
Дараах хувьсагчууд нь нэмэлт, сонгогдсон утга юм.
Програмын кодын мөр бүрийн төгсгөлд цэг таслал (;) тавидаг.
САНАМЖ: Паскаль хэлийг эхлэн суралцагчид програмын кодуудын
хоорондын ялгааг мэддэг байх хэрэгтэй. (зарлагдсан өгөгдөл, утга,
хувьсагч, илэрхийлэл г.м)
c := a + b;
Дээрх жишээнд с хувьсагчид a болон b хувьсагчдийн нийлбэрийн утгыг
олгож байгаа үйлдэл болно. Энд a + b нь илэрхийлэл юм. Нэг мөрөнд
олон илэрхийлэл бичигдэж болох бөгөөд төгсгөлд нь цэг таслал
тавигдана. Зарим тохиолдолд цэг таслал тавигдахгүй байж болдог. Үүнийг
бид дараа нь үзнэ.
Хувьсагчийн нэрийн ард хувьсагчийг тодорхойлсон төрөл бичигдэнэ. Функц
болон процедурт хувьсагч, хувьсагчийг тодорхойлсон төрлийг зарлаж
өгдөг. Мөн хувьсагчийн нэрэнд том жижиг үсэг болон доод зураас, тоог
хольж хэрэглэж болно. Ихэнхдээ том үсгээр эхэлдэг ба харин доод
зураасаар эхлэхийг зөвшөөрдөггүй. Хэдийгээр хувьсагчийн нэр нь 255
хүртлэх тэмдэгтээс тогтож болох боловч яг үнэндээ 20 тэмдэгт ч гэсэн
ашиглахад хэцүү байдаг.
МашУртХувьсагчийнНэр : Integer; { урт хувьсагчийн нэр }
Миний_хувьсагч : Integer; { доогуур зураас ашигласан }
x : Integer; { нэг тэмдэгт ашигласан }
X : Integer; { нэг тэмдэгт ашигласан}
Тэмдэглэгээ2 : string; { үсэг болон тоо ашигласан }
САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч
чаддаггүй. Жишээ нь:
var
XPos : Integer;
{ ...later }
XPos := 20;
XPOS := 200;
xpos := 110;
XpoS := 40;
Паскаль хэл нь С ба С++ хэлтэй харьцуулахад ойлгомж
муутай байж болох юм. Гэхдээ та удахгүй үүний ялгааг олж,
ашиглаж сурах болно.
САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй
боловч та програмдаа тэмдэгт мөртэй ажиллахдаа том үсэг
ашиглаж сурах хэрэгтэй.
Обьект Паскал хэлний Өгөгдлийн төрөл
Шинээр: Объект Паскалийн өгөгдлийн төрөл нь санах ойд мэдээллийг
хадгалдаг хөрвүүлэгч /compiler/ аргыг тодорхойлсон.
Зарим програмчилалын хэлэнд хувьсагч олон төрлийн утгатай байж
болдог. Жишээ нь доорх BASIC код юм.
X = -1;
X = 1000;
X = 3.14;
BASIC хэлэнд тооны төрөл хэмжээг тааруулахын тулд санах ойн
зохицуулалтад анхаарах хэрэгтэй.
Хувьсагчийг зарлах
Паскал хэлэнд хувьсагчийг програмд ашиглахаасаа өмнө төрлийг нь
зарлаж өгөх ёстой.
var
X1 : Integer;
X : Integer;
Y : Double;
Z : Byte;
{ ...ө.х }
X1 := -1;
X := 1000;
Y := 3.14;
Z := 27;
Өгөгдлийн төрлөө зөв сонгосноор програмын үр дүн зөв гарна гэсэн үг.
Тиймээс програмаа ажиллуулахаас өмнө өгөгдлийн төрлөө сайн нягтлаж
шалгах хэрэгтэй.
Зарим өгөгдлийг signed, unsigned –аар өргөтгөж болдог. Өгөгдлийн signed
төрөл нь эерэг ба сөрөг утгыг авдаг бол unsigned төрөл нь зөвхөн эерэг
утгыг авдаг. Хүснэгт 1.1 д Паскалийн үндсэн өгөгдлийн төрлүүдийн санах
ойд эзлэх хэмжээ болон авч болох утгын хязгаарыг үзүүлэв. Хүснэгтэд
"String" буюу тэмдэгт мөрийг оруулаагүй. Харин "Strings" гэсэн дараагийн
бүлэгт авч үзнэ.
ХҮСНЭГТ 1.1. ОБЪЕКТ ПАСКАЛД АШИГЛАДАГ ӨГӨГДЛИЙН ТӨРЛҮҮД (32-BIT).
Дээрх хүснэгтэд үзүүлснээр 32 битийн орчинд Integer, LongInt төрлүүд нь
санах ойд ижил 4 байт эзлэж байна. Энэ нь Delphi 4.0 -ийн орчинд нийцэж
байна. Харин 16 битийн орчинд Integer нь 2 байт эзлэж байхад Longint нь 4
байт эзлэдэг.
Ихэнх програмистууд LongInt –ээс илүү Integer –г өргөн хэрэглэдэг.
Мөн Int64, Comp (computational) төрөлүүд нь авч болох утгын хэмжээ ижил
байна. Харин ялгаатай тал нь өөрсдийн дотоод хөрвүүлэлт хийдэг арга юм.
Int64 нь integer төрөл, харин Comp нь real төрөл юм.
Real ба Double төрлүүд нь ижил юм. Delphi програмын өмнөх хувилбарт
Real төрөл нь 6 байт байсан бол одоо 8 байт болсон. Энэ өөрчлөлт нь Real
төрлийг өнөөгийн хэв маягт ашиглах нөхцлийг бүрдүүлж өгсөн хэдий ч
Delphi програмд ашиглагдахдаа Double төрлөөс багаар ашиглагддаг буюу
хуучирсанд тооцогддог.
САНАМЖ: Windows нь 2,147,483,647 (integer –н maximum утга)
– аас илүү утга буцааж чадах GetDiskFreeSpaceEx функцыг
агуулдаг.
САНАМЖ: Single, Double, Extended, Currency өгөгдлийн
төрлүүд нь float төрөлд хамаарагдана.(10 -тийн тооллын
систем). Харин бусад төрөлтэй integer –ээр холбогддог. integer
нь бутархай тоон утгыг илэрхийлдэггүй. Жишээ нь дараахь
кодод буруу зарласан байна.
var
X : Integer;
{ Дараа нь... }
X := 3.75;
Энэ үед алдааг тань Паскал хэл тэр дор нь танд хэлж өгнө.
Харин та үүнийг мэдсэнээр float төрөл нь Windows орчинд
ямар их ашиглагдахыг анзаарах болно.
Өгөгдлийн төрлүүдийн хоорондох хөрвүүлэлт
Объект Паскаль нь өгөгдлийн төрлүүдийн хооронд хөрвүүлэлт хийж
чаддаг. Жишээ нь:
var
Res : SmallInt;
Num1 : Integer;
Num2 : Integer;
{ Дараа нь... }
Num1 := 200;
Num2 := 200;
Res := Num1 * Num2;
SmallInt дэх Integer төрөлтэй хоёр өгөгдлийг хооронд нь үржүүлж үр дүнг нь
гаргаж байна. Энэ томъёо нь хоёр өгөгдлийн төрлийг холисон хэдий ч
Обьъект Паскаль хөрвүүлэлт хийж чадаж байна. Хариу буюу үр дүн нь -
25,536 гарна. Хүснэгт 1.1 -д үзүүлснээр SmallInt нь хамгийн ихдээ 32,767
утга авдаг. Тэгвэл энэ 32,767 дээр нэгийг нэмбэл хариу нь -32,768 болно.
Та үүнийг туршихын тулд доорхи зааврын дагуу ажилларай.
1. Шинэ проект нээж form -д label ба button -г байрлуул.
2. button дээр Double-click хийж OnClick event -ийг сонго.
3. Дараахь байдлаар бичнэ.
procedure TForm1.Button1Click(Sender: TObject);
var
X : SmallInt;
begin
X := 32767;
X := X + 1;
Label1.Caption := IntToStr(X);
end;
4. Run хийж button товчоо дар.
Label -ийн caption дээр -32768 болж өөрчлөгдснийг та харах болно.
/IntToStr функц нь integer -ийн утгыг string болгон хөрвүүлнэ./ Дээрх дасгал
32767 нэмэх 1 тэнцүү 32768.
Дээрх жишээ нь overflow ба wrapping гэж юу болохыг харуулж байгаа юм.
Хувсагчдын утгын хувьд overflow буюу орон халилт үүсэхээргүй /ө.х
maximum -аас бага/ байх ёстой. Integer төрөл нь ойролцоогоор –2 -оос +2
тэрбумын алслалттай байдаг.
Зарим тохиолдолд Object Pascal нь хөрвүүлэлт хийж чаддаггүй. Сompiler
error нь Integer Real хоёр хоорондоо хамааралгүй төрлүүд гэж мэдээлнэ.
Сompiler error нь тодорхой төрлүүдэд хадгалагддаггүй утгуудыг зааж өгнө.
Жишээ болгон доорх кодыг авч үзье.
var
X : Byte;
begin
X := 1000;
end;
Тогтмолыг зарлах Сompiler error –г харуулж байна. Танд Х хувьсагчийн
утгыг 1000 гэж сонгож болохгүйг Сompiler нь мэдээллэх бөгөөд учир нь Х
хувьсагч нь Byte хэмжээтэй ба Byte нь 0 - 255 хүртэл хэмжээтэй байдаг.
Зөвлөгөө: Сompilе хийхдээ санамж анхааруулга алдааны
мэдээлэл зэргийг сайтар дагах хэрэгтэй. Тэдгээр нь
програмын кодын алдаа хэрэгцээтэй зарим мэдээллүүдийг
хэлж өгдөг.
Обьект Паскалийн Оператор
Хүснэгт 1.2 Түгээмэл ашиглагддаг операторууд.
Delphi
Операторуудын хувьд байнга хэрэглэгдэж байдаг хэсэг нь байхад бас
хааях ашиглагддаг операторууд ч байдаг.
Аnd, or, not зэрэг түлхүүр үгс нь логикийн болон битийн гэсэн төрөлтэй
байдаг. Жишээ нь
if (Started = True) and (X > 20) then
Z := X and Y;
Дээрх жишээнд and үйлдэл нь хоёр янзаар хэрэглэгдэнэ.
Тогтмол
Өмнө хэлсэнчлэн тогтмол нь утгын хувьд өөрчлөгдлөггүй. Хувьсагчийн
утгыг програм бичигч өөрчилж чаддаг бол тогтмолын утгыг чаддаггүй.
Тогтмолыг зарлахдаа const түлхүүр үгийг ашигладаг.
const
DefaultWidth = 400;
DefaultHeight = 200;
Description = ‘Something really cool.’;
Тогтмолыг зарлахдаа (:=) тэмдэг бус = тэмдэгийг ашигладаг. Мөн ямар ч
өгөгдлийн төрлийг онцолж заадаггүй.
Массив
Массив буюу array нь бүлэг утгын цогц гэж хэлж тодорхойлж болно.
Өөрөөр хэлбэл нэг төрөлтэй хэсэг элемент юм. Зарлах үед түүнийг санах
ойн тодорхой зайд байрлуулдаггүй ба зөвхөн заагчийн эхлэх утга
тогтоогддог. Массивыг дараах хэлбэрээр зарладаг.
var
MyArray : array[0..4] of Integer;
Integer нь 4 байтын санах ойтой учраас дээрх массивын хувьд 5 индекстэй
тул санах ойд 20 байт эзлэж байна.
MyArray массив 5 гишүүн буюу индекстэй. Индексээ дугаарлаж
тэмдэглэхдээ [ ] хаалтад бичиж өгнө. Массивийн гишүүн тус бүрд доорх
жишээнд анхны утга олгов.
MyArray[0] := -200;
MyArray[1] := -100;
MyArray[2] := 0;
MyArray[3] := 100;
MyArray[4] := 200;
Дараагийн жишээнд 3 ба 4 –р индексуудын утгуудыг хооронд нь нэмж Х
хувьсагчид олгож байна.
X := MyArray[3] + MyArray[4]; { үр дүн 300 }
Олон хэмжээст массив
Массив нь олон хэмжээст байж болно. Өөрөөр хэлбэл санах ойд мөр
мөрөөрөө дараалж ажилладаг. Хоёр хэмжээст integer төрөлтэй массив
үүсгэхийн тулд кодыг дараахь хэлбэрээр бичнэ.
var
MdArray : array[0..2, 0..4] of Integer;
Энэ массив санах ойг 60 байтаар ачаалж байна. Массивын утга нь урд нь
санах ойд байрлаж байсан санамсаргүй өгөгдөл юм. Мөн индекс нь тэгээс
эхэлдэг. Массивийн элементүүдийг энгийн масив хэлбэрээр ашиглаж
болох ба [ ] хаалтын тусламжтай дараахь хоёр байдлаар ашиглаж болно.
Үр дүн нь ижил гарна.
X := MdArray[1][1] + MdArray[2][1];
X := MdArray[1, 1] + MdArray[2, 1];
САНАМЖ: Массивийн элементийн тооны хязгаарт байхгүй
индекс гарч ирвэл алдаа заана. Доорхи жишээнд үзүүлэв.
var
MyArray : array[0..4] of Integer;
X : Integer;
begin
X := MyArray[3] + MyArray[5]; { 5 дугаартай индекс байхгүй. }
end;
Тэгэхээр массивийн элементийн хязгаарыг анх зарлаж өгөх хэрэгтэй.
Жишээ нь 10*20 хэмжээтэй массив үүсгэе.
var
MyArray : array[10..20] of Integer;
10 баганатай 20 мөртэй хүснэгт мэтээр төсөөлье.
const
myArray : array[0..4] of Integer = ( -200, -100, 0, 100, 200 );
Их ба бага функц
Эдгээр функцуудыг массивт олон дахин ашиглаж болно. Хувьсагчийн утгын
дээд доод хязгаарыг массивт энгийн байдлаар зарлаж өгдөг. Бага /Low/
функц нь доод хязгаараас буцах үйлдэл /return/ хийдэг. Харин Их /High/
функц нь мөн адил массивын дээд хязгаараас буцдаг.
var
X, I, Lower, Upper : Integer;
MyArray : array[10..20] of Integer;
begin
{ MyArray массивын эхний хэсэг }
Lower := Low(MyArray); { Lower нь 10 }
Upper := High(MyArray); { Upper now contains 20 }
X := 0;
for I := Lower to Upper do
X := X + MyArray[I];
{ Х хувьсагч дээр ямар нэг зүйл хийнэ. }
end;
Массивийн хязгаарын гаднах утга нь ойртоход их ба бага функц тодорхой
биш хэрэглэгддэг.
Динамик Массив
Delphi 4 -т массивийг динамикаар оруулдаг. A динамикийн массивийн
эхний хэмжээг гаднаас зарласан ба массивийг зарлах цагт хэмжээг нь
тавьж агуулдаггүй. Дараа нь SetLength -ийн хэмжээг заан хэрэглэдэг.
Жишээ нь:
var
BigArray : array of Integer; { хэмжээ олгоогүй байна }
X : Integer;
begin
X := GetArraySize; { хэрэгтэй хэмжээг тодорхойлогч функц }
SetLength(BigArray, X); { динамикаар хэмжээ тогтоож байна }
{ одоо BigArray –г хэргэлнэ}
end;
Шинээр : A динамик массив нь массиваа санах ойд ачаалдаг. A динамик
массив нь програмд их бага хэмжээгээр хэрэглэгддэг.
Массивийн индекс бүрд элемент харгалзуулан байрлуулах нь ач
холбогдолтой. Санах ойд 10 integer хангалттай байлгах хэрэгтэй гэвч
бусад нь магадгүй 1000 integer хангалттай хэрэглэдэг.
Массиваа Copy функцээр байрлуулан хэрэглэж чадна.
Жишээ нь массив нь 100 ба 200 хэмжээтэй элемент хэрэглэдэг :
Copy(BigArray, 200);
Массивдаа утгыг нь хадгалсан ба массивийн хэмжээ нь 100 -с 200 элемент
болон өссөн.
Олон хэмжээст dynamic массивыг үүсгэх нь нэг хэмжээст массивыг
үүсгэхтэй бараг адилхан байдаг. Доор 2 хэмжээст массивыг үүсгэв. Код нь:
var
BigArray : array of array of Integer;
begin
SetLength(BigArray, 20, 20);
BigArray[0][0] := 200;
end;
Strings
Програмд String -тэй ажиллахад хэцүү. Object Pascal нь 3 string төрөлтөй:
long string, short string, ба wide string.
Нэмэлт string төрөлтөй, энэ нь төгсгөлгүй string-briefly ба stringmanipulation
функцтэй.
Short String
Богино string төрлийн урт нь тогтмол, тэмдэгтүүдийн хамгийн их хэмжээ нь
255 тэмдэгт байдаг. Богино string нь 1 -ээс 2 замтай ба 1 зам нь 255 byte
хэмжээтэй ShortString -д зарлагддаг.
var
S1 : ShortString; { 255 тэмдэгт }
S2 : string[20]; { 20 тэмдэгт }
String manipulation нь short төрөлтөй учир нь санах ой дахь string -ийн
хэмжээг өөрчлөхгүй. Богино string хуучин төрлийг нь бодох ба урт string
оруулна. Богино strings нь урт byte -тай учир нь string -ийн анхны элемент
нь уртаа агуулдаг. (тоо болон тэмдэгт). Short string -ийн анхны элементийн
утга нь string -ийнхээ уртыг тодорхойлдог. Жишээ нь :
var
S : ShortString; { 255 тэмдэгт }
Len : Integer;
begin
S := ‘Hello’;
Len := Ord(S[0]);
end;
Дээрх жишээнд string -ийн уртыг S[0] утга тодорхойлж байна. Мөн функцын
уртыг тодорхойлж чадна. Функцын урт нь bit байна.
Санамж : Ord функцын утгыг Char төрөл, integer утгаар
хувиргаж хэрэглэнэ. (дараалсан утга) Мөн Ord функц нь
жагсаалттай хамт хэрэглэгддэг.
Хэрэв та short string -ийн эхний элементийг хэрэглэх бол түүний урт нь
string байна. Тэгэхлээр програмын орчинд түүнийг хэрэглэх шаардлага
гарч ирж байна. Эхлэн суралцагч таны хувьд програм техникийн дэвшилтэт
технологид 0 байтын short string -ийг нэмж судлахыг санал болгож байна.
Long String
long string төрөл нь string объектэд динамик байдлаар байрладаг.
Хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог.
Объект Паскал нь санах ойд string -ийг байршуулж бас устгаж хэрэглэдэг.
Long strings нь харин маш их уян хатан чанартай бөгөөд заримдаа short
string шиг удаан болхи мэт нарийн төвөгтэй тэмдэгтүүдээ ачаалдаг.
Хэрэв үр дүн тань шүүмжлэлтэй санагдвал long string-ийг ашиглаарай.
Динамикаар санах ойд байрлуулснаар long string нь тэмдэгт мөрийн
гарчгийг өөрчлөх боломжтой болсон Доорх жишээнд string нь түлхүүр үг,
параметрийн хэмжээгүй зарлагдсан байна.
var
S : string; { динамикаар байрласан long string }
Учир нь string нь динамикаар байрласанд оршино. Харин танд одоо
үйлдлийн хэсэгт өөрчлөлт хийж чадах боломж үлдсэн шүү. Ер нь long string
нь хэрэглэхэд маш энгийн ба өөрөөр хэлбэл тэмдэгт мөрөө санах ойгоос
ачаалах үед зай завсар гэх мэтийн санаа зовоосон асуудал гарахгүй. Учир
нь энэ бүгд илүүчгүй дутуучгүй бүгд автомат юм.
Long string нь 0 элементийг зөвшөөрдөггүй бөгөөд хэрэв түүнд хандвал үр
дүн тань compiler error буюу алдаатай гарна гэсэн үг. SetLength функцийг
ашиглавал зохистой.
Wide String
Unicode төлөв байдалтай double-byte хэрэглэдэг. Windows API функцэд
хэрэглэгддэг. long string -ийн адилаар авах утгын хэмжээний хязгаар нь
зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. string объектэд
динамик байдлаар байрладаг. Үүнээс илүү деталчилсан мэдээллийг та
олж авч чадахгүй болов уу. Учир нь OLE function -той дуудуулах хязгаартай
байдаг.
Null /хоосон/ - Төгсгөгч Strings: PChar ба Char -ын Массив
Объект Паскал нь С ба C++ хэлнүүдээс string өгөгдлийн төрлөөрөө
ялгаатай. C ба C++ -д string нь 0 нь төгсгөлийг заадаг. Мөн массивын урт
нь байтаар биш байдаг. PChar төрлийг дүүргэж хэрэглэх хэрэгтэй ба
массивын бүх төрлийг ашиглаж болдог. Жишээ нь Windows MessageBox
функц юм. Энэ функц нь Windows -ийн стандарт message мэдээллүүдийг
дэлгэц дээр гаргадаг.
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT):
Integer;
Хоёр дахь ба гурав дахь параметрүүд нь массивын элементийг заагчаар
харуулж байна.(message box текст, message box caption). Эдгээр
функцуудыг та Delphi програмаас дуудан ажиллуулж болно. PChar type -
ийн жишээ код:
var
Text : string;
Caption : string;
begin
Text := ‘Шалгаж байна.’;
Caption := ‘Текст мэдээлэл’;
MessageBox(0, PChar(Text), PChar(Caption), 0);
end;
Дээрх жишээнд Pchar -ыг Pascal -ын long string, null-terminated string
ашиглан үзүүллээ. Харин та өөрөө Pchar -ыг үргэлжүүлж судлаарай.
var
Text : PChar;
begin
Text := ‘Шалгаж байна.’;
MessageBox(0, Text, ‘Message’, 0);
end;
Pascal -ын string нь хүчирхэг төдийгүй хялбарханаар хэрэглэгдэж байна.
Та үүнээс олон удаа хэрэглэх боломж байхгүй. Pchar -ыг long string, nullterminated
string руу хөрвүүлж болдгийг дээрх жишээ харууллаа. Төгсгөлд
нь та массивт Char төрлийн өгөгдлийг Pchar ашиглан байршуулж үйлдэл
хийж сурлаа.
var
Text : array [0..20] of Char;
begin
Text := ‘Шалгаж байна.’;
MessageBox(0, Text, ‘Message’, 0);
end;
Windows API функцийг дуудахдаа null-terminated string -ийг параметраар
ашиглавал илүү тохиромжтой.

Үндсэн Тэмдэгт мөр /String Basics/
Pascal нь нилээн хэдэн string төрлийн элементүүдтэй.
+ Operator
var
S1 : string;
S2 : string;
begin
S1 := ‘SW210 Kim’;
S2 := ‘Reisdorph’;
Label1.Caption := S1 + ‘ ‘ + S2;
end;
Дээрх кодод S1, S2 хувьсагчдийн үр дүнг label -ын Caption property –ээр
дамжуулан харууллаа. Одоо арай өөр жишээ үзье:
var
X : Integer;
begin
X := 199;
Label1.Caption := ‘The result is: ‘ + IntToStr(X);
end;
Энд IntToStr функц ашиглан 199 гэсэн тоог тэмдэгт мөр болгон
хувиргалаа.
Subscript Oператор
Тэмдэгт мөрөөс subscript ([ ]) –г ашиглан элемент бүрийг нь салган авч
болдог.
var
S1 : string;
S2 : Char;
begin
S1 := ‘Hello World!’;
S2 := S1[1];
Label1.Caption := S2;
end;
Дээрх жишээнд S2 хувьсагч нь Char төрлийн байна. Үр дүнд Н гэж
Label1.Caption дээр гарна. S[0] -ийг эхний элемент гэж long string, wide
string -үүд үздэггүй.
String -ийн контрол буюу тохируулга
Object Pascal нь String -ийн контрол буюу тохируулгыг шинээр нэвтрүүлж
өгсөн. Ихэвчлэн хэвлэдэггүй тэмдэгт мөрд ашигладаг.
Та control character хийхдээ # тэмдэг ашиглах ёстой. Доорх жишээнд (ASCII
27) гэж тэмдэглэжээ.
S := ‘This is a test. Escape follows.’#27’ Finished.’;
S1 := ‘This is a test. Escape follows.’;
S2 := ‘Finished.’;
S3 := S1 + #27 + S2;
Эндээс та хялбархан онол гаргаж болно. Form дээрээ button, label үүсгэ.
button дээрээ Double-click /хулганаа товших/ хийж event -ийг нь OnClick
болго:
Label1.Caption := ‘Line 1’ + #10 + ‘Line 2’;
Run хийж button товч дээрээ дар. Label 2 шугамаар мэдээллээ гаргадаг
гэдгийг та одоо мэдэж авлаа. Дээрх кодын хувьд (ASCII 10) -ыг 2 шугамаар
үзүүлхэд ашиглаж байна.
Том хэмжээний текстэн мэдээлэлийг нэг шугамаар авч болно.
(ойролцоогоор 200 орчим тэмдэгт орсон үед) Delphi Code Editor нь хамгийн
ихдээ буюу 1,024 тэмдэгтээс тогтож болдог. Ийм хэмжээний мэдээллийн
унших бүрэн бололцоотой гэж үздэг. Тэмдэгт мөрийн олон шугаман
хэлбэрийг + operator -той жишээг доор үзүүлэв.
MessageBox(0, ‘Энд маш урт message ‘ +
‘that seems to go on and on forever. In order ‘ +
‘to make the code more readable the message has ‘ +
‘been split across several lines of code.’, ‘Message’, 0);
Тэмдэгт мөрийн харьцуулах үйлдэл
String нь харьцуулах операторын тусламжтай харьцуулалт хийж чаддаг.
Хүснэгт 1.3 их ашиглагддаг операторуудыг жагсаан бичив.
ХҮСНЭГТ 1.3. ТЭМДЭГТ МӨРИЙН ХАРЬЦУУЛАХ ОПЕРАТОР.




                                        Эдгээр операторууд нь ASCII кодоор
харьцдаг. Мөн үйлдэлд биелэгдэх
дарааллаараа ялгагдана. Тэнцүү үйлдлийн буруу ашигласан жишээ:
if FileName = ‘TEST.TXT’ then
OpenFile(FileName)
else
ReportError;
String-Manipulation ФУНКЦ
Ихэвчлэн ашиглагддаг функцуудын тайлбарыг доорх 1.4 хүснэгтэд үзүүлэв.



ХҮСНЭГТ 1.4. ТЭМДЭГТ МӨРИЙН ФУНКЦ БА ПРОЦЕДУРУУД
САНАМЖ: Нэмэлт функцуудын талаар мэдээллийг Delphi
програмын help руу орж additional дотроос олж аварай.

Одоо жишээн дээр StrToInt function туршиж үзье.
Value := StrToInt(Edit1.Text);
Өөр StrToXXX функц (StrToFloat, StrToDate гэх мэт) дээрх замын дагуу
ажиллана.
Format function нь тэмдэгт мөр ба нэмэлт аргументэд хэвшүүлэлт хийдэг.
Доорх жишээн дээр үр дүнг нь үзье.
var
S : string;
X : Integer;
begin
X := 10 * 20;
S := Format(‘Үр дүн: %d’, [X]);
Label1.Caption := S;
end;
Үр дүн: 200
Энэ жишээнд %d тэмдэгт нь integer утгыг илэрхийлж байна. Мөн бусад
тэмдэгтэй хувьсагчаар дамжуулан ажиллана. Жишээ нь:
var
X : Integer;
Y : Integer;
begin
X := 20;
Y := 5;
Label1.Caption := Format(‘%d + %d = %d’, [X, Y, X + Y]);
end;
Дэлгэцэнд үр дүн нь гарахдаа дараах байдалтай байна.
20 + 5 = 25
Энэ жишээнд label -ын Caption property –г ашиглалаа. Өмнөх болон дараа
дараагийн жишээнд ашиглаж бас болно.
"Format Strings" –н талаар илүү их мэдээлэл үзье гэвэл Delphi help -ээс
аварай.
 Windows үйлдлийн системийн ерөнхий зохион байгуулалтын талаар
товчхон
Windows-н өмнөх хувилбарууд MS-DOS үйлдлийн системтэй сайн зохицон
ажилладаг боловч үйлдлийн систем гэсэн утгандаа бүрэн хүрч чадахгүй
байсан
бол өнөөгийн Windows95 өөрөө 1 цогц үйлдлийн системийг илэрхийлж
чадах
болжээ.
Windows95 үйлдлийн систем нь ерөнхийдөө 3 дэд системд хуваагддаг.
1. Win KERNEL
2. Win GDI
3. Win USER
Windows95 нь 16 болон 32 битийн программуудыг ажиллуулахдаа
системийн
виртуаль машин болон дээрхи 3 дэд системийн тусламжтайгаар зохион
байгуулдаг. Системийн виртуаль машин гэдэг нь Windows-н бүх ажлыг
дэмжиж
байдаг Windows95-н бүрэлдхүүнд ордог үйлдлийн орчин юм. Мөн дээрхи 3
дэд
системийн ажлыг дэмжиж байдаг.
32 битийн win гэдэг нь санах ойн 32 битийн моделийг ашиглаж байдаг
windows-н
шинэ хэрэглээ юм. Харин 16 битийн win гэдэг нь бидний урьд өмнө
хэрэглэж
байсан windows-н хуучин хувилбарууд юм. Тэдгээр нь санах ойн
сегментийн
хаяглалтийг буюу чухамдаа 80286 процессорын санах ойн моделийг
ашигладаг.
Тэдгээр нь Windows 3.x –нх шиг ажиллахдаа Windows95 нх шиг нэгдмэл нэг
орон зайг хуваан эзэмшдэг бөгөөд олон бодлогын зарчимтай
зохицодоггүй.
Windows95-н хэрэглээний программийн төвшинд Windows 3.x –н API бүрэн
тохирч ажилладаг.
Win32 API нь Microsoft –н WinNT, Win32S, Win3.1-н өргөтгөл win32 битийн
интерфейс юм. Windows95 үйлдлийн систем нь олон бодлогын аргад
үндэслэн
дээрх application-уудыг жолооддог. Бүрхүүл гэдэг нь хэрэглэгчийг
системтэй
харилцах үйлдлийг хангаж байдаг 32 битийн Windows application юм.
Windows95-н бүрхүүл нь windows3.x-н программ менежер, файл менежер
зэргийг нэгтгэсэн application юм.

KERNEL
KERNEL нь windows-н доод түвшиний динамик санах ойн функцүүдээр
хангаж
өгч байдаг үйлдлийн системийн цөм юм. Энэ нь 16 ба 32 битийн windows-н
үйлдлүүд тохирох
үйлчилгээг хангадаг.

GDI
GDI нь graphic device interface гэсэн товчилсон үг. Энэ нь Windows95-н
график
боломж болон дэлгэцэнд харуулах өнгө, хэлбэр дүрс, resolution-г хангаж
байдаг.
Win32 –т байдаг бүх шинэ боломжуудыг агуулна.

USER
USER нь дэлгэцийн диспетчер юм. Windows-н интерфейсийг үүсгэх,
удирдах
функцүүдийн цргц юм. Жишээ нь Хэрэглэгч хэд хэдэн MS-DOS –н Prompt
гарган
ашиглаж болно.
Хэрэглэгч арай илүү виртуалчилах боломжийг хангадаг хэд хэдэн давуу
тал гарч
ирлээ.

Системийн виртуаль машин
Windows-н API функцийн төвшин
Дээр харлуулсан орон зайг хамтарч эзэмшинэ. Энэдээс Windows95 нь 16
битийн
программуудад тусад нь орон зай гарган өгч орчинийг нь бүрдүүлж өгдөг
нь
харагдаж байна.
Windows
32 bit
Windows
32 bit
16 bit
16 bit
Бүрхүүл
Windows-н дэд систем
Win KERNEL
KERNEL
Win USER Win GDI

Файл удирдах дэд систем
Сүлжээ удирдах дэд систем
Үйлдлийн системийн үйлчилгээ
Виртуал машин удирдах дэд
систем
Хөтлөгч хэрэгслүүд
Бүрхүүл
Энэ нь хэд хэдэн системийн удирдлагыг хэрэглэх нөөцүүдийн
боломжуудаар
хангах программ юм. Windows95-үйлдлийн системийн бүрхүүл нь дэлгэц
системийн нөөцүүдтэй харилцан ажиллахыг удирдан зохион байгуулдаг.
API
Хэд хэдэн зуун API функцүүд windows-н бүх системийн хийх үйлдчилгээг
хангаж
өгдөг. Windows-н орчин бол интерфейс баазын дуудалтаар ханддаг.
Үүнийг API
гэдэг.
Системийн виртуаль машин
Windows-н бүх application ситемийн виртуаль машины тухайн хил хязгаарт
үйлдлээ гүйцэтгэдэг. 16 битын application –ууд өөрийн нэгдмэл хаяглалын
орон
зайд ажилладаг.
Энэ нь application бүрийн өөрийн орон зайн хаяглалтыг 32 битын
хаяглалтаар
хангаж дэмжиж өгдөг.
MS-DOS-н виртуаль машин
Windows95 олон тооны MS-DOS-н программыг хамгаалалтын горим эсвэл
8086
виртуаль үйл ажиллагаа ажиллуулж дэмжиж байдаг. MS-DOS-н виртуаль
машин
хэд хэдийг үүсгэж болно.
Виртуаль машины диспетчер
Виртуаль машины диспетчер нь үнэндээ үйлдлийн системийн зүрх юм.
Энэ нь
доод түвшиний санах ойн удирдлага болон драйверуудын виртуаль
зохион
байгуулалтын үйлчилгээг хянаж ажилллаж байдаг.
| Windows95 –н диспетчерүүд
Windows95 –н виртуаль машины диспетчер дотор хоёр диспетчер
ажиллаж
байдаг.
Үүнд: Үндсэн диспетчер. (primary scheduler)
Энэ нь thread-дын приоретитүүдийг тооцоолж хариу өгнө.
Квантын диспетчер (timeslice scheduler)
Энэ нь хугацааны квантуудад хувааж хэсэгчлэн ажилуулана.
Үнэн хэрэгтээ квантын диспитчер аль thread-н ямар хувийг нь ямар
хугацаанд
процессороор үйлчлүүлэхийг тооцоолно.
Процесс 0-31 хүртэл приоритеттой байдаг ба үүнийг үндсэн диспетчер
бодоод
квантын диспетчер лүү гаргана. Хэрвээ процессийн хугацааны квант 100
хувь
болсон бол VMStat_Background эсвэл VMStat_High_Pri_Background гэдэг
төлвийг үлдээдэг.

DELPHI ДЭЭР АНХНЫ АЛХАМ ХИЙЦГЭЭЕ
Та мэдэж байгаа Delphi бол Borland пүүсийн Windows-ийн орчны
програмыг
бичдэг дээд түвшний програм юм. Delphi -ээр та Windows -ийн орчны
программыг урьд байгаагүйгээр хялбар бөгөөд хурдан бичих боломжтой.
Win32 эсвэл Win32 graphical user interface (GUI) -ийг та нээж ажиллуулж
болно. Win32 GUI -ийг ажиллуулснаар та дээд түвшний програмчлалын
хэлний үнэн хүч чадлыг мэдрэх болно. Мөн та Web browsers –ийг
минутийн
дотор үүсгэдэг шигээ form дээрх ActiveX control -оор тусгай програмуудыг
үүсгэж болно. Энэ мэт олон зүйлийн давуу талууд Delphi -д байдаг ба
Delphi нь өөрөө кодоо үүсгэдэг тул програмын биелэлт хурдан байдаг.
Танд л гэж хэлэхэд Pascal -ын программчлалыг жаахан судлах хэрэгтэй.
Delphi нь Windows програмчлалын доод түвшний нарийн зүйлүүдийг
нуудаг
ба энэ нь танд чухал биш. Эцэст нь та програмист л болохыг хүсч байгаа
бол энэ нь бүгдийг судлах хэрэгтэй. Delphi нь танд урьд байгаагүй хөгжил
таашаалыг авчрах болно. Ингээд ханцуйгаа шамлан бүх ажилдаа
орогтун.
Delphi сэтгэлийн таашаалыг авчрах агуу программ юм.
Delphi IDE -ийг өнгөц харъя
Энэ хэсэг нь Delphi integrated development environment (IDE) -ийг агуулна.
Windows програмчлалыг судлах бүхэнд энэ нь хэрэгтэй юм. Та одоо
Delphi
-ийг эхлэх урам зоригтой байгаа гэж бодож байна. Программыг
эхлүүлэхэд
та хоосон form ба IDE -ийг харах болно.
Delphi IDE нь 3 хэсэгт хуваагдана. Дээд хэсгийг нь үндсэн цонх гэдэг. Энэ
нь toolbars болон Component palette -ийг агуулдаг. Delphi toolbars нь
compiling project, хадгалах, нээх үйлдлүүдийг нэг товшилтоор гүйцэтгэх
боломжийг танд олгоно.
Component palette нь wide array of components агуулдаг ба түүнийг form
дээр чирч тавьж болно. Component -ууд нь text labels, edit controls, list
boxes, buttons ба бусад болно. . Componentууд нь бүлгүүдэд хуваагдсан
байна. Component palette -ийн дээд талын tab -ыг харав уу?
Дээр нь очоод click хийвэл өөр өөр component гарч ирнэ. Form дээрээ
component -оо байрлуулахын тулд Component palette -ийн компонентын
button дээр click хийж component -оо харагдах хэсэгт нь очоод click хийх
хэрэгтэй. Яаж хэрэглэх үр дүнд юу болох бол гэж санаа зовох хэрэггүй.
Эдгээр нь хормын дотор болно.
Шинэ нэр томъёо: Component гэдэг бол software -ийн 2 хэсгийг агуулсан
ба тусгай урьдчилан тодорхойлогдсон функц үйлдлийг нь гүйцэтгэж
байдаг. Жишээ нь: text label, edit control, list box.
Обьектийн инспектор
Үндсэн цонхны доор дэлгэцийн зүүн талд Object Inspector байна. Энэ нь
component -ийн properties ба events -үүдийг өөрчлөхөд ашиглагддаг.
Delphi
-тэй ажиллах явцдаа үргэлж Object Inspector -ийг та хэрэглэх болно.
Object
Inspector нь 2 хэсэгтэй. Properties tab ба Events. Component -ийн
properties
нь component -ийг яаж ажиллуулахыг удирдана. Жишээ нь : Color property
-
ийг өөрчлөхөд background color -нь өөрчлөгддөг.
Шинэ нэр томъёо: property –нь component -ийн үйл ажиллагааг
тодорхойлдог.
Events хэсэг нь component -ын event -уудын жагсаалтуудаас бүрдэнэ.
Component дотор үйлдэл хийхэд event -ийг ашигладаг. Жишээ нь
component дарагдахад event нь component дарагдсан байна шүү гэж танд
хэлнэ.Та component -д хамаарах код бичиж болох ба тусгай үйлдлийг
гүйцэтгэхэд хэрэглэж болно.
Шинэ нэр томъёо: event бол цонх ба хэрэглэгчтэй ажиллах component -
ийн харилцан ажиллагааны үр дүн юм.
Delphi –ийн ажлын талбар
Delphi IDE -ийн үндсэн хэсэг нь ажлын талбар юм. Ажлын талбар нь Form
Designer -ийг үүсгэнэ. Энэ нь гайхмаар юм биш Form Designer нь өөрөө
form үүсгэдэг. Delphi -д form гэдэг нь программын цонхыг хэлнэ. Form нь
программын үндсэн цонх байж болно, dialog box эсвэл цонхны янз
бүрийн
хэлбэртэй байж болно.
Form Designer -ийг, form -ийг үүсгэх процессийн хэсэгт component -уудыг
нь байрлуулах, зөөх зэргээр ашиглаж болно. Form Designer -ийн ард
Code
Editor байдаг. Программын кодыг Code Editor дээр бичдэг. Application -ийг
үүсгэн ажиллах явцад Object Inspector, Form Designer, Code Editor, ба
Component palette -ууд нь харилцан уялдаатай байдаг. Та Delphi IDE-ийг
мэддэг боллоо одоо ямар нэг зүйлийг хийж үзье.
Таны эхний програм: Hello World
Дэлгэцэнд Hello World гэж хэвлэх нь бүх програмчлалын хэлний сурах
бичигт байдаг уламжлалт програм юм. Заавал ийм байх албагүй гэж би
боддог. Pascal хэлийг өмнө нь судалсан бол сайн юм. Та гайхаж магадгүй
юм, Delphi танд одоогийн Windows program -ийн Hello World -д хүрэх
хамгийн хялбар замыг зааж өгнө.
Програм бичих
Та яг одоо Delphi -ийг ажиллуулж байгаа бол blank form -ийг харсан байх
ёстой. Form нь Form1 гэж нэрлэгдсэн байдаг. Form -ийн зүүн хэсэгт Object
Inspector form -ийн properties -үүдийг харуулна. Object Inspector -ийн title
bar
дээр товш. Caption property нь идэвхжих ба cursor нь тэнд юу хийхийг
хүлээнэ. Hello World! гэж бичин form -ийн caption -ийг өөрчил.
Санамж: Properties -ийг өөрчлөх бол Delphi шууд өөрчлөлтийг нь
гаргадаг.
Caption -ийг өөрчлөх үед form -ийн window caption нь өөрчлөгдөж байгааг
ажигла.
Toolbar дахь Run товчийг товш. Form нь гарахдаа caption нь Hello World!. -
ийг гаргана. Энэ тохиолдолд ажиллаж байгаа программ нь бараг л blank
form шиг харагдана.
Програмыг өөрчлөх
Одоо программаа жаахан өөрчилье. Hello World чинь байгаа бол Close
button дээр товшин хаах хэрэгтэй. Form Designer дахин гарч ирэх ба form-
ийг өөрчлөх боломжтой. Программыг илүү сайжруулахын тулд цонхны
төвд
текст нэмэх хэрэгтэй. Үүнийг хийснээр form -доо text label -ийг та нэмж
өгнө.
1. Эхлээд Component palette -ийн Standard хэсэгт товш.
2. Label button -ийг товшоод form -ийн хаа нэгтээ товш. Label
component нь form -ийн дотор байна.
3. Object Inspector дээр буцаад оч. Label1 -ийн properties -ууд гарч
ирсэн байгаа. Caption property нь бас идэвхжсэн байгаа.
4. Object Inspector эсвэл Caption property -ийн titlebar дээр товш
тэгээд Hello World! гэж бич. Form -дээрх label нь Hello World!. гэж
гаргана.
5. Үүнийг хийсэн бол label -ийн text -ийн хэмжээг өөрчилж чадна.
Font property дээр 2 товш. Property нэмэлт font attribute -ийг
харуулахын тулд өргөн болно.
6. Font -ийн Size property -ийг 24 болгоод form -дээрээ товш. Label
шинэ хэмжээтэй болно.
Програмаа хаах
Delphi -д жаахан дурласан бол энэ нь бүхнээс илүү таны сонирхлыг
татна.
Дараа нь юу хийх вэ гэвэл одоогийн прожектийг хаах хэрэгтэй. File
цэсний
Close All -ыг сонго. Project1 -ийн өөрчлөлтийг хадгалах бол No -ийг сонго.
Таны 2 дахь программ: Hello World, II хэсэг
Pascal -ийг судлахаасаа өмнө Delphi хэрхэн ажиллдаг талаар мэдэх
хэрэгтэй. Танд Pascal –ийн олон төрөл дээр ажиллахад энэ нь хэрэг
болно.
Энэ хэсэг нь Delphi -ийн үнэн хүчийг хальт агуулна.
Санамж: Компонентийн properties -ийг өөрчилсөн бол design-time
өөрчлөлт
хийсэн гэсэн үг. Харин кодоор property -ийг нь өөрчилсөн бол runtime
өөрчлөлт гэж нэрлэгддэг.
Ажиллах үед нь Caption property -ийг өөрчлөхийн тулд:
1. Form дээрх button –ийг 2 товш. Ингэхэд Delphi нь event handler -ийг
button -ийн OnClick event дээр үүсгэнэ. Үүсгэсэн код нь дараах
байдалтай байна
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
2. Засварлагч курсор нь begin ба end гэсэн зарлагааны хооронд
байдаг ба таныг код бичихийг хүлээж байдаг.
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := `Hello World, Part II';
end;

Энэ код маш энгийн юм. Энэ нь Hello World, Part II гэсэн өгүүлбэрийг
Caption property -руу шилжүүлдэг.
3. Одоо toolbar -т байгаа Run товчин дээр дарж программыг ажиллуул.
Программыг ажиллуулахад label -ийн caption нь Label1 гэж хэвээр
байгааг анхаарна уу. Form -ийн button дээр дарж label -ийн гарчгийг
өөрчил. Гайхамшигтай байгаа биз. Зүгээр л Delphi ажиллаж байгаа
юм. Иймэрхүүгээр олон дасгалыг ойрын хэд хоногт хийж form -ийн
бусад компонент labels, button –уудын талаар их туршлагатай болно.
Би үйл явдлын ард нь юу болдгийг бүхэлд нь тайлбарлах гээгүй
харин дараа нь бүх тайлбар хийхийг л хүсэхггүй байна.
Object Pascal хэлийг нягтлан харах нь
Delphi -ийн RAD онцлогийг суралцахаасаа өмнө обьект Паскал хэлний
үндсийг судлах хэрэгтэй. Энэ ном магадгүй хамгийн сайн нь биш юм шиг
танд санагдаж болох юм гэхдээ та юуны өмнө обьект Паскалийг судал.
Обьект Паскалийг дараалаар нь судалбал сайн хэрэг. III бүлгийн
хичээлийн дараа та обьект Паскалийн бүрэн дүр зурагтай болсон байна.
Хоромхон зуурын ухвар ойлголтонд бүү хуурт.
Зарим нь обьект Паскалийг бүрэн ойлгохыг шаарддаг ба энэ нь бодит
туршлага юм. Ойрын хэдэн өдрийн турш та зарим кодын хэсгийг харах ба
энэ нь обьект Паскалийн зарим онцлогийг дүрслэн үзүүлдэг. Та зарим
дасгал хийх ба таны олсон шинэ мэдлэгийг бататгана .Эхний хэдэн өдөр
та
зөвхөн Delphi application -ийг жаахан хэсэгт харна.
Юун түрүүнд би Delphi IDE болон Visual Component Library (VCL) -ийг
судалмааргүй байна. Та бүрэн ойлголттой болсныхоо дараа эхлэх
хүртлээ
бага багаар ахих хэрэгтэй.

Түүхийн шар хуудас
1994 онд Borland пүүс нь RAD хэрэгсэл дээр ажиллаж эхэлсэн ба энэ код
нь Delphi гэж нэрлэгдсэн байна. RAD -ийг хэрэгжүүлэх хамгийн шилдэг
зам
нь компонентийн загвар архитектур байна гэж шийдэгдсэн байсан. Энэ нь
системийн гол цөм байх програмын хэлний асуудлыг шийдсэн байв.
Тэр үед Borland пүүс нь Pascal –ийн зах зээл дэх ганц борлуулагч байв.
Borland нь Pascal -ийн хэрэгсэлийг үйлдвэрлэдэг хамгийн сайн компани
байв. Та Pascal -ийн програмист байсан бол Borland -ийн TurboPascal -
ийг
хэрэглэн амтанд нь орох байсан биз. Borland пүүс Pascal хэлийг хуулийн
хүрээнд бүрэн эзэмшдэггүй боловч Pascal -ийн ертөнцөд том байр
эзэлдэг
гэдэгт эргэлзээ байдаггүй.
Энэ нь Pascal хэлний онцлогийг нэмэгдүүлэх тал дээр том байр эзэлдэг.
Энд хэлэхэд Pascal -ийн стандарт хороо байдаггүй ба Pascal хэлийг
тодорхойлон бичигдсэн стандарт байдаггүй. Borland пүүс Delphi -ийг
Pascal
-ийн үндсэн дээр бичсэн юм. (Borland -ийн нэр нь програмын хэлний нэр
болсон) Delphi хэрэглээнд гарахаас өмнө Borland пүүс Pascal хэлийг
өөрчилсөн. Жишээлбэл : Pascal -ийг обьект Pascal болгон өөрчилсөн
байв.
Энэ нь обьект Pascal нь Pascal -ийн хувьд C++ нь C -ээс ямар ялгаатай
байдаг шиг обьект Pascal нь классийг Pascal -д нэмсэн ба үүгээр обьект
хандлагат програмчлалд Pascal орж ирсэн. Delphi хөгжихийн хирээр шинэ
хэлний онцлог ба түлхүүр үг нэмэгдэн орж ирэн компонент загвартай
зохицож эхэлсэн. Түлхүүр үгүүд ба property өөр бусад нэмэгдэн орж
ирсэн.
Энэ нь Borland -д компонент загварын бүрэн хүчийг хэрэгжүүлэх
боломжийг
олгосон.
Компонентод тохируулан Паскал хэлийг өөрчилснөөрөө Borland нь RAD -
ийг хэрэгжүүлэх боломжтой болсон. Гол нь обьект Паскал хэл нь
өөрчлөгдсөнөөрөө Delphi -ийн боломжуудыг нээж өгсөн. Үр дүнд нь
компонент загвар ажиллаж эхэлсэн. Хэдийгээр Паскалийг
өөрчилсөнөөрөө
Borland нь том алхам хийсэн боловч урьдах зүйлтэй холбоотой. Microsoft
компани BASIC хэлийг авч өөрчлөн Visual Basic хэлийг гаргасан байдаг.
Энэ шинэ хэл нь баазад ажилладаг эх Basic хэлнээсээ ялгагдахгүй
шахам
байсан. Borland пүүс Паскал өөрчилснөөрөө эрсдэлтэй алхам хийсэн. Бүх
юмны дараа хэрэглэгчид таатай бус хүлээн авсан. Одоог хүртэл Borland
нь
Паскалийн зах зээл дээр хатуу байр суурьтай байгаа ба энэ хэвээрээ
байгаа билээ. Үүнд алдаа хийхгүй бол обьект Паскал хүчирхэг хэл ба би
зарлалтыг нь тэгж хөнгөн хийхгүй байхсан.
Обьект Паскал нь сургалтанд бол хамгийн хүчирхэг байгаа билээ. Би
Обьект Паскалийг бүх онцлогийг агуулсан гэж хэлэхгүй. Паскал бол
програмчлалд түгээмэл хэрэглэгддэг.
Санамж: Юу хийхийг тодорхойлохдоо Delphi нь хэд хэдэн нэр томъёог
хуулан авсан. Delphi -ийн үндсэн хэл бол мэдээж обьект Паскал ба зарим
хүмүүс үүнийг Паскал гэж хэлдэг. Зарим Паскал дээр хийж байна хэлдэг.
Эцэст нь юу гэж хэлэхээ та шийд. Обьект Паскал нь обьект хандлагат
програмчлалд бүрэн зохицсон болно.
Шинэ нэр томъёо: Обьект - урьд нь компонентыг тодорхойлж байсан
шиг
тусгай програмчлалын хоёр тал юм. (Компонент бол обьект юм, харин
бүх
обьект нь компонент биш)
Pascal Unit -ууд
Програмчлал бол код бичихээс илүү ажил юм. Эцсийн эцэст энэ бол
програмын цогц бөгөөд код бичих нь програмчлах зорилгыг нь биелүүлж
байгаа болно. Таны бичсэн код бол зөвхөн текст файл руу ордог.
Компьютер тэр текст файлыг аван машины кодод хөрвүүлэлт хийн
ойлгодог. Delphi -ийн код агуулдаг текст файлыг unit гэдэг.
Шинэ нэр томъёо: unit бол кодын модульд хөрвүүлэгдэх боломжтой
текст
файл юм.

Unit -ийн төрлүүд
Delphi GUI application нь багадаа хоёр unit -ийг агуулдаг. Project source
unit
нь project source кодыг агуулдаг. Project source код нь DPR өргөтгөл
байдаг.
Та project source unit -ийг Project | View Source -ийг үндсэн цэсээс сонгон
үзэж болно. Project source unit -ийг өөрчлөх хэрэгцээ нэг их байдаггүй.
Үнэндээ project source unit -ийг юу хийхээ мэдэхгүйгээр хийх хэрэггүй. Та
хэрэв project source unit -ийг санамсаргүй өөрчилсөн бол application тань
ажиллахгүй болно.
Delphi GUI application -ийн хоёр дахь төрөл нь үндсэн form -ийн unit
байдаг.
Form unit гэдэг бол тухайн form -тай хамтардаг source code unit байдаг.
Unit
-ийн энэ төрөл нь PAS өргөтгөлтэй файл байдаг. Delphi -д та энэ төрлийг
нь голлон хэрэглэнэ. Delphi GUI application нь голдуу нэг form unit -тэй
байдаг. (Үндсэн form -ийн хувьд) Харин энэ нь нэгээс илүү form unit -тэй
байж болно. Жишээ нь: About box -ийг гаргадаг application нь үндсэн form
unit -тэй байх ба About box -ийн unit байна.
Тэмдэглэл: "Delphi GUI application." нь console mode application -ийн GUI
application -ээс ялгаатай байдаг. Console mode application бол console
window (DOS box) -ийг ажиллуулдаг 32-bit Windows application юм.
Console application -д үндсэн form байдаггүй ба өөр form -уудыг агуулж ч
болно, агуулахгүй ч байж болно. Хэдий ийм боловч console application нь
нэг эсвэл түүнээс илүү unit -тэй байж болно.
Delphi application -д та 3 дахь unit -ийг хэрэглэж болно. Энэ төрлийн unit
нь
source кодыг агуулдаг. Зөвхөн unit -ийг агуулдаг код нь project -ийн бусад
unit гэж дуудагддаг.

Delphi Unit –ийн бүтэц
Delphi unit нь урьд тодорхойлогдсон форматыг дагах ёстой. Unit урьд
тодорхойлогдсон форматанд байх ба энэ нь хөрвүүлэгч unit -ийг уншиж
чадах ба unit -ийн кодыг компиляц хийж чадна. Delphi project unit нь unit -
ийн нэртэй програмын түлхүүр үгийг агуулдаг ба кодын хэсэг нь begin ба
end гэсэн түлхүүр үгээр тэмдэглэгддэг. Та үндсэн unit -ийг Delphi -ийн
үндсэн цэсээс View | Project Source -ийг сонгон харж болох ба default
Delphi
project -ийн project source unit -нь дараах байдалтай байна.
Тэмдэглэгээ: Доорх мөрийн дугаарууд нь unit -ийн өөрийнх нь хэсэг биш
болно. Үүнийг зөвхөн дарааллыг заахад ашигласан. Заримд нь ийм
дугаар
байгаа ба заримд нь байхгүй болно. Аль алинд нь Паскал хэл нь бусад
хэлүүд шиг мөрийн дугаар авдаггүй гэдгийг ойлгох хэрэгтэй. (онцолбол,
BASIC).
Cтандарт DELPHI PROJECT –ийн PROJECT SOURCE
01: program Project1;
02:
03: uses
04: Forms,
05: Unit1 in ‘Unit1.pas’ {Form1};
06:
07: {$R *.RES}
08:
09: begin
10: Application.Initialize;
11: Application.CreateForm(TForm1, Form1);
12: Application.Run;
13: end.
/
1 мөрөнд програмын түлхүүр үг програмын үндсэн source unit -ээр энэ
unit
-ийг тодорхойлсон. Үүнийг та unit -ийн нэр Project1 нь програмын түлхүүр
үгээ даган яваагаас харж болно. (Delphi таныг нэр өгөх хүртэл өөрөө
нэрийг нь автоматаар өгдөг)
3 мөрөөс эхлэн түлхүүр үгээр тодорхойлогдсон хэсгийг харж байна. Ямар
ч
unit -ийн нэр нь цэгтэй таслалтай түлхүүр үгийг дагадаг ба компиляци энэ
дарааллаар хийгдэнэ.
7 мөрөнд компиляцийн директив нь Delphi нь project -ийн resource file -ийг
агуулдгийг харна. Resource файлууд нь VIII бүлгээр яригдана. “Creating
Applications in Delphi."
9 мөрөнд begin түлхүүр үг ба 13 мөрөнд end түлхүүр үгийг агуулсан.
Сүүлийн түлхүүр үг цэгээр төгссөн байгааг ажигла. (unit нь олон түлхүүр
үгтэй байж болох ба харин ганц төгсгөлийн end –тэй байна.)
10, 11, 12 -р мөрүүдэд код нь application -ийг үүсгэж байгаа ба application -
ийн үндсэн form -ийг үүсгэх ба application -ийн биелэлтийг эхлүүлнэ. Та
энэ
кодын нарийн хэсэгт анхаарах хэрэггүй.
Тэмдэглэгээ: begin ба end нь кодыг блоклоно. Кодын блок нь кодын
хэдэн
мөрийг агуулж болох ба мөн хэдэн зуун мөрийн кодыг ч агуулж болно.
Номонд ч бас ийм байгааг та харж болно. Та ном хэрэглэдэг бол яаж,
хэзээ
хэрэглэхийг мэдэх болно.
Паскал unit -ийн өөр хэсэгт харцгаая. Үндсэн цэсээс File | New -ийг
сонгоно.
New Items гарч ирэхэд icon -ийг байрлуулан 2 товшилт хий. Delphi шинэ
unit
-ийг нээх ба харуулахдаа Code Editor -д unit код нь үүснэ.

Хоосон UNIT
01: unit Unit2;
02:
03: interface
04:
05: implementation
06:
07: end.
Цөөн байгаа биз? Энэ unit нь 2 зүйлтэй. Эхнийх нь unit нь нэр нь түлхүүр
үгтэйгээ байгаа. Түлхүүр үгтэй программ эхэлж байгаа ба код нь unit
түлхүүр үгтэй ба харин хэдхэн ерөнхий элементтэй байна. Pascal unit нь
unit нэртэйгээ байгаа түлхүүр үгээр эхлэх ба end нь хоёулангийнх нь
сүүлд
байдаг. Энд end түлхүүр үг нь бас сүүлдээ цэгтэй байгаа.
Програмын main source unit -ийнх биш unit нь interface ба implementation -
уудыг агуулдаг. Энэ хоёр түлхүүр үг нь The interface Section" and
"Implementation Section," зэрэг хэсгүүдэд нарийн тодорхойлогдсон байгаа
болно. Программын үндсэн unit нь begin and end -ийг хоёуланг нь авч
явах
ба харин source unit -нь төгсгөлдөө л end -тэй байна. Дараагийн хэсэг нь
Pascal unit дотор хэрэглэгддэг түлхүүр үгийг тодорхойлно.
Uses жагсаалт
Шинэ нэр томъёо: uses жагсаалт бол гаднах unit -уудын жагсаалт.
3 мөрөнд uses түлхүүр үгийг хэрэглэсэн байгаа. Uses нь бусад unit -уудын
жагсаалтыг агуулсан хэсгийн эхлэлтийг тодорхойлж байгаа бөгөөд энэ
unit
нь түлхүүр үгээсээ хамаарна.
Application.CreateForm(TForm1, Form1);
Кодын энэ мөр нь бусад unit -уудад байрлах мэдээллийг агуулах ба энэ
unit -д олдохгүй. Application.CreateForm гэж тодорхойлогдсон процедур нь
Forms.pas гэгдэх Delphi unit -д байх ба TForm1 ба Form1
идентификаторууд
нь прожектийн main form unit-д байрлах ба Unit1.pas гэж хэлэгдэнэ. Та
холболтыг нь харав уу? Uses жагсаалт нь unit -ийг компиляци хийхэд
хэрэгтэй нэмэлт мэдээллийг агуулдаг гэж үзнэ. Энд uses жагсаалтийг
харуулав.
uses
Forms,
Unit1 in ‘Unit1.pas’ {Form1};
Uses жасгаалт нь 2 unit нэртэй байна. Forms ба Unit1. Заримдаа энэ нь
сайн жишээ биш байдаг. Яагаад гэвэл 2 -р unit жагсаалт нь нэмэлт
текстийг
агуулсан байдаг. (Unit1 in ‘Unit1.pas' {Form1}).
Энэ текст нь form -ийг онцлоход хэрэглэгдэх ба unit -дээ байдаг бөгөөд
прожектийн main source unit -ээр л хэрэглэгддэг. (Угалзан хаалтанд байх
текст нь кодын бусад хэсэгт байх тайлбар)
Uses жагсаалтыг байгуулахад мэдвэл зохих 2 зарчим байдаг:
• Эхлээд жагсаалт дахь unit бүр дараах unit -ээсээ таслалаар
тусгаарлагдах ёстой.
• Дараа нь сүүлийн unit-ийн жагсаалт нь цэг таслалтай байх. Цэг таслал
нь uses жагсаалтыг төгссөнийг заана.
Ерөнхийдөө жагсаалт нь идэвхтэй unit -ийн нэрсийг агуулах ёстой. Uses
жагсаалт нь uses түлхүүр үг, цэг таслалтай end -ээр тодорхойлогдох
ёстой.
Тэрнээс гадна uses жагсаалт нь яаж зохион байгуулагдсанаасаа
хамаарахгүй. Жишээ: Дараах 2 uses жагсаалтууд ижил:
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;
Unit нь uses жагсаалт нь ямар ч тоотой байж болно.
Тэмдэглэгээ: Зарим тохиолдолд Delphi нь танд uses жагсаалтанд unit -
ийг
нэмж өгдөг. Энэ нь File | Use Unit цэсээр хийгддэг. Энэ онцлог нь IV
бүлгээр
нарийвчлан яригдана.
Интерфейс хэсэг
Өмнөх кодонд интерфейс түлхүүр үг байгааг анзаарсан болов уу.
Интерфейс хэсэг бол идентификатор нь unit -ээсээ авч ирэн зарлагдсан
unit –ийн хэсэг юм. Ихэнх unit -ууд нь өөр unit –уудад хэрэглэгдэх кодыг
агуулсан байдаг. Энэ код нь класс, процедур, функц, хувьсагчаар
хангагдсан байж болно.
Аль ч обьект нь интерфейс хэсгээрээ нэг unit -ээс нөгөө unit -руу
зарлагдах
боломжтой. Та интерфейс хэсэг нь жагсаалтыг агуулдаг гэдгийг хэлж
чадна. Интерфейс хэсэг нь интерфейс түлхүүр үгээр эхэлдэг ба
implementation түлхүүр үгээр дуусдаг.
Implementation хэсэг
Шинэ нэр томъёо: implementation хэсэг бол тухайн unit -ийн кодыг
агуулдаг хэсэг юм.
Implementation хэсэг implementation түлхүүр үгээр эхэлдэг ба дараагийн
unit
-ийн түлхүүр үгээр дуусдаг. Дараагийн unit -ийн түлхүүр үг нь голдуу unit -
ийн төгсгөл end түлхүүр үг байдаг. Паскалийн тал байгаа учир илүү юм
ярих боломжгүй байна. Хэдий ийм боловч интерфейс ба implementation -
ийн жишээ нь танд ойлголтыг жаахан төрүүлэх болно.
DoSomething гэж нэрлэгдэх процедур нь unit -ийг үүсгэнэ. Та бусад unit -
уудад DoSomething –ийг дуудагдахыг хүсч байна уу? Энэ тохиолдолд
DoSomething процедурыг интерфейс хэсэгт зарлах ба implementation
хэсэгт
тодорхойлох хэрэгтэй. Доорх хэлбэртэй байна.
PUBLIC функцтэй unit
unit Unit2;
interface
procedure DoSomething;
implementation
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
DoSomething процедур нь interface section -д зарлагдсан байгааг анзаар.
Тэгээд implementation section -д тодорхойлогдсон байгаа.
Initialization ба finalization хэсэг
Initialization ба finalization хэсэг нь unit -ийн шаардлагатай кодыг цэвэрлэх,
эхлэл хийх, гүйцэтгэх боломжтой. Initialization section -д ямар ч код unit
санах ойд ачаалагдах үед биелэгддэг. Finalization section -д unit санах
ойгоос ачаалагдаагүй байхаас өмнө биелэгддэг. Initialization section -
гүйгээр та finalization section -тай байх боломжгүй. Энэ хоёр нь хоёул
сонголт юм.
Unit –д хэрэглэгддэг түлхүүр үгүүд
Pascal unit бусдыг агуулж болдог ба сонголтын түлхүүр үг нь өөр өөр
зорилгоор нь хэсгүүдийг ангилдаг. Эдгээр түлхүүр үгүүдийн зарим нь
олон
хэрэглээтэй. Дараах хэсэг нь unit –д хамаарагдах түлхүүр үгийг л
тодорхойлсон байгаа.
Const түлхүүр үг
Ер нь unit нь нэг түүнээс илүү const хэсгийн сонголттой байх боломжтой.
Const хэсэг бол түлхүүр үгээр тодорхойлогдсон байдаг. Тогтмолоор
зарлагдсан хувьсагчаар const хэсэг нь тодорхойлогдоно.
Constant бол өөрчилж болохгүй идентификатор юм. Жишээ нь таны
програмд олон хэмжигдэхүүн байдаг гэе. Үүндээ та тогтмол хувьсагчийг
ашиглах боломжтой. Const section -ийг доорх програмд нэмье гээд
төсөөлөөд үзье. Та const хэсэгт нэг тогтмолыг нэмэх ба өөр const хэсэг нь
2
тогтмолыг нэмсэн.
unit Unit2;
interface
const
AppCaption = ‘My Cool Program 1.0’;
procedure DoSomething;
implementation
const
BaseX = 20;
BaseY = 200;
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
AppCaption Тогтмол нь interface section -д зарлагдсан учир unit -ийн аль ч
хэсэгт энэ нь хэрэглэгдэж болох ба uses жагсаалтанд байгаа аль ч unit -
ийн хувьд мөн адил байна. BaseX and BaseY хувьсагчууд нь unit дотроо
боломжтой яагаад гэвэл тэд implementation section -д зарлагдсан.
Тогтмол түлхүүр үг нь нэгээс илүү хэрэглээтэй байж болно.
Type түлхүүр үг
Шинэ нэр томъёо: Type түлхүүр үг нь таны програм хэрэглэх шинэ
төрлийг зарлахад хэрэглэгддэг. Шинэ төрлийг зарлах нь esoteric
програмчлалын технологи бөгөөд энд тайлбарлах нь хэцүү болно. Доор
20
байтын массив таны application -д хэрэгтэй байгаа ба энэ төрөл нь дахин
дахин хэрэглэгдэнэ. Та доорх шиг зарлаж болно.
Type
TMyArray = array [0..19] of Byte;
Та одоо array [0..19] гэж бичихийн оронд TMyArray гэсэн төрлийг ашиглах
боломжтой.
“Var “Түлхүүр үг
Шинэ нэр томъёо: Энэ түлхүүр үг нь хувьсагчууд байдаг кодын хэсгийн
зарлалтын үед хэрэглэгддэг.
Энэ түлхүүр үгийг та элдэв хувьсагчуудыг зарлахад хэрэглэж болно. Var -
ийг зарлах хэдэн байрлал байдаг. Unit -ийн түвшинд var -ийг та зарлаж
болно. Мөн процедур, функцийн түвшинд var -ийн хэсэг байж болно.
unit Unit2;
http://www.csms.edu.mn/cheri/
interface
type
TMyArray = array [0..19] of Byte;
const
AppCaption = ‘My Cool Program 1.0’;
var
X : Integer;
MyArray : TMyArray;
procedure DoSomething;
implementation
const
BaseX = 20;
BaseY = 200;
procedure DoSomething;
begin
{ Code for DoSomething goes here. }
end;
end.
Const түлхүүр үг шиг, var -т бас олон хэрэглээ байдаг. Энэ нь бас функц,
процедурын параметр, хувьсагч параметруудыг зарлахад хэрэглэгддэг.
Тэмдэглэгээ: var -аар тодорхойлогдсон хэсэг нь түлхүүр үгээр эхэлж,
дараагийн unit -ийн түлхүүр үгээр дуусна.
Кодын тайлбар
Паскал хэл рүү нарийвлан орохын өмнө кодын тайлбарын тухай товч
танилцуулъя. Тайлбар нь таны source кодод текст хэлбэрийн тайлбар
өгөх
зорилготой байна. Тайлбар нь код юу хийхийг тодорхойлоход хэрэглэгдэх
ба зохиогчийн эрхийн мэдээллийг хангах, өөртөө эсвэл бусдад тэмдэглэл
хийхэд л ашиглагддаг.
Тайлбар нь ялгаатай 3 аргаар тодорхойлогддог. Дараах зүйлүүд нь бүгд
шугмын хувьд хүчинтэй байна.
{ Don't forget to free this memory! }
{
ADTAPI.PAS 2.50
Copyright (c) TurboPower Software 1996-98
}
(* Оюутнуудаа энэ кодыг засах хэрэгтэй *)
// Энэ үнэн зэрлэг код
{ Энэ код дээр дараа тухтай ажиллана }
Магадгүй Delphi –д ихэнх тайлбарын төрөл нь угалзан хаалтыг
хэрэглэдэг.
“{“ нь эхлэх үед тайлбарыг, ”}” –нь тайлбарын төгсгөлд хэрэглэгдэнэ.
Тайлбарын өөр нэг нь (*тайлбар эхлэх,ба *) байдаг. Энд бас нэг
тайлбарын
тэмдэг байдаг: (*/*) тайлбарын тэмдэглэгээ нь том хэмжээний тайлбарыг
хийхэд болно. Эдгээр тайлбарын төрлүүд нь нэг эсвэл олон мөрт
тайлбарыг хийхэд ашиглагдана.
Тэмдэглэгээ: Угалзан хаалт нь Паскалд өөр хэрэглээтэй байдаг. $ -ийг
хэрэглэх үед хаалт нь компиляторын директорыг заадаг. Компиляторт
compiler hints үүсгэхгүй гэж зааж өгөн source коддоо {$HINTS OFF} гэж
бичих хэрэгтэй. Компилятор энэ мөрийг хараад unit -д дохио өгөхөө
{$HINTS ON} –тэй тулаад зогсооно.
Тайлбарын 3 дахь хэлбэр нь давхар зураас байдаг. Энэ нь голдуу С -
хэлбэрийн тайлбар гэгддэг яагаад гэвэл С ба С++ үүнийн хэрэглэдэг. Энэ
хэлбэр нь нэг мөрөнд хэрэглэгддэг. Delphi -д энэ хэлбэр ажилладаггүй
гэдгийг хэлье.
Тэмдэглэгээ: Энд угалзан хаалт хэрэглэсэн байгаа. ”//” -ийг богино
тайлбарт болон тестийн зорилгоор ашигласан .
Аль ч тайлбарлагдсан текст нь компиляторт хамааралгүй байдаг. Хэрэв
та
default Delphi IDE settings -ийг ашиглаж байгаа бол бүх тайлбар мөр нь
бичмэл хөх текст байгаа. Энэ нь тайлбарыг хурдан ялгахад дөхөм
байдаг.
Тэмдэглэгээ: Хэрэв та багийн бүрэлдэхүүнтэй програмчлалын ажил
хийдэг бол та хамтран ажиллагчдынхаа код, бичлэгийг уншдаг байх.
Кодонд товч тайлбар хийх нь аль ч програмистад цагийг нь хэмнэнэ. Та
ганцаараа ажилладаг гэсэн ч тайлбар бичих нь чухал. Та бичсэн кодоо
ямар амархан мартаж байгаагаа хараад л гайхна. Сайн кодын тайлбар
нь
таны хамтрагчийн цагийг хэмнээд зогсохгүй таныг ч бас аварна. Кодын
тайлбар бичихээ бүү март!
Хувьсагчид
Хувьсагчид нь хэрэглэгдэхээсээ өмнө зарлагдсан байдаг. Та хувьсагчдыг
кодын тусгай хэсэгт зарлах ба var түлхүүр үгээр тодорхойлох хэрэгтэй.
Жишээ нь:
var
X : Integer; { X хувьсагч нь integer төрөлтэй }
Y : Integer; { Байршлын y утга }
Өмнө нь “var” түлхүүр үгийн тухай Паскалийн unit -ийн нэр томъёонд
дурдсан билээ. Тэр хэсэгт unit -д хувьсагчуудыг хэрэглэдэг ба unit -ийн
var
хэсэгт зарладаг гэж үзсэн билээ. Тэр нь үнэн ч та бас функц,
процедуруудыг энэ хэсэгт зарлаж болно. Функц, процедурт хувьсагчуудыг
зарлах боломжийг энэ нь танд олгож байгаа болно. Доорх жишээ нь
процедурт var хэсэг байна.
procedure TForm1.Test;
var
S : string;
begin
S := ‘Hello World!’;
Label1.Caption := S;
end;
Та хувьсагчаа зарласны дараа үүнийгээ санах ойд өгөгдлийг
зохицуулахад
хэрэглэж болно. Энэ мэдээж танд нэг их сэтгэгдэл төрүүлэхгүй байх
гэхдээ
хэдэн жишээг танд танилцуулъя. Дараах кодын хэсэг нь X, Y гэж
зарлагдсан хувьсагчуудыг хэрэглэсэн. Мөр болгоны эцэст байгаа
тайлбар
нь юу биелж байгааг тайлбарлана.
X := 100; { ‘X’ нь одоогийн утга нь: 100 }
X := X + 50; { ‘X’ нь одоогийн утга нь: 150 }
Y := 150; { ‘Y’ нь одоогийн утга нь: 150 }
X := X + Y; { ‘X’ нь одоогийн утга нь: 300 }
Inc(X); { Нэмэгдүүлж байна. ‘X’ нь одоогийн утга нь: 301 }
Хувьсагч бол компьютерийн санах ойд байрласан хэсэг утга юм. Эрхэм
уншигч та энэ кодны тухай зарим зүйлсийг тэмдэглэж аваарай. Юуны
түрүүнд Х хувьсагчийн өөрчлөлт (Бид дараа Object Pascal хэлний
хувьсагчийг удирдах оператор, функц, процедурын тухай үзэх болно.)
Дараах хувьсагчууд нь нэмэлт, сонгогдсон утга юм.
Програмын кодын мөр бүрийн төгсгөлд цэг таслал (;) тавидаг.
САНАМЖ: Паскаль хэлийг эхлэн суралцагчид програмын кодуудын
хоорондын ялгааг мэддэг байх хэрэгтэй. (зарлагдсан өгөгдөл, утга,
хувьсагч, илэрхийлэл г.м)
c := a + b;
Дээрх жишээнд с хувьсагчид a болон b хувьсагчдийн нийлбэрийн утгыг
олгож байгаа үйлдэл болно. Энд a + b нь илэрхийлэл юм. Нэг мөрөнд
олон илэрхийлэл бичигдэж болох бөгөөд төгсгөлд нь цэг таслал
тавигдана. Зарим тохиолдолд цэг таслал тавигдахгүй байж болдог.
Үүнийг
бид дараа нь үзнэ.
Хувьсагчийн нэрийн ард хувьсагчийг тодорхойлсон төрөл бичигдэнэ.
Функц
болон процедурт хувьсагч, хувьсагчийг тодорхойлсон төрлийг зарлаж
өгдөг. Мөн хувьсагчийн нэрэнд том жижиг үсэг болон доод зураас, тоог
хольж хэрэглэж болно. Ихэнхдээ том үсгээр эхэлдэг ба харин доод
зураасаар эхлэхийг зөвшөөрдөггүй. Хэдийгээр хувьсагчийн нэр нь 255
хүртлэх тэмдэгтээс тогтож болох боловч яг үнэндээ 20 тэмдэгт ч гэсэн
ашиглахад хэцүү байдаг.
МашУртХувьсагчийнНэр : Integer; { урт хувьсагчийн нэр }
Миний_хувьсагч : Integer; { доогуур зураас ашигласан }
x : Integer; { нэг тэмдэгт ашигласан }
X : Integer; { нэг тэмдэгт ашигласан}
Тэмдэглэгээ2 : string; { үсэг болон тоо ашигласан }
САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч
чаддаггүй. Жишээ нь:
var
XPos : Integer;
{ ...later }
XPos := 20;
XPOS := 200;
xpos := 110;
XpoS := 40;
Паскаль хэл нь С ба С++ хэлтэй харьцуулахад ойлгомж
муутай байж болох юм. Гэхдээ та удахгүй үүний ялгааг олж,
ашиглаж сурах болно.
САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй
боловч та програмдаа тэмдэгт мөртэй ажиллахдаа том үсэг
ашиглаж сурах хэрэгтэй.
Обьект Паскал хэлний Өгөгдлийн төрөл
Шинээр: Объект Паскалийн өгөгдлийн төрөл нь санах ойд мэдээллийг
хадгалдаг хөрвүүлэгч /compiler/ аргыг тодорхойлсон.
Зарим програмчилалын хэлэнд хувьсагч олон төрлийн утгатай байж
болдог. Жишээ нь доорх BASIC код юм.
X = -1;
X = 1000;
X = 3.14;
BASIC хэлэнд тооны төрөл хэмжээг тааруулахын тулд санах ойн
зохицуулалтад анхаарах хэрэгтэй.
Хувьсагчийг зарлах
Паскал хэлэнд хувьсагчийг програмд ашиглахаасаа өмнө төрлийг нь
зарлаж өгөх ёстой.
var
X1 : Integer;
X : Integer;
Y : Double;
Z : Byte;
{ ...ө.х }
X1 := -1;
X := 1000;
Y := 3.14;
Z := 27;
Өгөгдлийн төрлөө зөв сонгосноор програмын үр дүн зөв гарна гэсэн үг.
Тиймээс програмаа ажиллуулахаас өмнө өгөгдлийн төрлөө сайн нягтлаж
шалгах хэрэгтэй.
Зарим өгөгдлийг signed, unsigned –аар өргөтгөж болдог. Өгөгдлийн signed
төрөл нь эерэг ба сөрөг утгыг авдаг бол unsigned төрөл нь зөвхөн эерэг
утгыг авдаг. Хүснэгт 1.1 д Паскалийн үндсэн өгөгдлийн төрлүүдийн санах
ойд эзлэх хэмжээ болон авч болох утгын хязгаарыг үзүүлэв. Хүснэгтэд
"String" буюу тэмдэгт мөрийг оруулаагүй. Харин "Strings" гэсэн дараагийн
бүлэгт авч үзнэ.
ХҮСНЭГТ 1.1. ОБЪЕКТ ПАСКАЛД АШИГЛАДАГ ӨГӨГДЛИЙН ТӨРЛҮҮД (32-BIT).
Дээрх хүснэгтэд үзүүлснээр 32 битийн орчинд Integer, LongInt төрлүүд нь
санах ойд ижил 4 байт эзлэж байна. Энэ нь Delphi 4.0 -ийн орчинд
нийцэж
байна. Харин 16 битийн орчинд Integer нь 2 байт эзлэж байхад Longint нь
4
байт эзлэдэг.
Ихэнх програмистууд LongInt –ээс илүү Integer –г өргөн хэрэглэдэг.
Мөн Int64, Comp (computational) төрөлүүд нь авч болох утгын хэмжээ
ижил
байна. Харин ялгаатай тал нь өөрсдийн дотоод хөрвүүлэлт хийдэг арга
юм.
Int64 нь integer төрөл, харин Comp нь real төрөл юм.
Real ба Double төрлүүд нь ижил юм. Delphi програмын өмнөх хувилбарт
Real төрөл нь 6 байт байсан бол одоо 8 байт болсон. Энэ өөрчлөлт нь
Real
төрлийг өнөөгийн хэв маягт ашиглах нөхцлийг бүрдүүлж өгсөн хэдий ч
Delphi програмд ашиглагдахдаа Double төрлөөс багаар ашиглагддаг буюу
хуучирсанд тооцогддог.
САНАМЖ: Windows нь 2,147,483,647 (integer –н maximum утга)
– аас илүү утга буцааж чадах GetDiskFreeSpaceEx функцыг
агуулдаг.
САНАМЖ: Single, Double, Extended, Currency өгөгдлийн
төрлүүд нь float төрөлд хамаарагдана.(10 -тийн тооллын
систем). Харин бусад төрөлтэй integer –ээр холбогддог. integer
нь бутархай тоон утгыг илэрхийлдэггүй. Жишээ нь дараахь
кодод буруу зарласан байна.
var
X : Integer;
{ Дараа нь... }
X := 3.75;
Энэ үед алдааг тань Паскал хэл тэр дор нь танд хэлж өгнө.
Харин та үүнийг мэдсэнээр float төрөл нь Windows орчинд
ямар их ашиглагдахыг анзаарах болно.
Өгөгдлийн төрлүүдийн хоорондох хөрвүүлэлт
Объект Паскаль нь өгөгдлийн төрлүүдийн хооронд хөрвүүлэлт хийж
чаддаг. Жишээ нь:
var
Res : SmallInt;
Num1 : Integer;
Num2 : Integer;
{ Дараа нь... }
Num1 := 200;
Num2 := 200;
Res := Num1 * Num2;
SmallInt дэх Integer төрөлтэй хоёр өгөгдлийг хооронд нь үржүүлж үр дүнг
нь
гаргаж байна. Энэ томъёо нь хоёр өгөгдлийн төрлийг холисон хэдий ч
Обьъект Паскаль хөрвүүлэлт хийж чадаж байна. Хариу буюу үр дүн нь -
25,536 гарна. Хүснэгт 1.1 -д үзүүлснээр SmallInt нь хамгийн ихдээ 32,767
утга авдаг. Тэгвэл энэ 32,767 дээр нэгийг нэмбэл хариу нь -32,768 болно.
Та үүнийг туршихын тулд доорхи зааврын дагуу ажилларай.
1. Шинэ проект нээж form -д label ба button -г байрлуул.
2. button дээр Double-click хийж OnClick event -ийг сонго.
3. Дараахь байдлаар бичнэ.
procedure TForm1.Button1Click(Sender: TObject);
var
X : SmallInt;
begin
X := 32767;
X := X + 1;
Label1.Caption := IntToStr(X);
end;
4. Run хийж button товчоо дар.
Label -ийн caption дээр -32768 болж өөрчлөгдснийг та харах болно.
/IntToStr функц нь integer -ийн утгыг string болгон хөрвүүлнэ./ Дээрх
дасгал
32767 нэмэх 1 тэнцүү 32768.
Дээрх жишээ нь overflow ба wrapping гэж юу болохыг харуулж байгаа юм.
Хувсагчдын утгын хувьд overflow буюу орон халилт үүсэхээргүй /ө.х
maximum -аас бага/ байх ёстой. Integer төрөл нь ойролцоогоор –2 -оос +2
тэрбумын алслалттай байдаг.
Зарим тохиолдолд Object Pascal нь хөрвүүлэлт хийж чаддаггүй. Сompiler
error нь Integer Real хоёр хоорондоо хамааралгүй төрлүүд гэж мэдээлнэ.
Сompiler error нь тодорхой төрлүүдэд хадгалагддаггүй утгуудыг зааж
өгнө.
Жишээ болгон доорх кодыг авч үзье.
var
X : Byte;
begin
X := 1000;
end;
Тогтмолыг зарлах Сompiler error –г харуулж байна. Танд Х хувьсагчийн
утгыг 1000 гэж сонгож болохгүйг Сompiler нь мэдээллэх бөгөөд учир нь Х
хувьсагч нь Byte хэмжээтэй ба Byte нь 0 - 255 хүртэл хэмжээтэй байдаг.
Зөвлөгөө: Сompilе хийхдээ санамж анхааруулга алдааны
мэдээлэл зэргийг сайтар дагах хэрэгтэй. Тэдгээр нь
програмын кодын алдаа хэрэгцээтэй зарим мэдээллүүдийг
хэлж өгдөг.
Обьект Паскалийн Оператор
Хүснэгт 1.2 Түгээмэл ашиглагддаг операторууд.
Операторуудын хувьд байнга хэрэглэгдэж байдаг хэсэг нь байхад бас
хааях ашиглагддаг операторууд ч байдаг.
Аnd, or, not зэрэг түлхүүр үгс нь логикийн болон битийн гэсэн төрөлтэй
байдаг. Жишээ нь
if (Started = True) and (X > 20) then
Z := X and Y;
Дээрх жишээнд and үйлдэл нь хоёр янзаар хэрэглэгдэнэ.
Тогтмол
Өмнө хэлсэнчлэн тогтмол нь утгын хувьд өөрчлөгдлөггүй. Хувьсагчийн
утгыг програм бичигч өөрчилж чаддаг бол тогтмолын утгыг чаддаггүй.
Тогтмолыг зарлахдаа const түлхүүр үгийг ашигладаг.
const
DefaultWidth = 400;
DefaultHeight = 200;
Description = ‘Something really cool.’;
Тогтмолыг зарлахдаа (:=) тэмдэг бус = тэмдэгийг ашигладаг. Мөн ямар ч
өгөгдлийн төрлийг онцолж заадаггүй.
Массив
Массив буюу array нь бүлэг утгын цогц гэж хэлж тодорхойлж болно.
Өөрөөр хэлбэл нэг төрөлтэй хэсэг элемент юм. Зарлах үед түүнийг санах
ойн тодорхой зайд байрлуулдаггүй ба зөвхөн заагчийн эхлэх утга
тогтоогддог. Массивыг дараах хэлбэрээр зарладаг.
var
MyArray : array[0..4] of Integer;
Integer нь 4 байтын санах ойтой учраас дээрх массивын хувьд 5
индекстэй
тул санах ойд 20 байт эзлэж байна.
MyArray массив 5 гишүүн буюу индекстэй. Индексээ дугаарлаж
тэмдэглэхдээ [ ] хаалтад бичиж өгнө. Массивийн гишүүн тус бүрд доорх
жишээнд анхны утга олгов.
MyArray[0] := -200;
MyArray[1] := -100;
MyArray[2] := 0;
MyArray[3] := 100;
MyArray[4] := 200;
Дараагийн жишээнд 3 ба 4 –р индексуудын утгуудыг хооронд нь нэмж Х
хувьсагчид олгож байна.
X := MyArray[3] + MyArray[4]; { үр дүн 300 }
Олон хэмжээст массив
Массив нь олон хэмжээст байж болно. Өөрөөр хэлбэл санах ойд мөр
мөрөөрөө дараалж ажилладаг. Хоёр хэмжээст integer төрөлтэй массив
үүсгэхийн тулд кодыг дараахь хэлбэрээр бичнэ.
var
MdArray : array[0..2, 0..4] of Integer;
Энэ массив санах ойг 60 байтаар ачаалж байна. Массивын утга нь урд нь
санах ойд байрлаж байсан санамсаргүй өгөгдөл юм. Мөн индекс нь
тэгээс
эхэлдэг. Массивийн элементүүдийг энгийн масив хэлбэрээр ашиглаж
болох ба [ ] хаалтын тусламжтай дараахь хоёр байдлаар ашиглаж болно.
Үр дүн нь ижил гарна.
X := MdArray[1][1] + MdArray[2][1];
X := MdArray[1, 1] + MdArray[2, 1];
САНАМЖ: Массивийн элементийн тооны хязгаарт байхгүй
индекс гарч ирвэл алдаа заана. Доорхи жишээнд үзүүлэв.
var
MyArray : array[0..4] of Integer;
X : Integer;
begin
X := MyArray[3] + MyArray[5]; { 5 дугаартай индекс байхгүй. }
end;
Тэгэхээр массивийн элементийн хязгаарыг анх зарлаж өгөх хэрэгтэй.
Жишээ нь 10*20 хэмжээтэй массив үүсгэе.
var
MyArray : array[10..20] of Integer;
10 баганатай 20 мөртэй хүснэгт мэтээр төсөөлье.
const
myArray : array[0..4] of Integer = ( -200, -100, 0, 100, 200 );
Их ба бага функц
Эдгээр функцуудыг массивт олон дахин ашиглаж болно. Хувьсагчийн
утгын
дээд доод хязгаарыг массивт энгийн байдлаар зарлаж өгдөг. Бага /Low/
функц нь доод хязгаараас буцах үйлдэл /return/ хийдэг. Харин Их /High/
функц нь мөн адил массивын дээд хязгаараас буцдаг.
var
X, I, Lower, Upper : Integer;
MyArray : array[10..20] of Integer;
begin
{ MyArray массивын эхний хэсэг }
Lower := Low(MyArray); { Lower нь 10 }
Upper := High(MyArray); { Upper now contains 20 }
X := 0;
for I := Lower to Upper do
X := X + MyArray[I];
{ Х хувьсагч дээр ямар нэг зүйл хийнэ. }
end;
Массивийн хязгаарын гаднах утга нь ойртоход их ба бага функц тодорхой
биш хэрэглэгддэг.
Динамик Массив
Delphi 4 -т массивийг динамикаар оруулдаг. A динамикийн массивийн
эхний хэмжээг гаднаас зарласан ба массивийг зарлах цагт хэмжээг нь
тавьж агуулдаггүй. Дараа нь SetLength -ийн хэмжээг заан хэрэглэдэг.
Жишээ нь:
var
BigArray : array of Integer; { хэмжээ олгоогүй байна }
X : Integer;
begin
X := GetArraySize; { хэрэгтэй хэмжээг тодорхойлогч функц }
SetLength(BigArray, X); { динамикаар хэмжээ тогтоож байна }
{ одоо BigArray –г хэргэлнэ}
end;
Шинээр : A динамик массив нь массиваа санах ойд ачаалдаг. A динамик
массив нь програмд их бага хэмжээгээр хэрэглэгддэг.
Массивийн индекс бүрд элемент харгалзуулан байрлуулах нь ач
холбогдолтой. Санах ойд 10 integer хангалттай байлгах хэрэгтэй гэвч
бусад нь магадгүй 1000 integer хангалттай хэрэглэдэг.
Массиваа Copy функцээр байрлуулан хэрэглэж чадна.
Жишээ нь массив нь 100 ба 200 хэмжээтэй элемент хэрэглэдэг :
Copy(BigArray, 200);
Массивдаа утгыг нь хадгалсан ба массивийн хэмжээ нь 100 -с 200
элемент
болон өссөн.
Олон хэмжээст dynamic массивыг үүсгэх нь нэг хэмжээст массивыг
үүсгэхтэй бараг адилхан байдаг. Доор 2 хэмжээст массивыг үүсгэв. Код
нь:
var
BigArray : array of array of Integer;
begin
SetLength(BigArray, 20, 20);
BigArray[0][0] := 200;
end;
Strings
Програмд String -тэй ажиллахад хэцүү. Object Pascal нь 3 string төрөлтөй:
long string, short string, ба wide string.
Нэмэлт string төрөлтөй, энэ нь төгсгөлгүй string-briefly ба
stringmanipulation
функцтэй.
Short String
Богино string төрлийн урт нь тогтмол, тэмдэгтүүдийн хамгийн их хэмжээ
нь
255 тэмдэгт байдаг. Богино string нь 1 -ээс 2 замтай ба 1 зам нь 255 byte
хэмжээтэй ShortString -д зарлагддаг.
var
S1 : ShortString; { 255 тэмдэгт }
S2 : string[20]; { 20 тэмдэгт }
String manipulation нь short төрөлтөй учир нь санах ой дахь string -ийн
хэмжээг өөрчлөхгүй. Богино string хуучин төрлийг нь бодох ба урт string
оруулна. Богино strings нь урт byte -тай учир нь string -ийн анхны элемент
нь уртаа агуулдаг. (тоо болон тэмдэгт). Short string -ийн анхны
элементийн
утга нь string -ийнхээ уртыг тодорхойлдог. Жишээ нь :
var
S : ShortString; { 255 тэмдэгт }
Len : Integer;
begin
S := ‘Hello’;
Len := Ord(S[0]);
end;
Дээрх жишээнд string -ийн уртыг S[0] утга тодорхойлж байна. Мөн
функцын
уртыг тодорхойлж чадна. Функцын урт нь bit байна.
Санамж : Ord функцын утгыг Char төрөл, integer утгаар
хувиргаж хэрэглэнэ. (дараалсан утга) Мөн Ord функц нь
жагсаалттай хамт хэрэглэгддэг.
Хэрэв та short string -ийн эхний элементийг хэрэглэх бол түүний урт нь
string байна. Тэгэхлээр програмын орчинд түүнийг хэрэглэх шаардлага
гарч ирж байна. Эхлэн суралцагч таны хувьд програм техникийн
дэвшилтэт
технологид 0 байтын short string -ийг нэмж судлахыг санал болгож байна.
Long String
long string төрөл нь string объектэд динамик байдлаар байрладаг.
Хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор
тодорхойлогддог.
Объект Паскал нь санах ойд string -ийг байршуулж бас устгаж хэрэглэдэг.
Long strings нь харин маш их уян хатан чанартай бөгөөд заримдаа short
string шиг удаан болхи мэт нарийн төвөгтэй тэмдэгтүүдээ ачаалдаг.
Хэрэв үр дүн тань шүүмжлэлтэй санагдвал long string-ийг ашиглаарай.
Динамикаар санах ойд байрлуулснаар long string нь тэмдэгт мөрийн
гарчгийг өөрчлөх боломжтой болсон Доорх жишээнд string нь түлхүүр үг,
параметрийн хэмжээгүй зарлагдсан байна.
var
S : string; { динамикаар байрласан long string }
Учир нь string нь динамикаар байрласанд оршино. Харин танд одоо
үйлдлийн хэсэгт өөрчлөлт хийж чадах боломж үлдсэн шүү. Ер нь long
string
нь хэрэглэхэд маш энгийн ба өөрөөр хэлбэл тэмдэгт мөрөө санах ойгоос
ачаалах үед зай завсар гэх мэтийн санаа зовоосон асуудал гарахгүй.
Учир
нь энэ бүгд илүүчгүй дутуучгүй бүгд автомат юм.
Long string нь 0 элементийг зөвшөөрдөггүй бөгөөд хэрэв түүнд хандвал
үр
дүн тань compiler error буюу алдаатай гарна гэсэн үг. SetLength функцийг
ашиглавал зохистой.
Wide String
Unicode төлөв байдалтай double-byte хэрэглэдэг. Windows API функцэд
хэрэглэгддэг. long string -ийн адилаар авах утгын хэмжээний хязгаар нь
зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. string объектэд
динамик байдлаар байрладаг. Үүнээс илүү деталчилсан мэдээллийг та
олж авч чадахгүй болов уу. Учир нь OLE function -той дуудуулах
хязгаартай
байдаг.
Null /хоосон/ - Төгсгөгч Strings: PChar ба Char -ын Массив
Объект Паскал нь С ба C++ хэлнүүдээс string өгөгдлийн төрлөөрөө
ялгаатай. C ба C++ -д string нь 0 нь төгсгөлийг заадаг. Мөн массивын урт
нь байтаар биш байдаг. PChar төрлийг дүүргэж хэрэглэх хэрэгтэй ба
массивын бүх төрлийг ашиглаж болдог. Жишээ нь Windows MessageBox
функц юм. Энэ функц нь Windows -ийн стандарт message мэдээллүүдийг
дэлгэц дээр гаргадаг.
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT):
Integer;
Хоёр дахь ба гурав дахь параметрүүд нь массивын элементийг заагчаар
харуулж байна.(message box текст, message box caption). Эдгээр
функцуудыг та Delphi програмаас дуудан ажиллуулж болно. PChar type -
ийн жишээ код:
var
Text : string;
Caption : string;
begin
Text := ‘Шалгаж байна.’;
Caption := ‘Текст мэдээлэл’;
MessageBox(0, PChar(Text), PChar(Caption), 0);
end;
Дээрх жишээнд Pchar -ыг Pascal -ын long string, null-terminated string
ашиглан үзүүллээ. Харин та өөрөө Pchar -ыг үргэлжүүлж судлаарай.
var
Text : PChar;
begin
Text := ‘Шалгаж байна.’;
MessageBox(0, Text, ‘Message’, 0);
end;
Pascal -ын string нь хүчирхэг төдийгүй хялбарханаар хэрэглэгдэж байна.
Та үүнээс олон удаа хэрэглэх боломж байхгүй. Pchar -ыг long string,
nullterminated
string руу хөрвүүлж болдгийг дээрх жишээ харууллаа. Төгсгөлд
нь та массивт Char төрлийн өгөгдлийг Pchar ашиглан байршуулж үйлдэл
хийж сурлаа.
var
Text : array [0..20] of Char;
begin
Text := ‘Шалгаж байна.’;
MessageBox(0, Text, ‘Message’, 0);
end;
Windows API функцийг дуудахдаа null-terminated string -ийг параметраар
ашиглавал илүү тохиромжтой.

Үндсэн Тэмдэгт мөр /String Basics/
Pascal нь нилээн хэдэн string төрлийн элементүүдтэй.
+ Operator
var
S1 : string;
S2 : string;
begin
S1 := ‘SW210 Kim’;
S2 := ‘Reisdorph’;
Label1.Caption := S1 + ‘ ‘ + S2;
end;
Дээрх кодод S1, S2 хувьсагчдийн үр дүнг label -ын Caption property –ээр
дамжуулан харууллаа. Одоо арай өөр жишээ үзье:
var
X : Integer;
begin
X := 199;
Label1.Caption := ‘The result is: ‘ + IntToStr(X);
end;
Энд IntToStr функц ашиглан 199 гэсэн тоог тэмдэгт мөр болгон
хувиргалаа.
Subscript Oператор
Тэмдэгт мөрөөс subscript ([ ]) –г ашиглан элемент бүрийг нь салган авч
болдог.
var
S1 : string;
S2 : Char;
begin
S1 := ‘Hello World!’;
S2 := S1[1];
Label1.Caption := S2;
end;
Дээрх жишээнд S2 хувьсагч нь Char төрлийн байна. Үр дүнд Н гэж
Label1.Caption дээр гарна. S[0] -ийг эхний элемент гэж long string, wide
string -үүд үздэггүй.
String -ийн контрол буюу тохируулга
Object Pascal нь String -ийн контрол буюу тохируулгыг шинээр нэвтрүүлж
өгсөн. Ихэвчлэн хэвлэдэггүй тэмдэгт мөрд ашигладаг.
Та control character хийхдээ # тэмдэг ашиглах ёстой. Доорх жишээнд
(ASCII
27) гэж тэмдэглэжээ.
S := ‘This is a test. Escape follows.’#27’ Finished.’;
S1 := ‘This is a test. Escape follows.’;
S2 := ‘Finished.’;
S3 := S1 + #27 + S2;
Эндээс та хялбархан онол гаргаж болно. Form дээрээ button, label үүсгэ.
button дээрээ Double-click /хулганаа товших/ хийж event -ийг нь OnClick
болго:
Label1.Caption := ‘Line 1’ + #10 + ‘Line 2’;
Run хийж button товч дээрээ дар. Label 2 шугамаар мэдээллээ гаргадаг
гэдгийг та одоо мэдэж авлаа. Дээрх кодын хувьд (ASCII 10) -ыг 2
шугамаар
үзүүлхэд ашиглаж байна.
Том хэмжээний текстэн мэдээлэлийг нэг шугамаар авч болно.
(ойролцоогоор 200 орчим тэмдэгт орсон үед) Delphi Code Editor нь
хамгийн
ихдээ буюу 1,024 тэмдэгтээс тогтож болдог. Ийм хэмжээний мэдээллийн
унших бүрэн бололцоотой гэж үздэг. Тэмдэгт мөрийн олон шугаман
хэлбэрийг + operator -той жишээг доор үзүүлэв.
MessageBox(0, ‘Энд маш урт message ‘ +
‘that seems to go on and on forever. In order ‘ +
‘to make the code more readable the message has ‘ +
‘been split across several lines of code.’, ‘Message’, 0);
Тэмдэгт мөрийн харьцуулах үйлдэл
String нь харьцуулах операторын тусламжтай харьцуулалт хийж чаддаг.
Хүснэгт 1.3 их ашиглагддаг операторуудыг жагсаан бичив.
ХҮСНЭГТ 1.3. ТЭМДЭГТ МӨРИЙН ХАРЬЦУУЛАХ ОПЕРАТОР.
Эдгээр операторууд нь ASCII кодоор
харьцдаг. Мөн үйлдэлд биелэгдэх
дарааллаараа ялгагдана. Тэнцүү үйлдлийн буруу ашигласан жишээ:
if FileName = ‘TEST.TXT’ then
OpenFile(FileName)
else
ReportError;
String-Manipulation ФУНКЦ
Ихэвчлэн ашиглагддаг функцуудын тайлбарыг доорх 1.4 хүснэгтэд
үзүүлэв.


ХҮСНЭГТ 1.4. ТЭМДЭГТ МӨРИЙН ФУНКЦ БА ПРОЦЕДУРУУД
САНАМЖ: Нэмэлт функцуудын талаар мэдээллийг Delphi
програмын help руу орж additional дотроос олж аварай.

Одоо жишээн дээр StrToInt function туршиж үзье.
Value := StrToInt(Edit1.Text);
Өөр StrToXXX функц (StrToFloat, StrToDate гэх мэт) дээрх замын дагуу
ажиллана.
Format function нь тэмдэгт мөр ба нэмэлт аргументэд хэвшүүлэлт хийдэг.
Доорх жишээн дээр үр дүнг нь үзье.
var
S : string;
X : Integer;
begin
X := 10 * 20;
S := Format(‘Үр дүн: %d’, [X]);
Label1.Caption := S;
end;
Үр дүн: 200
Энэ жишээнд %d тэмдэгт нь integer утгыг илэрхийлж байна. Мөн бусад
тэмдэгтэй хувьсагчаар дамжуулан ажиллана. Жишээ нь:
var
X : Integer;
Y : Integer;
begin
X := 20;
Y := 5;
Label1.Caption := Format(‘%d + %d = %d’, [X, Y, X + Y]);
end;
Дэлгэцэнд үр дүн нь гарахдаа дараах байдалтай байна.
20 + 5 = 25
Энэ жишээнд label -ын Caption property –г ашиглалаа. Өмнөх болон дараа
дараагийн жишээнд ашиглаж бас болно.
"Format Strings" –н талаар илүү их мэдээлэл үзье гэвэл Delphi help -ээс
аварай.


                              Standart-компнент


Delphi программын чухал хэсэг бол компнентууд юм. Одоо Standart-
компнентийг үзье.

Standart-компнентийн Delphi програмд харагдах хэлбэр доторхи бүтцүүд:
-MainMenu :

Програмуудын цонхны дээд хэсэгт байрлах програмын үндсэн менюүг хийхэд
ашиглагдана.
Жишээ нь: Word, Excel, Media Player г.м олон програмд байдаг.



                                                              Програмы
                                                              н
                                                               үндсэн
                                                              хэсэг


             Хийгдэх дараалал:

     1.




                                      MainMenu-гээ сонгоод
                                      Form дээрээ гаргаад 2
                                      дарна...




2.




      Caption дээр нь меньюїгийн
      нэрнїїдийг дэс дараалан бичиж
Unit.pas дээр нь дараах загвараар бичинэ:

               Жишээ:
               procedure Tform1.New1Click(Sender: Tobject);
               begin

                inc (Childcount) ;
                createMDIChild (‘Untitled’+inttostr (Childcount)+’.txt') ;

               end;


               -PopupMenu :

               Mouse -ний баруун товчтой ажиллана. (мөн дээрхийн адил олон програмд
               ашиглагдана).




                                            PopupMenu




Caption дээр нь меньюїгийн
нэрнїїдийг дэс дараалан бичиж
єгнє(Copy,Paste, Close All г.м )
Unit.pas дээр нь дараах загвараар бичинэ:

                Жишээ:
                procedure TForm1.Closeall1Click(Sender: TObject);
                var
                 i : integer ;
                begin
                 for I := MDIChildCount-1 downto 0 do
                   MDIChildren[I].Close;
                end;


                -Label :

                 Тэмдэгт мөрийг гаргана.



                                             Label ашигласан




Caption дээр нь меньюїгийн
нэрнїїдийг дэс дараалан бичиж
єгнє
-Edit :

              Нэг тэмдэгт мөртэй ажиллана.
              Жишээ: Тооны машин дээр үзье.



                                                          Edit компнентийг
                                                          ашигласанэ




Text дээр нь Edit утга бичиж
єгнє




              Unit.pas дээр нь дараах загвараар бичинэ:

              Жишээ:

              procedure TForm1.Button11Click(Sender: TObject);
              begin
              edit1.Text:=edit1.Text+'1';
end;


-Memo :

Олон тэкст мөртэй ажиллана. Жишээ нь: Notepad, WordPad г.м олон програмд
ашиглагдана.



                                                    Memo
                                                    компнентийг
                                                    ашигласан




Memo -д ашиглагдах зарим командууд:
 Memo1.Lines.add(‘thestring’); -Memo -д тэмдэгт мөр нэмэх
 Memo1.Lines.Clear              -Memo -гоос устгах
 Memo1.Lines[0...]              -Memo -д тэмдэгт мөр мөрөөр нэмэх
 Memo1.Lines.Savetofile(file-ийн нэр зам) - текст файл хадгалах
Unit.pas дээр нь дараах загвараар бичинэ:

           Жишээ:

           procedure CreateMDIChild (name : string) ;
           var
            child : TChildWin ;
           Begin
            child := Tchildwin.Create(Application);
            child.caption := name ;
            if FileExists(Name) then
              Child.Memo1.Lines.LoadFromFile(Name);
           end ;


           -Button :

           Программуудын товчыг хийхэд ашиглагдана.
           Жишээ нь: Файлуудыг хадгалах комманд дээр үзье.


                                                                 Button
                                                                 компнентийг
                                                                 ашигласан




                                                        Button




Caption дээр нь меньюїгийн
нэрнїїдийг дэс дараалан бичиж
єгнє
Unit.pas дээр нь дараах загвараар бичинэ:

                Жишээ:

                procedure TForm1.Closeall1Click(Sender: TObject);
                var
                 i : integer ;
                begin
                 for I := MDIChildCount-1 downto 0 do
                   MDIChildren[I].Close;

                end;

                -CheckBox, RadioButton :

                CheckBox : Програм дээр олон сонголт хийх контрол.
                RadioButton : Програм дээр нэг л сонголт хийх контрол.

                Жишээ нь: Print -лэх тохиргооны комманд дээр үзье.




                                                                         CheckBox
                                                                         компнентийг
                                                                         ашгиласан

         RadioButtonком
         ашгиласан




Caption дээр нь меньюїгийн
нэрнїїдийг дэс дараалан бичиж
єгнє
-ListBox :

Програмжждын тэмдэгт мөртэй ажиллахад ашиглагдана.
Жишээ нь:Select хийж байгаа үйлдэл нь...



                              ListBox компнентийг
                              ашигласан




      ListBox -ийн events:
      Items              -мөрийн тоо
      Colums             -баганы тоо
      Extendedselected -нэг нэгээр нь сонголт хийх
      Multiselected     - олон олноор сонголт хийх
      Parentcolor      -эх өнгө
      Sorted             -үсгээ автоматаар эрэмблэнэ.
Unit.pas дээр нь дараах загвараар бичинэ:

Жишээ: Бүрэн хэмжээний зохиосон бичлэг

unit Umain;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
  ListBox1: TListBox;
  Button1: TButton;
  Edit1: TEdit;
  Label1: TLabel;
  Button2: TButton;
  Button3: TButton;
  procedure Button3Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button3Click(Sender: TObject);
begin
 close ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text := '' ;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
 if edit1.text = '' then
   begin
    showmessage ('Medeellee oruul.') ;
    edit1.setfocus ;
    exit ;
   end ;
 listbox1.items.add (edit1.text) ;
 edit1.text := '' ;
 edit1.setfocus ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i : integer ;
 b : boolean ;
begin
 b := false ;
 i := 0 ;

 while i < listbox1.items.count do
   if listbox1.Selected [i] then
     begin
      listbox1.Items.Delete (i) ;
      b := true ;
     end
   else
     inc (i) ;
 if not b then
   showmessage ('ustgah medeellee songo.') ;
end;
end.

Үр дүн ба Debug хийхэд:
Standart, Additional
Mainmenu
Popupmenu
       items
Label
       caption
Edit
       text
Memo
       lines
Button
Checkbox
Radiobutton
       checked

Listbox
ComboBox
       Items
Scrollbar
       Min
       Max
       position
GroupBox
RadioGroup
       Items
       Columns
Panel

Additional
Bitbtn
       Kind
       glyph
SpeedButton
       Glyph
       Flat
MaskEdit
       Editmask
String Grid
       cells
DrawGrid
Image
       Picture
       Stretch
       Transparent

Shape
        Shape
Brush
         Pen
Belev
        Shape
        style
Scrollbox
CheckListBox
        Items.checked
Spliter !StaticText Chart


Styles

fsBold
fsItalic
fsUnderline
fsStrikeout

Өөрийн стиль үүсгэх
var
Styles : TFontStyles;
begin
Styles := Styles + [fsBold, fsItalic];
end;

Memo.Font.Style = Styles;

Styles := Styles - [fsItalic];

if fsBold in Styles then
DoSomething;

Хөрвүүлэлт

Inttostr();
Strtoint();
Floattostr()
Inttohex()
Timetostr()
Datetostr()

DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
EncodeDate(Year, Month, Day: Word): TDateTime;
EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

var
AChar : Char;
AnInteger : Integer;
begin
AChar := `A';
AnInteger := Integer(AChar);
Label1.Caption := IntToStr(AnInteger);
end;


Өнөөдөр та нар энгийн Windows application -аас том Windows application
руу яаж орох талаар сурах болно. Тэр тусмаа дараахи зүйлүүдийг:
• Window хийх арга (chemeglel) : toolbar болон status bar;
• Command хийх;
• Delphi application -ийг хувьлах;
• Cursor хэрэглэх;
Windows Decoration -ийг хийх
Би таны байшингын цонхны гэрэл чимэглэл яриагүй. Би юу ярих вэ гэвэл
toolbars болон status bar нүүрний тухай ярна. Энэ үйл ажилгааг
ерөнхийдөө
windows decoration гэнэ. Энэ нь маш олон төрлийн жижиг хэсгээс
хамаарна.
Toolbars
Toolbars нь (мөн control bar эсвэл speedbar гэдэг) Windows program -ийн
гол
багаж юм. Хэрэглэгчид сэтгэлдээ нийцсэн юм хүсдэг ба toolbar бол
тэдний
нэг юм. Маш сайн чанрын toolbar нь доорхи зүйлүүдийг агуулсан байх
ёстой.
• Тoвчнууд нь application -ий цэсэн дээр байх ёстой.
• Боломжтой болон боломжгүй товчууд байдаг.
• Tooltips нь товчын үйл ажилгааг тайлбарладаг.
• Дэлгэцэнд аpplication -ий status bar -ийн нэмэлт заавар гарч ирнэ.
• Хасах боломж.
• Бусад удирдлагууд нь combobox -ууд эсвэл цэсийг доош нь
буулгадаг товнууд шиг байна.

Дурдсан зарим нэг өвөрмөц онцолгууд toolbar бүрт байдаггүй. Delphi -д
toolbar -ийн өвөрмөц чанар нь хялбар боловсронгуй юм. Дараагийн
”Command -аар үйл ажилгааг нэмэх” бүлэг би command яаж хийх тухай
ярна. Би toolbar товчнуудаар command яаж хийхийг дараа
үргэлжлүүлэнэ.
8 дахь өдөр “delphi application –д байгуулах” , би урд нь хэлсэнчлэн хамгийн
хялбар toolbar байгуулах бол application Wizard хэрэглэх. Чи аль хэдийн
application -aa эхэлсэн байсан ч хамаагүй application wizard хэрэглэж toolbar
байгуулна. Application -aa application wizard –тай ерөнхий болгоод,
дэлгэцийг toolbar –тай нь хамт clipboard руу хуулна, дараа нь чи өөрийнхөө
жинхэнэ application -aa дахин онгойлгоод ( application wizard –аа
хадгалахгүй ч байж болно), дараа нь clipboard –оос toolbar –ийг өөрийнхөө
application –д буулга.
Харамсалтай нь application wizard чиний бүх хэрэгтэй зүйлийг (toobar
байгуулах) чинь өгөж чадахгүй. Хамгийн бодууштай нь. Application wizard
дээр үеийн арга барил хэрэглэж toolbar байгуулдаг. Toolbar байгуулхад
бэлдэх зүйл бол toolbar бас coolbar –ийн бүрэлдхүүн юм. (win32 бүрэлдхүүнээс
олох хэрэгтэй). Одоо энэ 2 бүрэлдхүүнээс суралцъя.
CoolBar Компонент
Cool Bar бүлэгүүд (Bands)
1. Coolbar бүрэлдхүүнтэй эд нар program run –лхад байраа өөрчлөнө
бас өөр хэмжээтэй болно. Шинэ application бас доошлох (drop)
coolbar band –аас эхлэнэ.
2. Coolbar дахь drop combo box. Delphi шинэ бүлэг байгуулж combo
box –ийг тогтоож байдаг coolbar –ийн өргөнйин combo box
анхаарах.
3. Coolbar дотроо дахиж доошлуулах combo box бүрэлдхүүн хий.
Дахиж нэг бүлэг эхний бүлгийн доор байгуулагдсан байна
4. Хоёрдох бүлэгтээ mouse -ийнхоо cursor -ийг хэмжээний grip
combo box хоёрын дунд байрлуул. Cursor гарны цэгийг өөрчлөнө.
Бүлгээ хөдөлгөхөд чамд мэдэгдэнэ. (чи бас хэмжээний grip
хэрэглэж band –aa хөдөлгөж болно) тэр band -аа хөдөлгөж нөгөө
band –ийнхаа доод цэгт авайч. Нэгдэх бүлэг жижигсэж хоёрдох
бүлэгтээ зай тавьж өгнө. Тэр бүлгээ доошлуулаад coolbar
“гийнхаа дунд хэсэгт авайч. Тэгээд хэмжээний grip (sizing grip)
хэрэглэж хэмжээгээ өөрчил.
5. Одоо дэлгэцний band “аа coolbard -aa байрлуул.
6. Сool Bar дээрээ дараад autosizе “aa true болго.
7. Дараа нь coolbarn “ийнхаа доороос Memo component “ийг ол.
Align -ийг alСlient болго.
Одоо run program. Cool bar -ийн бүлгүүдийг түрш. Дээш нь доош нь
хөдөлгөж үз бас хэмжээг нь өөрчил. Чамайг band -ийг хөдөлгөх явцад
cool
bar хэмжээгээ өөрчлөх шаардалга гарч байгааг чи анхаарч байгаа биз
дээ.
Cool bar -ийн бүлгүүд Bands property луу чөлөөтэй орно. Энэ property бол
Tcoolbands, энэ нь Tcoolband -ийн жагсаалт бүрэлдэхүүнүүд. Хэрэв чи
хоёрдох бүлгийг нуухыг хүсвэл чи энгэж нууж чадна:
CoolBar.Bands[1].Visible := False;
Чи хоёр аргаар бүлгүүд нэмж болно. Чи аль хэдийн сурснаар бүлэг
байгуулахдаа coolbar -ийн аль нэг бүрэлдхүүнийн drop бүрэлдхүүн
хэрэглэж болно, бас нөгөө арга нь Bands editor хэрэглэх юм. Bands editor
хэрэглэхдээ double-click coolbar эсвэл click button Object inspector дотор
Bands propertyt -ийн хажуугийн button. Бүлэг нэмэхдээ Add button
hereglene.
Чи бас бүлэг арилгахдаа delete button хэрэглэнэ. Мove up бас move down
button -ийг хэрэглэж бүлгүүдийн дэс дарааг өөрчлөнө.
Чи bitmap property хэрэглэж бүлгийнхээ background -ийг суурьлуулана.
Дүрсийг сонгоход тэр дүрс бүлгийн зүүн талд гарна. Чи imageindex
хэргэл.
Чи байгуулахдаа бүлгийнхээ хамгийн нам бас хамгийн богино хэмжээг
тогтоохыг хүсвэл MinHeight бас MinWidth property хэрэглээрэй.
Бүлгийнхээ
хэмжээг тогтвортой байлгахын тулд FixedSize property to True гэж болго.
ToolBar Компонент
Хуучин Toolbar –аа устгах
1. Меню component-ийг дараад, Alight property-ийг All None болгон
өөрчилнө. Менюгийн дээд талаас дарсан чигээр чирээд шинэ
хэрэгсэл нэмэх зай гаргана.
2. Toolbar дээр дараад устгана.
Шинэ Toolbar нэмэх
Дахин шинэ component нэмж дахин эхлэж болно. Юуны өмнө coolbar
болон toolbar -ийг нэмэх хэрэгтэй. Энэ удаад coolbar тийм их чухал
хэрэгтэй биш, учир нь одоогоор зөвхөн нэг toolbar -тай байгаа. Гэхдээ
дараа нь toolbar нэмж болох ба үүнийгээ бодолцож төлөвлөх нь зүйтэй.
Дараах алхамуудыг гүйцэтгэнэ.
1. Form дээр (дүрс) coolbar -ийн component -ийг зөөж тавина. Энэ нь
өөрийг автоматаар form-ийн дээд хэсэгт байрлуулдаг. Property
name-ийг coolbar болгон өөрчил.
2. Coolbar-т toolbar component-ийг зөөж тавь, түүний Name property-г
maintoolbar болгон өөрчил.
3. Бүх захын хязгааруудын үзүүлэхийн тулд object inspector-т байгаа
Edgeborders property-д 2 удаа дарна. Ebtop хэлбэрийг False
болгон өөрчил. (одоо бүх edgeborder хэлбэрүүд False болно)
4. Flat property-г True болгон өөрчил. Энэ нь курсор тэдний дээгүүр
өнгөрөх бүртэл toolbar-уудад хавтгай харгалзах хэлбэрийг олгоно.
5. Coolbar дээр даран түүний Autosize property-г True болгон
өөрчилнө. Coolbar нь toolbar-ийн хэмжээгээр өөрийн хэмжээг
өөрчлөх болно.
6. Memo component дээр дараад Align property-г буцаагаад AllClient
болгон өөрчил.
Toolbar –т товч нэмэх
Одоо toolbar-д товчлуурууд нэмж эхлэе. Та хэд хэдэн товчнууд, мөн цөөхөн
завсрууд нэмж болно.
Эхний үед товчнуудгүй байх ба үүнийг дараа нь янзалж болно. Одоо
дараах алхамуудыг хийе:
1. Тoolbar дээр хулганы баруун товчоо дараад New Button -г сонго.
Ингэхэд шинэ товч toolbar дээр байрлана. Товчны Name property-г
File NewButton болгон өөрчил.
Hint Property-ийг New богоод New File үүсгээд, Show Hint-р
property-г True болго.
(Hint Code-ийг 8 дахь өдөр бичсэнээ сана. Энэ код чинь програмд
байгаа бөгөөд шинэ hint чинь шууд ажиллах болго)
2. Дахин Toolbar дээр баруун товч (маузны) дараа New Button-ийг
сонго. Ингэснээр 2 дахь товч эхний товчны баруун талд
байрлагдах болно. Name Property-ийг нь File Open Button болгон
өөрчил. Hint Property-ийг Open гээд байгаа файлаа нээ. Show Hint
property-ийг True болго.
3. Дахин товч нэм. Товчны Name property-ийг File Save Button
болгон өөрчил. Hint property-г save болгоод файлыг хадгалж show
hint property-г True болго.
Санамж: Товчнууд болон spacer-үүдийг toolbar-т нэмэхэд
toolbar-ийн сүүлийн хяналтын хэсгийн баруун талд үргэлж
байдаг.
Button-г oруулахдаа хүссэн газраа байрлуулах боломжгүй
ч дараа нь button эсвэл spacer нэмэгдэхэд дараад өөр
газар зөөж болно. Байгаа button-ууд нь шинэ button-д зай
гаргаж өгнө.
Ингээд button-г тохируулах эхний алхам дууслаа. Одоо button-ны 2 дахь
тохиргоог хийнэ. Гэхдээ үүнээс өмнө эхний тохиргоо болон 2 дахь
тохиргооны хооронд багахан завсар тусгаарлагч хэрэгтэй.
1. Toolbar-дээр баруун товчоо дараад New sepatator-ийг сонго.
Тoolbar-т тусгаарлагч бий болно.
2. Бас нэг товч нэм. Name property-г нь Edit Cut Button; Hint propertyг
Cut/cuttoclipbord болго.
3. Copy & Paste товч нэм. Нэрүүдийг болон Hint property-г
ашиглалтын дагуу нэр өг.
4. Дахин тусгаарлага оруул.
5. Help About Button товч оруул. Hint property-г About/About Scratch
pad болгон өөрчил.
6. Cut; Copy; Paste; Help товчнуудийг сонго. (Shift дарж байгаад)
Тэгээд Show Hint property-г True болгон өөрчил. Сонгосон товч
болгон өөрчлөгдөнө.
Хийсэн form чинь Figure 13.3-тай адил болох болно.
Toolbar –ийн товчыг ажилуулах
Товчлууруудыг гаргачихлаа. Одоогоор тэд ямарч үүрэг гүйцэтгэх
чадваргүй
байгаа. ОnClick-г нь тохируулаагүй байгаа. Одоо үүнийг хийцгээе:
1. Эхний товчны File New Button-ийг дараад Object Inspector -ийн
Event хуудасийг сонго. OnClick-ийн drop-down суман дээр дараад
File New Click-г сонго. Ингэснээр товчийг идэвхжүүлэх боломжтой
болно.
2. Товч бүр дээр нэгдүгээр алхамыг гүйцэтгэ. OnClick дарж сонголт
хийхдээ болгоомжтой бай.
3. Scratch Pad-д About Box-г хийгээгүй бол одоо нэгийг хий. Дараа
нь Help/About menu-д үйлдлийг зааж өг. Help about button-ий
OnClick-г татаж, Help About menu-д үйлдлийг өг.
Toolbar -ийн товчнуудад Bitmap нэмэх
Энэ Toolbar-т Ямар нэг юм дутуу байна. Glyphs нэмэх шаардлагатай.
Дараах алхамуудыг хийж Imagelist component нэм.
1. Form дээрээ Imagelist component байрлуул.
2. Form дахь Imagelist component -ийн icon дээр байруун товчоо
дараад Imagelist editor-г сонго. Imagelist editor харагдана.
3. Add товчийг дар. Сommon FilesBorland sharedImagesButtons
хавтсийг удирдлага болгон FILENAME.BMP файлыг дарж нээ.
Харилцах цонх гарч bitmap-г 2 дүрс болгон салгах уу гэсэн асуулт
гарна. Шинээр дүрснүүд маань адил өндөр өргөн нь 16 боллоо
гэсэн үг. Сонгосон дүрс чинь 16 pixel-ээс муу өргөнтэй ба
тохиромжтой хэмжээнд жижигрэх эсвэл 2 дүрсэд хуваагдана.
Дахин дуудвал Delphi-тай нэг Bitmap 2 дүрстэй хамт гарч ирнэ.
Эхний Дүрс нь хэвийн, дараах нь дутуу гарна.
4. Image list Editor-р bitmap-ийг 2 дүрс болгохдоо Yes-г дарна.
Ингэснээр 2 дүрсийг харуулна. Эхний дүрс нь л таньд хэрэгтэй.
Дутуу дүрсийг устга.
5. Add Button-г дахин дар. Fileopen.BMP файл дээр дар. Bitmap-ийн
2 дүрс болгоход Yes дар. Дутуу дүрсийг устга.
6. Товч бүр дээр 5-р алхамыг гүйцэтгэ. Дуртай Bitmap-ийг сонго.
Дүрсийн жагсаалтийг гаргаж байхдаа илүү дүрсүүдээ устгаж
байхаа мартав.
Toolbar дахь товчнуудын дарааллаар Imagelist editor дахь
дүрсүүд байрлаж байгаа эсэхийг хараарай. Ингээд 7 дүрстэй
болллоо.
7. Ok дараад Imagelist editor-г хаа.
Санамж: Imagelist editor -г нэг удаад хэд хэдэн дүрсийг зэрэг
сонгоод дүрсийн жагсаалтыг нэг дор хийж болно.
Одоо Toolbar-ийг дүрсний жагсаалттай холбож байна. Toolbar дээр Object
Inspector-т Images property-г байрлуулаад доорхи жагсаалтаас Imagelist –
г
сонго. Бүх алхмаа зөв хисэн бол таны товчнууд дүрстэй болсон байгаа.
Toolbar нэмэх бүрт Delphi автоматаар ImageIndex Property-г товчинд
зориулж оруулж өгнө. Учир нь та товч боолон дүрснүүдийг ижил
дарааллаар байрлуулсан ба товчнууд дахь glyphs зөв байх нь гарцаагүй.
Хэрвээ товч буруу байвал товчны ImageIndex property-г өөрчилж болно
эсвэл Imagelist editor-луу дахин ороод дүрс ба дүрсний жагсаалтийг
өөрчилж болно.
Санамж: Дүрсний жагсаалтын дүрсүүдийг дахин байрлуулж,
тэднийг ILE-ийн шинэ байрлалд зөөж тавь.
Glyphs товч
Одоо хэрэглэх боломжтой товчны л glyphs -тэй болно. Ажиллах
боломжгүй
товчны glyphs мөн шаардлагатай. үүнийг хийх 2 арга бий.
• Ажиллах боломжгүй glyphs-г Toolbar автоматаар бүтээх.
• Ажиллах боломжгүй Bitmap-г агуулах 2 дахь дүрсийн жагсаалтыг
товчинд зориулж бүтээх.
Үүний эхний арга нь Хамаагүй хялбар юм. Ихэнхи тохиолдолд үүнийг
хийхэд хангалттай ч заримдаа идэвхигүй товчны glyphs-г бүтээгч
алгоритм
ажиллахгүй байх тохиорлдол гардаг. (glyphs-ийн илэрхийлэл нь тодорхой
бус, зөв биш харагддаг). Учир нь товчинд хангалттай өнгө ялгах өнгө
байхгүйд байгаа юм. Энэ тохиолдолд та идэвхгүй товчны glyphs-г агуулж
буй 2 дахь дүрсний жагсаалтйг гаргаж болно. Toolbar-ын DisabledImages
property-г тохиргоог хийж идэвхигүй glyphs бүхий дүрснүүдийг
тохируулснаар үлдсэн нь автоматаар хийгдэх болно. ScratchPad-н хувьд
Toolbar-н товчнуудийг автоматаар орж байгаа цаашид хийх
шаардлагатай
зүйл үгүй.
Хуучин ScratchPad-г дахин хамт гаргаж болно. Энэ бол төслийг хадгалах
боломжтой үе юм. Хадгалсны дараа Run товчийг дарж програмыг
ажиллуул. Тэгээд товчнууд юу хийх ёстой, юу хийж байна гэдгийг хар.
Хэрэв программ ажиллахгүй бол эргэж алхам бүрээ хянаад алдааг олж
зас.
Ингээд амжилттай бол ScratchPad төслийн номын кодийг харсан нь дээр
байх.
Toolbar Tips ба Hints
7 дахь өдрийн ‘VCL components”, 8 дахь өдрийн “Delphi-д хэрэглээг бий
болгох нь” сэдвээр ярилцаж байхдаа, ScratchPad programm-д hint text
оруулж байхдаа tooltip болн hints-ийн талаар яриж байсан.
TABLE 13.1. TOOLTIP-д ХАМААТАЙ хэрэглээний PROPERT-ууд.




Дээрх Default-ийн тохируулсан хугацааны сонголт нь ихэнхи хэрэглээнд
байдаг хэдий ч та өөрийн хувилбарыг оруулах сонголттой.
TOOLBARS БA ЗӨВӨЛГӨӨ
• Хэрэглэгч хяналтын текстйиг уншиж байхад хяналтын тооltips
бүү хэрэглэ.
• Tooltip, Hint-г товч бөгөөд тодорхой байлга.
• Status bar-ны Hint-г илүү утга төгөлдөр болго.
• Хэрэглэгчдээ Hint-г хаах сонголтыг өг.
Toolbar-т өөр хяналт нэмэх
Toolbar-н бүрэлдэхүүн хэсэг бол маш өргөн хүрээтэй. Toolbar-т нэмэгдэх
хяналтын бусад төрлүүдээс хамгийн түгээмэл нь Combo Box юм. Combo
Box бүхий Toolbar үсгийн фонт солих, zoom тохируулах, сонголт хийх
гээд
боломж хязгааргүй.
Component-г Toolbar-т нэмэхдээ Component Palette-ээс component
сонгоод
toolbar дээрээ зөөж аваач. Toolbar өөрөө хаана байрлуулахаа
зохицуулна.
Шаардлагатай бол зай тусгаарлагч оруул. Нэгэнт component-г toolbar-т
оруулсан бол хэлбэр байдлыг хүссэнээрээ янзал. Нэлээд төвөгтэй мэт
боловч үнэндээ энэ бүхэн маш энгин. Windows API-г ашиглан toolbar
Combo Box-г оруулж туршиж үзээгүй бол Delphi ямар их ажлыг чин
хөнгөлж
хамгаалж байгааг та ойлгохгүй.
Dockable Toolbar
Dockable Toolbar нь байршилаа өөрчилдөг. Хулганаараа дараад өөр
байрлалд байрлуулж болно. Ихэнхи Windows -н программд dockable
toolbar
түгээмэл байдаг. Dockable toolbar бол paradox sort-ууд юм. Нэг талаар
ихэнхи хэрэглээтэй dockable toolbar хэрэглэгчид маань хүлээж бйадаг ба
энэ өвөрмөц тун дажгүй юм. Нөгөө талаар ихэнхи dochable toolbar-ууд
үйлдэл хйихэд хэрэглэгддэг. Delphi-д dochable toolbar-г хийхэд хэцүү биш
юм. Та ч үүнийг хийж чадна.
Тэмдэглэл: Үүнийг зөвхөн toolbar -ийг хийх хэргэлхэд ч
бус windows -ийн орчинд ашиглаж байна.
Dockable Toolbar -ийг хийх
Dockable toolbar хийхэд 2 алхам хийнэ.
• Dragkind-н тохиргоог DkDock дээр тавь.
• Dragmode-г тохиргоог dkAutomatic дээр тавь.
Дээрх сонголтын хийсний дараа toolbar-г дэлгцэн дээрээ хүссэнээрээ
байрлуулж болно. Гэсэнч үүнийг байнга хийх шаардлага гарахгүй.
Toolbar-г
байрлуулахад drag&drop үйлдлийг хийж чаддаг байх хэрэгтэй.
Dock Sites
Roger Waters-ийн хэлснээр “Ямарч тэнэг хүн нохойд оромж хэрэгтэйг
мэддэг” адил toolbar гарган бйарлуулах орон зай хэрэгтэй. Windows –н
орчны component-ууд нь DochSite property-н тохиргоо нь True байдаг.
Component нь голцуу TpageControl, Tcoolbar, Tcontrolbar, Tpagescroller,
Tpanel-г docksite -р хэрэглэдэг.
Дараах алхамуудыг гүйцэтгэ:
1. Хоосон форм дээр coolbar-н component-г тавь. Docksite property-г
True болго.
2. Coolbar дээр toolbar-г тавь. Toolbar-ын dragkind property -г dkDock
болгоод үүнийг dragMode property-г dmAutomatic болго. Toolbar
дээр хэд хэдэн шинэ товч бий болго.
3. 2 дахь Coolbar-н оролт дээр байрлуул. Aligh property-г dLeft
болгоод Aligh property-г True болго.
4. 3 дахь Coolbar-г байрлуул. Coolbar-ийн өргөн нь 40 pixel орчим
байна.
Одоо Програмаа ажиллуул. Toolbar -г DockSite -с DockSite -рүү зөө.
Status Bar
Status Bar нь хэрэглээг улам хэрэгцээтэй болгодог бас нэг онцлог юм.
Бүгд
биш ч ихэнхи нь Status Bar -д тус болдог.
Win32 Status Bar хяналт бүхий VCL Status Bar бүрэлдэхүүн нь Breeze -г
бүтээгч Status Bar -г хидэг. 13.2 хүснэгтэд буй мэдээллийн жагсаалтийг
нэг
харчих.
StatusBar PROPERTIES.
Дээрх хүснэгтээс харвал Status Bar энгийн ба multipanel-тай байдаг
байна.
Энгийн уу? эсвэл цогцолбор уу?
Хэрвээ Simple bar-тай байхыг хүсвэл simple panel propety-г True болго.
simple panel-ийг True эсвэл False болгосноор simple ба complex Status Bar
аль нь байхыг сонгож болно.
Complex Status Bar нь олон панелтай. Хэрвээ Status Bar хэрэглэх бол
Status Bar panel editor -ийг ашигла. Status Bar panel editor-г дуудахын тулд
panels property -н Value column дээр 2 дар. Panel нэмэхийн тулд Status
Bar
panel editor-н Add New товчийг дар. Устгахын тулд Delete Selected
товчийг
дар. Засвар хийхийн тулд панелаа сонгоод Object Inspector –н панелийн
тохиргоог хий.

NOTE: Complex bar -ны панел тус бүр TstatusPanel -н төрөл
юм.

Ихэнхи properties өөрийн тайлбартай байдаг хэдий ч цаашдын
тэмдэглэлд
2 хүчин зүйл шаардлагатай.
Text property нь панелд харуулах текстээ агуулж байдаг. Text property-г
мөн
панелийн текстийг өөрчилж байхад хэрэглэж болно. Status Bar-н
тохиргооны талаар дараа яригдах болно. Панелийн дизайн дээр текстийн
хэрэг байхгүй. Ажиллаж байхад текст өөрчлөх гэж байгаа бол psText
эсвэл
psOwnerDraw-ын алинаар нь ч Style property-г тохируулж болно. Панел
дах
текстүүд Alignment property-н зааснаар байрлана. Хэрэв Style нь
psOwnerDrawing байвал панел ямар байх талаар дараа ярилцана.
Panel-д зориулсан Width, Bevel, болон Alignment properties бол шууд
тодорхой байдаг. Дадлага хийснээр эдгээр property Status Bar-н харагдах
байдалд хэрхэн нөлөөлөхийг мэдэж болно.

Note: Status Bar panel editor -ээр дамжуулан Status Bar ямар
өөрчлөлт оруулдгийг форм дизайнер дээр харж болно.

Status Bar panel editor дээр ажиллаж байхдаа Status Bar -г харж чадна.
Хийсэн өөрчлөлт бүр чинь форм дизайнер дээр харна. Status Bar дээр
панел нэмээд дууссан бол SBPE-г форм дизайнер руу буцаж ор.

Note: Status Bar component-н panels property-г өөрчлөн
сайжруулж байхад форм дизайнер автоматаар simple panel
property-г False болгоно. Хэрэв та multiple panels-г хэрэглэж
байгаа бол simple Status Bar-тай байхыг хүсэхгүй биздээ.

Status Bar –ийн текстийг өөрчлөх
Үүнийг хийх 2 арга байна.
• Status Bar-ны simple text property-г зааврын дагуу өөрчлөнө. (Simple
 status bar) эсвэл панел тус бүрийн Text property-г (complex Status
 Bar-т)
• VCL-г автоматаар Auto Hint proprerty-г True болгохоор status bar –г
 тохируул.
Хэрэв simple status bar -тай бол status bar -ын текстийг өөрчлөх нь их
энгийн юм. Simple panel property нь True байхад status bar -д оруулах
хүссэн текстийг Simple text property-д тохируулна.
StatusBar.SimpleText := ‘This shows up in the status bar.’;
Complex bar -тай бол текст өөрчлөх нь жаахан илүү төвөгтэй байх.
Хэрвээ
complex status bar-н эхний panel-н текстийг өөрчлөхийг хүсвэл нэг
иймэрхүү
зүйл ашиглах байх.
Боловсруулсан: оюутан Б. Нямсүрэн SW01D062 Хянасан: багш Ч. Эрдэнэбат
14
Өөрөө өөртөө заах нь: Borland Delphi 4
http://www.csms.edu.mn/cheri/
StatusBar.Panels[0].Text := ‘Status Bar Text’;
Status bar component-н panels property нь Item гэж нэрлэгдэх status bar-ын
панелийн array-тай байдаг. Энэ Item-н array-д хийсэн Text property-н
элемент нь панелийн текстийн өөрчилнө. Учир нь Item бол panels object-д
default array property болдог ба та онцгойлсон заалттай Items-тэй байх
шаардлагагүй. Array 0-д сууршагдсаныг харж байгаа байхаа. status bar-
ны
эхний панел нь 0 array элементтэй байна.
Автомат status bar-ны Hint текст нь тайлбартаа их юм шаарддаггүй. Таны
хийх зүйл бол Autohint property-г True болгон явдал юм. үлдсэн нь
автоматаар хийгдэнэ.

NOTE: AutoHint-г хэрэглэсэн ч та status bar-н текстийг
зааварчлан өөрчилж болно. status bar-н текстийг та яаж ч
өөрчилж болно. Курсор текст hint-тэй component-н дээгүүр
өнгөрөх дараагийн удаад текст сонгогдоно гэдгийг мартуузай.

Owner-Drawn Status Bar Panels
Түрүүн panel-н Style property нь psText эсвэл psOwnerDraw байж болно
хэмээн хэлсэн билээ. Panel-ийн Style-ийн psOwnerDrawn болгохдоо
панелд
харагдах аливаа дүрсийг өөрөө хийж болдог. Дэлгэцэн дээр дүрс
гаргахын
тулд owner panel -г ашиглах яршигтай ажилтай боллоо гэсэн үг бишээ.
Энэ
нь та дэлгэцэн дээр status bar-нд горим төрлийн icon эсвэл bitmap гаргана
гэсэн үг. Хийх алхамууд:
1. Panel-ын Style property-г psOwnerDraw болго.
2. OnDrawPanel event –д кодыг бичиж өг.
OnDraw panel-н үйлдлүүдийг л хийх нь гол ажил юм. OnDraw panel-н
event
handler иймэрхүү харагдана.
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
Status bar-н хэмжүүр бол status bar-н заагч юм. status bar-т ер нь заагчтай
байх болно. Тиймээс multiple OwnerDrawn status bar хэрэглээгүй бол энэ
хэмжүүр хэрэггүй. Одоогоор drawing-д хэрэгтэй тусгай панелийн заагч
бол
panel property юм. Та энэ хэмжүүрийг хэрвээ status bar-таа нэгээс илүү
OwnerDrawn panel-тай бол аль panel нь drawing хэрэгтэй байгаа гэдгийг
тодорхойлохийн тулд ашиглаж болно. Rect хэмжүүр нь panel-ийн хэмжээг
ба байрлалыг агуулж байдаг. Энэ хэмжүүр нь их чухал юм. Учир нь энэ
нь
зургийн хэсийн хэмжээг яг тодорхой хэсэг юм .
OnDrawPanel event handler нь Style property-г psOwnerDraw болгох панел
тус бүрийг дуудсан. Хэрэв та зурах ганцхан панелтай бол санаа зовох
хэрэггүй. Хэрэв multiple panels зурах бол аль panel-г вэ гэдгээ
тодорхойлоод зур. Хавсралтийг харвал тодорхой ойлгох байхаа. Номны
код нь status bar-тай холбоотой зүйлсийг хийхэд тус болох хавсралт
бүхий
Statbar гэсэн нэртэй программыг багтаасан байгаа. Программыг
ажиллуулж
таны хэрэглээний status bar-г гүйцэтгэж буй tip-н эх сурвалжийг тань мэд.
Зураг 13.6-д программ хэрхэн ажиллаж байгааг харуулжээ.
Энэ программын status bar нь multiple panel-тай болохыг харж байгаа
байхаа. Дунд талын 3 panel-ууд бол OwnerDrawn юм. OVK болон EXT
тэмдэгтэй panel-ууд нь Word программ эсвэл code editor-тай төстэй
байгаа.
Overtype эсвэл Extended Selection mode зэрэг иймэрхүү төрлийн
программууд нь on ч байж магад off ч байж магад. Хэрэв mode нь on
байвал status bar-н panel дахь текст хар өнгөтэй байна. Хэрэв off байвал
текст 3 хэмжээст бүдэг харагдана. 3 дахь OwnerDrawn panel нь Windows
icon-ий нөөцийг status bar дах графикийн хэрэглээг хавсаргана.
Программыг ажиллуулж хэрхэн ажиллаж байгааг мэд. Жагсаалт 13.1
StatBar программын OnDrawPanel үйлдлийг харуулж байна.
procedure TMainForm.StatusBarDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
R : TRect;
Icon : HIcon;
begin
with StatusBar.Canvas do begin
{ Create a temporary TRect object. The Rect parameter
{ is const so we can't change it. }
R := Rect;
{ Check to see if panel 3 is the panel which needs
{ to be drawn. If so, draw an icon in the panel. }
if Panel.Index = 3 then begin
{ Load one of the stock Windows icons. This time
{ using the API is easier than using VCL. }
Icon := LoadIcon(0, IDI_HAND);
{ Draw the icon and shrink it down to 15 x 15 pixels. }
{ Center it in the panel, too. }
DrawIconEx(Handle, Rect.Left + 6, 3,
Icon, 15, 15, 0, 0, DI_NORMAL);
{ Nothing more to do. }
Exit;
end;
{ This rather lengthy if statement checks to see if
{ either the Overtype Mode or Extended Selection
{ check boxes are checked. If so, then what we need
{ to do is to draw the text twice. First, we draw it
{ in white. Then we draw it again, offset by 1 pixel,
{ in gray. The effect is a 3D disabled-text look. }
if ((Panel.Index = 1) and (OvrMode.Checked = False)) or
((Panel.Index = 2) and (ExtendedSel.Checked = False))
then begin
{ Move over and down one pixel for the offset. }
Inc(R.Left);
Inc(R.Top, 2);
{ Change the text color to white. }
Font.Color := clWhite;
{ Set the backround mode to transparent so the
{ text appears hollow and so that the white
{ text can be seen under the gray. }
Brush.Style := bsClear;
{ Draw the text using the API function DrawText. }
{ I use DrawText because it allows me to center
{ the text both horizontally and vertically within
{ the given rectangle. }
DrawText(Handle, PChar(Panel.Text), -1,
R, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
{ Set the color to gray because we're going to
{ draw the text in gray in a moment. }
Font.Color := clGray;
{ Set the rect back to the original size. }
Dec(R.Left);
Dec(R.Top, 2);
end;
{ Display the text. If the item is not disabled then
{ the default color (black) is used to draw the text. }
{ If the item is disabled, then the text color has
{ been set to gray by the code above. }
DrawText(Handle, PChar(Panel.Text), -1,
R, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;
end;
Энэ код нь сүрдмээр харагдаж болох юм. Гэвч ихэнх нь тайлбар юм. Код
нь
нилээд энгийн бөгөөд алхам бүртээ тайлбар орсон байгаа. 3D харагдаж
байгаа идэвхигүй текст нь нэг удаад цагаанаар бичигдсэнээр
боловсронгуй
болж drawing нь Slight offset-тэй саарал болно. Үр дүнд нь текст хонхойн
харагдана. Icon нь Windows API functions LoadIcon болон DrawIcon Ex-г
хэрэглэснээр гарч ирнэ. status bar panel-ийн Owner drawing эхлээд байх
хэдий ч энэ нь тийм муу эд биш гэдгийг та ойлгох болно.
Та Windows-н хэрэглээг удаан хугацааны турш бичиж магад, тэгээд status
bar-даа хэзээ ч Owner Drawing ашиглахгүй ч байж мэднэ. Хэзээ нэгэн цагт
хэрэг болвол хийхэд боломжгүй зүйл биш гэдгийг мэдэж авлаа.
Command Enabling
Command Enabling нь тухайн үеийн нөхцөл байдлаас хамаарч товчийг
биелэгдэх, үл биелэгдэх болгох процесс юм. Жишээ нь:
Текст засварлаж байх явцад ямарч текст идэвхжүүлээгүй хирнээ Cut
эсвэл
Copy товчийг дарвал ямарч команд биелэгдэхгүй. Clipboard-д ямар ч
текст
ороогүй бол Paste товч ажилдаггүйтэй адил.
Command Enabling нь тийм ч хэцүү биш. Ялангуя шинэ Delphi-н
TActionList
component-тай бол хүнд асуудал биш. Зөв хийж сурахад хугацаа
хэрэгтэй.
Учир нь та наривчлан алхам бүрт анхаарал тавих хэрэгтэй.
Command Enabling –ийг TActionList and TАction ашиглан
хэрэгжүүлэх
TAction төрлүүд Command Enabling болох таатай нөхцлийг бүрдүүлнэ.
TAction List нь component palette-г нэмэлт TAB-г олж зохицуулдаг.
Нэрнээс нь аваад үзвэл TAction Object-н жагсаалийн асуудлийг
илэрхийлж
байна. Та ямар нэг үйлдлийг бүтээлээ, тэгээд үйлдэл дээрээ тулгуурлан
ямар нөхцөлд биелэгдэх, үл биелэгдэх ёстойг тэмдэглэнэ. Үүнд
component
цэс, toolbar, context menu items г.м.
Edit/Cut –командийг авч үзье. Хамгийн багаар гэхэд үүнд зориулсан 3
үйлдэлтэй байх хэрэгтэй.
• Үндсэн цэс
• Toolbar товч
• Шуурхай цэс (popup)
Action List editor-р үйлдлээ хийнэ. Жишээ нь: Edit/Cut.
Cut нэртэй үйлдлийг хийгээд CutAction гэнэ. Тэгээд Object Inspector -ийг
ашиглан CutAction-г тэмдэглээд Action property-г үйлдлийг хийх объект
бүрт (цэс, toolbar, шуурхай цэс) хамааруулж өгөх хэрэгтэй. Ажиллуулах
явцад Cut сонголтын идэвхжүүлэхийн тулд нэг код хийчихнэ.
CutAction.Enabled := True;
Ингэснээр Cut-г биелүүлэх бүх component ажиллах болно. Идэвхигүй
болгохын тулд үйлдлийг Enabled property-г False гэж тэмдэглээд л болоо.
TAction болон TAction List-н OnUpdate үйлдэл нь командыг идэвхжүүлэх
кодийгтохиромжтой газар байрлуулна.
TAction ашиглан командыг биелүүлэх чадвартай боллоо. Дараагын хэсэгт
Scratch Pad-д командийн биеллийг нэмэх болно.
Command Enabling –ийг хэрэгжүүлэх
Эхлээд Action List component -г тохируул, дараа нь олон төрлийн
component -г action жагсаалтайд оруул. Scratch Pad программд командыг
хэрэгжүүлэе.

Тэмдэглэл: Хэрвээ та хэд хэдэн үйлдлийг хадгалахыг хүсэж
байгаа бол, үйлдлийн шинэ категори нээж болно. Шинэ
үйлдлийн категори үүсгэхийн тулд өөрийн хүссэн дурын
текстэд 1 ба түүнээс дээш үйлдлийг агуулах энгийн категори
үүсгэхийн тулд эхлээд edit үйлдлийг үүсгэнэ.

Компонентод Action –уудыг холбох
Үйлдлийн бүрэлдэхүүн хэсгийг холбох дараагийн алхам бол:
1. Menu Editor –ийг эхлүүлэхийн тулд Main Menu – н дээр 2 удаа
товш.
2. File/ save menu – г сонгоод save үйлдлийн шинж чанарыг соль.
3. File save as menu – г сонгоод, save as үйлдлийн шинж чанарыг
сонго.
4. Edit menu – руу шилжээд Cut menu-г сонго. Cut үйлдлийн шинж
чанарыг өөрчил.
5. Copy үйлдлийг ашиглаж edit menu доторх Copy Рastе үйлдэлийг
4-т заасантай адил адил замаар үйлдэлийг гүйцэтгэнэ.
6. Toolbar menu доторх File save товчийг дарж Form Designer –г
үүсгэнэ.
7. Cut ,Copy, Рastе үйлдэлийг тус тусад нь гүйцэтгэхийн тулд
Toolbar menu доторх Cut ,Copy , Рastе товчлууруудыг дарна.
8. Хэрвээ шаардлагатай бол Memo Papup menu –ний үйлдэлийн
шинж чанарыг өөрчил.
Хэрэв та үйлдэлийн шинж чанарын бүрэлдэхүүний Save үйлдлийг
гүйцэтгэх тушаал өгсөн тохиолдолд Save үйлдлийн бүрэлдэхүүн хэсэг
болох Caption. Checked. Enabled. Help context . Hint. Image. Index . Shortcut
болон Vteible – үүд нь бүгд өөрчлөгдөх болно. Ямар нэгэн үйлдэл хийхэд
түүнийг бүх бүрэлдэхүүн хэсгүүд дахин өөрчлөгдөн бичигддэг. Тиймээс та
шинэ үйлдэл хийхэд Hint болон Item index нь өөрчлөгдөнө. Энэ үйлдлийг
гүйцэтгээгүй тохиолдолд FoolBar болон Hint text буруу бичигдэх болно.
Тухайн үйлдлийн бүрэлдэхүүн хэсэг бүр түүнийг тойрон бичигдсэн байдаг.
Тодорхой үйлдэл өөрчлөгдсөн тохиолдолд, тухайн үйлдэлд хамаарагдах
бүрэлдэхүүн хэсгүүд бүгд өөрчлөгдөнө.
SaveAction.Enabled := False;

Хэрвээ ийм код гарч ирвэл Save үйлдлийг үүсэгэхэд үйлдлийн шинж
чанарын ямарч бүрэлдэхүүн хэсэг боломжгүй гэсэн үг. Энэ үйлдлийг
боломжтой болгохын тулд дараах кодыг ашигла:
SaveAction.Enabled := True;
Энэ бол маш энгйн. Учир нь дараах 2 код тэнцүү тохиолдолд Save
үйлдлийг гйүцэтгэхэд тухайн үйлдлийн бүрэлдэхүүн хэсэгт өөрийн шинж
чанар агуулагдана.
{ Үйлдлийг гүйцэтгэх нэгэн тохиолдол байна. }
SaveAction.Enabled := False;
{ Хүнд арга. }
FileSave.Enabled := False;
FileSaveBtn.Enabled := False;
Ээн жишээний зөвхөн нэгээр л та хадгалж чадна. Хэрвээта хэд хэдэн
бүрэлдэхүүн хэсгийг боломжтой эсвэл боломжгүй болгох хэрэгтэй байгаа
тохиолдолд энэ үйлдэл нь таны цагийг маш ихээр хэмнэх болно. Та шинэ
үйлдэл хийх болон түүнтэй хамааралтай хэд хэдэн бүрэлдэхүүн хэсгийг
болмжтой болгоход дээрх код маш хялбар гүйцэтгэх болно.
Scratch Pad программ руу шилжье. Cut болон copy товчлуурууд ажилlах
боломжгүй байна гэж бодъё. Memo дотор текст бичээд түүнийгээ Toolbar
доторх Cut болон copy товчлуур боломжтой болно. Memo дотор хаа нэгтээ
товшиход сонгогдсон текст дахин сонгогдох болно. Энэ тохиолдолд Cut.
copy товчлуурууд дахин ажиллах боломжгүй болно. Paste товчлуур
ажиллах боломжтой байна уу. Хэрвээ тийм бол монитор дээрх Alt + print
screen товчлуурыг дар. Энэ тохиолдолд Paste товчлуур ажиллах
боломжгүй болно. Өөр текстийг сонгоод Cut эсвэл Copy товчлуурын аль
нэгийг товш. Энэ тохиолдолд Paste товчлуур ажиллах болно. Учир нь одоо
Memo -д буулгах өөр текстийг агуулж байгаа учраас. Энэ хэрхэн ажиллах
вэ.
Хэрвээ ямар нэгэн Edit хяналтийг ажиллуулаад оруулсан тохиолдолд
түүнийг дагалдах бүх бүрэлдэхүүн хэсгүүд / TEditCopy. TеditCut. TeditPaste
/ үйлдэлтэй автоматаар ажиллах боломжтой, үгүйг гүйцэтгэх болно. Save.
Save as ангилалуудыг ажиллах боломжтой болгох командууд. Дээрх
командыг гүйцэтгэхийн тулд OnUpdate гэдгийг ашиглах хэрэгтэй. Үүнээс
OnUpdate –ийн тухай мэдээллийг авах хэрэгтэй. On Update нь таны өгсөн
командыг ажиллагаатай болгохын тулд тохирох зайгаар хангана. Таны
хүсэлтийг гүйцэтгэхэд бэлэн болсон тохиолдолд танд WM_Enteridle гэсэн
мэдээллийг илдгээх болно.
Та өөрийнхөө командыг ажиллах боломжтой болгохын тулд On Update –д
шинэ холбоо үүсгэнэ. Та командаа шалгахын тулд Memo -гийн нөхцөлийг
шалгаж Save. Save as ажиллах болмжтой болно.
On Update үйлдлийг үүсгэхэд дараах зүйлүүдийг буюу алхамуудыг
гүйцэтгэнэ.
1. Action list Editor эхлүүлээд Action бүрэлдэхүүн хэсгийг 2 удаа
товш.
2. Ажиллах боломжтой үйлдлийн жагсаалтаас Save action сонго.
Хэрвээ үйлдийн жагсаалтанд дээрх үйлдэл харагдахгүй байгаа
тохиолдолд File үйлдлийн категорийг товш.
3. On Update д Object Juspector гаргаж ирэхийн тулд Value гэсэн
товчлуурыг 2 удаа товш On Update дотор Code Editor гарч ирнэ.
4. Action list Editor байрлуул. Хэрвээ Action list Editor олж чадахгүй
байгаа тохиолдолд View / Window жагсаалтыг ашигла / үйлдлийн
жагсаалтаас Save Action –ийг сонго.
5. On Update-ийн дараагийн хуудас руу шилжихийн тулд сум зааж
байгаа хэсэгт 2 удаа товш. Жагсаалтаас Save action update –г
сонго. Энэ нь On Update, Save, save as файл ашиглах боломжой
болно.
6. Action List Editor .-ийг хаа.
procedure TMainForm.SaveActionUpdate(Sender: TObject);
begin
{ Command enabler for Save and Save As. }
SaveAction.Enabled := Memo.Modified and (Length(Memo.Lines.Text) > 0);
SaveAsAction.Enabled := SaveAction.Enabled;
{ The following two command enablers don't use actions. }
{ Instead the Enabled property of the two menu items }
{ is accessed directly. }
{ Command enabler for Select All. }
EditSelectAll.Enabled := Memo.Lines.Count > 0;
{ Command enabler for Undo. }
EditUndo.Enabled := Memo.Modified;
end;
Өмнө нь Memo text агуулж байсан, эсвэл үгүй байсан ч memo
тодорхойлогдсон байсан ч үгүй ч save action үйлдэл ажиллах боломжтой
байсан. Дээрх кодыг хэрэгжүүлснээр текст агуулж байгаа болон ажиллаж
байгаа тохиолдолд Save үйлдэл горимд ажиллах боломжой болно. Save.
Save as категори адил аргаар ажиллана.
Edit menu. Select all undo хэрэглүүр нь үйлдлийг ажилгаагүй байсан ч
ажиллах боломжтой.
TCommandList
Энэ бол таны өгсөн командын жагсаалтанд хараахан дурьдагдаагүй байгаа
нэмэлт тусламж юм. Дээрх нуугдмал тусламжийг харахын тулд дараах
алахмуудыг хийнэ.
1. Schatch Pad`s гол бүтцээс Main menu гэсэн тэмдэглэгээг
сонго.
2. ImageList – ийн Image – n шинж чанарыг өөрчил.
3. PopupMenu –г адил аргаар хий.
Харин одоо программ руу шилжээд File & Edit menu -г хар. Menu-nii
доторхи хэсгүүд Image Index–n шинж чанар болон түүнтэй дагалдах
үйлдлүүдийг хэвээр хадгалагдаж үлдэнэ.
Delphi Application хэвлэх
Windows - ийг ашиглагчдын өдөр тутам хийдэг үйлдэл бол хэвлэх юм. Dos -
ийн орчинд бодитоор ашиглах хэвлэлтийн боломжуудаар хангадаг. Тухайн
программ бүрийг хэвлэхэд Dos программ бүхий л боломжоор хангаж өгч
байдаг.
Delphi хүсэлтийг хэвлэхэд хэд хэдэн үе шат дамжина. Үүний тулд та эхлээд
VCL -д хэвлэлтэнд бэлтгэж сурах хэрэгтэй. Тэгсэн тохиолдолд автоматаар
бүх зүйлийг гүйцэтгэх болно. Үүнээс гадна та тусгай хэвлэх командуудыг
эзэмших болно. Хэвлэх команд Box -н доторх зүйлүүдийг судлах хэрэгтэй.
Харин дараа нь Delphi хүсэлтийг хэрхэн хэвлэхийг ярилцья.
Хэвлэх Dialog Boxes
Windows нь таны хүсэлтийг биелүүлэхэд Print & PrintSetup хангаж өгнө.
Print командыг хэвлэж эхэлэхэд ашиглана. Харин PrintSetup командыг
хэвлэлтийг дүрсэлэхэд ашигладаг.
Print Dialog Box
Print команд нь хэрэглэгч гол Menu -нээс File print командыг сонгоход гарч
ирдэг юм. Тэгээд OK товчлуурыг дарахад хэвлэж эхэлнэ. Хэрвээ Cancel
товчлуурыг дарахад команд таслагдана.
Print dialog бүрэлдэхүүн хэсэг дотор VCL -ийн Print команд гүйцэтгэх
ердийн аргаар Print dialog -г дуудаж хэвлэх үйдлийг хийж болно. Print
командыг дуудсаны дараа хэвлэх командыг дагалдаж хэдэн хувь хэвлэх,
ямар хэмжээтэй хэвлэх вэ гэсэн бүрэдлэхүүн хэсгүүд дагалдаж гарч ирнэ.
Хэвлэх хүсэлт өгсөн тохиолдолд бүх командуудыг хэвлэхэд бэлэн болгож
бүх боломжуудыг ханган өгөх хэрэгтэй.


PrintDialog PROPERTIES.
Print rage болон Print to file цонхны Print команд өгөгдсөн тохиолдолд
түүнийг хаах илүү үйлдэл хийх шаардлагагүй. Жишээ нь: Хэрэв та хэвлэх
хүсэлт өгсөн тохиолдолд From page –s To page -г хүртэл таны хэрэгтэй
гэсэн бүхнийг уншиж хэвлэх болно. ОК товчлуурыг дарахыг мартуузай.

Print Setup Dialog Box

Хэвлэх командаа өөрчлөх, хуудасны хэмжээ, тоо, боломж зэргийг
өөрчлөхөд Print setup –g ашигладаг.
Шинээр хэвлэх команд өгч байгаа тохиолдолд, Print командыг ашиглахаас
PrintSetup -г ашиглахгүй. Гэвч PrintSetup нь Print командаас хамаагүй
хялбар ашиглагддаг. PrintSetup -ийг сонгосноор Print командыг дагалддаг
бүрэлдэхүүн хэсгүүд бүгд автоматаар гүйцэтгэгдэх болно. PrintSetup
дуудаад Cancel товчийг дарвал бүх зүйл зогсох болно. Харин ОК товчийг
дарахад хийж гүйцэтгэх ёстой бүхнийг өөрөө гүйцэтгэнэ.
procedure TMainForm.FilePrintSetupClick(Sender: TObject);
begin
PrinterSetupDialog.Execute;
end;
Хялбар аргаар хэвлэх
Та ямар ч төрлийн хүсэлт шаардлага тавьсан, хэдэн зуун ширхэг ч бүгдийг
нь хэвлэх боломжтой. Эхлээд хамгийн хялбар аргыг судлаад дараа нь илүү
ажиллагаатай тооцогдох хэвлэлтийг судална.
Form –ийн хэвлэх аргууд
Хэлбэрийн агуулгыг хэвлэхэд form нь командийг дуудаж хэвлэдэг. Энэ нь
зөвхөн хэрэгтэй зүйл л хэвлэгдэнэ. Дагалдах хүрээ зэрэг нь хэвлэгдэхгүй.
Та Print Scale цонхыг хянаж байдаг 3 хэлбэрийн хэвлэх командыг сонгож
болно.
PrintScale PROPERTY



Option Тайлбар
poNone Тусгай хэмжээ шаардахгүй шууд хэвлэнэ.
PoProportional Дэлгэцэн дээрх хэмжээтэй ижил хэмжээгээр хэвлэнэ.
poPrintToFit өгөгдсөн хэвлэх командын хэлбэр, хэмжээг өсгөж
хорогдуулна.
RichEdit Component
Windows тэмдэглэлийн хяналтаар орсон бүх ажлыг шууд хангах
бүрэлдэхүүн хэсэг бол RichEdit юм. RichEdit команд өгсөн тохиолдолд Print
командаар дамжиж хэвлэгдэнэ. Энэ хэвлэх команд ажиллаж байхад print
manager цонхыг ашиглаж Caption -г нэг параметр өөрөө дуудна.
RichEdit.Print(‘MyApp.exe - readme.txt’);
TIP: WindowsAPI нь ShellExecute командаар эхийг хэвлэнэ.
Жишээ нь:
ShellExecute(Handle, ‘print’, ‘readme.txt’, nil, nil, SW_HIDE);
Энэ код нь Notepad ачаалалд Readme текст нэртэй файлыг
хэвлэнэ. Дараа нь Notepad руу шилжинэ. Та Notepad
программыг үндсэн цонхон дээрээс олж харахгүй учир нь Sw_
hide загвар Show параметрд зориулагдсан байдаг.
QuickReport –дамжуулан хэвлэх
Өгөгдлийн сангийн программууд нь мэдээлэлүүдийг хэвлэхэд QuickReport -
ийг ашиглаж болно. Энэ хэсгийн гарчгуудыг бүү хойш нь тавь. Хэвлэх бол
тийм хүнд даалгавар биш юм. Багахан цаг зав, байршил л шаардах байх.
Эхлээд өөрийн хэвлэх гэж буй зүйлийнхээ хэрхэн дугаарлахыг мэдэж байх
хэрэгтэй хэд хэдэн зүйлүүдийг судлах хэрэгтэй. Дараа нь та тусгай кодийг
хайгаарай.
Device Context гэж юу вэ?
Canvas бол дээр та текст бичиж, шугам татаж зураг зурах зүйлүүдийг хийж
болдог. Саnvas –т хамаарах шинж байдлууд, жишээ нь: шулуунуудын
төрлийг сонгоход DC дээр сонгогдсон үзэгийг ашиглана. Үүний нэгэн адил
өнгө хэлбэрийг гаргах бийрийг сонгож өнгө хэлбэрийг гаргана. Учир нь
windows -т DC -ийн хязгааралагдмал байдаг. DC -ийн бүх деталуудын
талаар та VCL халхавч хэсгээс харж болно. Та хэвлэх canvas -ийг
дэлгэцийн canvas дээр таны зурсантай адил хийнэ. Энэ нь canvas -ийн
орчинтой төстэй аргаар хэвлэдэг.
TPrinter Class ба Хэвлэх Ажилгаа
VCL нь операторыг TPrinter class -аар хангахад тусалдаг. Энэ нь windows
-ийн бүх хэвлэлтийг Printer нь шулуун, график, текст болон бусад зурсан
объектуудыг хэвлэдэг canvas шинж чанартай байдаг. Энэ бол хялбархан
биш. Та Delpi программуудыг хэвлэхэд таны ашиглаж байгаа жагсаалтанд
Printer нэмэгддэг.
Printer.BeginDoc;
Printer.Canvas.TextOut(20, 20, ‘Hello There!’);
Printer.EndDoc;



TPrinter PROPERTIES.
TPrinter METHODS.




Хэрхэн ажиллуулах тухай
Print, Printer Setup -нуудыг аль хэдийг гаргаж аваад байна. Гэхдээ та
тэднийг үйлдэл хийхэд боломжтой болгох хэрэгтэй. Үүний тулд:
1. Гол меню бүрэлдэхүүн дээр 2 удаа товшиж Menu -ийг гаргаж ир.
2. Menu designer доторхscratch menu -нээс File printer сонго.
3. File printer set up menu -г сонгоод Scratch menu- г хаа.
4. Print dialog - ийг байрлуулаад нэрийг нь өөрчил.
FilePrintClick METHOD.
procedure TMainForm.FilePrintClick(Sender: TObject);
var
I : Integer;
LineHeight : Integer;
LinesPerPage : Integer;
LineCount : Integer;
R : TRect;
S : string;
begin
{ Display the Print dialog. }
if PrintDialog.Execute then begin
{ Set the title for the printer object. }
Printer.Title := ‘ScratchPad – ‘ + OpenDialog.FileName;
{ Set the printer font to the same font as the memo. }
Printer.Canvas.Font := Memo.Font;
{ Determine the line height. Take the Size of the
{ font and and use the MulDiv function to calculate
{ the line height taking into account the current
{ printer resolution. Use the Abs function to get
{ the absolute value because the result could be a
{ negative number. After that add 40% for leading. }
LineHeight := Abs(
MulDiv(Printer.Canvas.Font.Size,
GetDeviceCaps(Printer.Handle, LOGPIXELSY), 72));
Inc(LineHeight, (LineHeight * 4) div 10);
{ Determine how many lines will fit on a page. Trim
{ it back by three lines to leave some bottom margin. }
LinesPerPage := (Printer.PageHeight div lineHeight) - 4;
{ Start printing on line 4 rather than line 0 to leave
{ room for the header and to allow for some top margin. }
LineCount := 4;
{ Tell Windows we're starting and print the header. }
Printer.BeginDoc;
R.Top := LineHeight;
R.Left := 20;
R.Right := Printer.PageWidth;
R.Bottom := LineHeight * 2;
DrawText(Printer.Handle,
PChar(OpenDialog.FileName), -1, R, DT_CENTER);
{ Loop through all of the lines and print each one. }
for I := 0 to Pred(Memo.Lines.Count) do begin
{ When we get to the bottom of the page reset the
{ line counter, eject the page, and start a new page. }
Inc(LineCount);
if LineCount = LinesPerPage then begin
PrintFooter(R, LineHeight);
LineCount := 4;
Printer.NewPage;
end;
{ Get the next string and print it using TextOut }
S := Memo.Lines.Strings[I];
Printer.Canvas.TextOut(0, LineCount * LineHeight, S);
end;
{ All done. }
PrintFooter(R, LineHeight);
Printer.EndDoc;
end;
end;
PrintFooter METHOD.
procedure TMainForm.PrintFooter(var R: TRect; LineHeight: Integer);
var
S : String;
begin
with Printer do begin
{ Build a string to display the page number. }
S := Format(‘Page %d’, [PageNumber]);
{ Set up the rectangle where the footer will be drawn. }
{ Find the bottom of the page and come up a couple of
{ lines. }
R.Top := PageHeight - (lineHeight * 2);
R.Bottom := R.Top + lineHeight;
{ Display the text using DrawText so we can center the
{ text with no fuss. }
DrawText(Handle, PChar(S), -1, R, DT_CENTER);
{ Draw a line across the page just above the `Page X' text. }
Canvas.MoveTo(0, R.Top - 2);
Canvas.LineTo(R.Right, R.Top - 2);
end;
end;
Bitmap –ийг хэвлэх
Bitmap хэвлэхэд хялбар. Хийх шаардлагатай зүйл бол Bitmap -ийн
шаардах жишээг шинээр бий болгоод объект руу ачааллаад canvas ийн
dra method - ийг ашиглаж хэвлэгч рүү илгээнэ.
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(‘test.bmp’);
Printer.BeginDoc;
Printer.Canvas.Draw(20, 20, Bitmap);
Printer.EndDoc;
Bitmap.Free;
end;
Cursors –ийг ашиглах
Курсорийг ашиглахад хэцүү биш. Гэхдээ та бүхэнд хэрхэн ажиллах үндсэн
ойлголтыг өгье.
Cursor –ийн үндсэн үзүүлэдтүүд
Эхлээд та курсорыг ердийн бүрдэл, хэлбэр эсвэл таны бичиг баримтын
бүсэд нэвтэрэхэд ашиглана. Хэрвээ та бичиг эх рүү нэвтрэх курсорыг
өөрчлөхийг хүсвэл, дэлгэцийн объектийн курсорын шинж чанарыг өөрчлөх
хэрэгтэй. Дэлгэцийн объект курсорын шинж чанарыг өөрчилж байхдаа та
курсорын гүйцэтгэх бүрдэлүүдийг бүрэн хангаж байгаа эсэхийг батлах нь
зүйтэй.
Курсорын удирдлага нь дэлгэцийн объектийн шаардлагын дагуу ажиллана.
Бүх курсорууд дэлгэцийн объектэд курсорын шинж чанарт багтдаг.
Курсорын шинж чанар гэдэг нь таны хүсэлтийн дагуу сонгогдох
курсоруудын жагсаалт юм.
Дэлгэцийн объектийн курсорын шинж чанарыг ашиглахын тулд ашиглах
курсорынхоо нэрийг курсорын жагсаалтанд бичнэ. Та курсорыг маш олон
шалтгаанаар өөрчилж болно. Курсор шаардлагагүй тохиолдолд эсвэл
тусгай курсор ашигладаг программ ашиглах үед эсвэл таны эхэд туслахад
зэрэгт хэрэгтэй.
Cursor –ийн хэрэглэх болон ачааллах
Хэд хэдэн курсорууд аар хангадаг. Танд сонголт хийхэд чинь зориулан
курсорын хэдэн төрлийг нэмж өгдөг. Үүнийг та хэдийд ч ашиглаж болно.
Курсорыг сольдог хамгийн тодорхой үе бол таны бичиж байгаа зүйлийн
уртсан байхад.
Хэрэглэж байгаа курсороо солихийн өмнө хадгалахад хэрэгтэй яагаад
гэвэл та аль курсорыг хэдийд ашиглахаа сайн мэдэхгүй. Хадгалсан
курсороо сүүлд нь ашиглахад танд хялбар байх болно. Та өөр хувийн
бүрэлдэхүүнээс хамааран курсороо сольж болно. Жишээ нь: зурах
программын үед зурах гэж байгаа зүйлээсээ хамаарч зургын хэрэгсэлээ
сонгосноор курсороо сольж болно.
Энэ тохиолдолд та дэлгэцийн объектийн курсорыг солих шаардлагагүй.
Учир нь меню, болон бусад дагалдах бүрэлдлүүдийг дагаад курсор
өөрчлөгддөг.
Хэрэглэгч Cursor –ыг ашиглах ба ачааллах
Хэрэглэгч курсорыг ачаалаахд цаг их шаардагдана. Дээр хэлсэнчилэн
курсорын шинж чанарт таны текстэн дээр ажиллаж чадах курсоруудын
жагсаалт гарч ирдэг. Хэрэглэгчийн шаардаж байгаа курсорыг ашиглахын
тулд хэд хэдэн үе шатыг дамжих ёстой.
1. Шинэ курсор үүсгээд болгож хадгал.
2. Өөрийн программаа болго.
3. LoadCursor ашиглаж курсороо ачаал
4. Дэлгэцийн объектийн курсорийн шинж чанарыг индексчилэн
дугаарал
5. Дэлгэцийн объектийг ашиглаж байх үед аль ч курсор ачаалагдах
боломжтой.
Дүгнэлт
Одоо чи дээд түвшний Windows -ийн ашиглалт зарим онцлог бүтцийн
тухай,
түүнийг чи өөрийн программад хэрхэн хэрэгжүүлэх талаар сурсан.
Өөрийн
зүтгэл чармайлтаар хэрэгтэй ямар ч засал чимэглэлийг хэрэгжүүлнэ.
Гэвч
түүнийг сайн ашиглаж чадахгүй. Зарим нэг тохиолдолд хэвлэх нь чухал
component -ийг байгуулхад тусалдаг ба тэдгээр хэвлэлтүүд нь гайхмаар
хялбархан. Бусад үед чи хацуйгаа шамлаад Tprinting class -тай ажилна.
Хэдийгээр тийм боловч хэвлэх нь айх зүйл биш.
Workshop
Workshop -ийн шалгах асуултууд нь чиний ойлголтыг баталгаажуулхад
туслах материал ба бэлдсэн материалууд нь чамд дадлага болж чи юу
сурсан бэ гэдгээ ашиглана. Чи шалгах асуултуудын хариуг Хавсралт А
Шалгах асуултуудын хариу -с олж чадна.
Q&A
А: Би toolbar -ийн бүх component -уудаа идвэхгүй болгож чадах уу?
Х: Чадна. Toolbar -ийн Enabled property -г False болгоно.
А: Би Tcoolbar ба Tcontrolbar бараг адилхан зүйл хийдэг гэж
тэмдгэлсэн ба аль нэгийг нь л хэрэглэх ёстой юу?
Х: Миний зөвөлгөө бол Tcontrolbar -г ашигласан нь дээр. Олон
хувилбарууд нь Microsoft -ийн удирдах бааз COMCTRL32.DDL
байдаг.



MDI Form, MDI child form


Formstyle
MDIchild
      MDIform
      Normal
      Stayontop
ActiveMDIChild
MDIChildren[interger]
MDIChildCount



procedure TMainForm.Cascade1Click(Sender: TObject);
begin
Cascade;
end;

procedure TMainForm.Tile1Click(Sender: TObject);
begin
Tile;
end;

ArrangeIcons;


procedure TChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

project option
        forms
                 auto-creat form
                 available form




Группээр нь сонгох ба зөөх


Shift and Control

Debug хийх
Run                    F9         Ажиллуулах
Parameters                        Праметр
Step Over              F8         Алхам алхамаар нь
Trace Into             F7         Мөр мөрөөр
Trace to Next Source   Shift+F7
Line
Run to Cursor          F4         Мөр хүртэл ажиллуулах
Program Pause
Program Reset          Ctrl+F2
Add Watch at Cursor    Ctrl+F5    Харах цонхонд хийх
Evaluate/Modify        Ctrl+F7
Add Breakpoint                    Мөрийн эхэнд улаан тэмдэглэгээ
                                  тавиж зөв ажиллаж байна эсхийг
                                  шалгана


Win32 - н Component ууд

TabControl
       Tabs хавтасны нэрүүд нь
       TabPosition Хавтасны нэр гарах байрлал
       TabIndex идвэхтэй хавтасны дугаар
PageControl
       ActivePage Идвэхтэй хуудасны дугаар
       TabPostion хуудасны нэр гарах байрлал
       Хуудас нэмэхдээ хулганы баруун товч дээр дарж
       Бас урд дараагын хуудас руу шилжинэ.
InageList


RichEdit
       Lines
       Word wrap
Track bar
       Max
       Min
       Prequence хэд хувааж тоймлож үзүүлэх хэмжүүр
       Postion
       TrickMark хэмжүүр хаан байрлах 2 талдаа 1 талдаа
       Orientation босоо эсвэл хэвтээг сонгох
UpDown
       Max
       Min
       Position
       Orientation
       Incerment хэд хэдээр нэмэгдэхийг заана
ProgressBar
Hotkey
      Hotkey ямар товч дарадсан авна
      InvalidKeys авахгүй товчнууд
      Modifer авах товчнууд
Animate
      Active идвэхжүүлэх
      CommonAVI ихэнх Windows ашигладаг дүрсүүд
      FileName
      Start frame эхлэх
      Stop frame    төгсөх
      Repeatition хэд давтах
      Trancparent нэвт гэрэлтэх


ListBox :

Програмжждын тэмдэгт мөртэй ажиллахад ашиглагдана.
Жишээ нь:Select хийж байгаа үйлдэл нь...



                              ListBox компнентийг
                              ашигласан




         ListBox -ийн events:
         Items              -мөрийн тоо
         Colums            -баганы тоо
         Extendedselected -нэг нэгээр нь сонголт хийх
         Multiselected    - олон олноор сонголт хийх
         Parentcolor      -эх өнгө
         Sorted            -үсгээ автоматаар эрэмблэнэ.
Unit.pas дээр нь дараах загвараар бичинэ:

Жишээ: Бүрэн хэмжээний зохиосон бичлэг

unit Umain;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
  TForm1 = class(TForm)
   ListBox1: TListBox;
   Button1: TButton;
   Edit1: TEdit;
   Label1: TLabel;
   Button2: TButton;
   Button3: TButton;
   procedure Button3Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
  private
   { Private declarations }
  public
   { Public declarations }
  end;

var
 Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.Button3Click(Sender: TObject);
begin
 close ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 edit1.Text := '' ;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
 if edit1.text = '' then
   begin
     showmessage ('Medeellee oruul.') ;
     edit1.setfocus ;
     exit ;
   end ;
 listbox1.items.add (edit1.text) ;
 edit1.text := '' ;
 edit1.setfocus ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i : integer ;
 b : boolean ;
begin
 b := false ;
 i := 0 ;

 while i < listbox1.items.count do
   if listbox1.Selected [i] then
     begin
        listbox1.Items.Delete (i) ;
        b := true ;
     end
   else
     inc (i) ;
 if not b then
   showmessage ('ustgah medeellee songo.') ;
end;
end.
Үр дүн ба Debug хийхэд:




TListbox
TListBox   нь    TCustomListBox-д     байдаг   ерөнхий   ажлын   горимыг
хэрэгжүүлдэг. TListBox нь TCustomListBox -с удамшсан олон property-
той боловч ямар нэгэн шинэ ажлын горимыг гаргаж чадахгүй. TlistBox нь
Item   -уудыг сонгох , нэмэх мөн устгадаг жагсаалтанд харуулахад
хэрэглэгдэнэ.
Column - Олон баганатай ListBox -ийн харагдах баганы тоог заана.
Гэхдээ энэ нь зөвхөн horizontial scrollbar -тай тохиолдолд хэрэглэгдэнэ.
Өөрөөр хэлбэл , энэ property 0 утгатай байхад ListBox нь зөвхөн нэг
баганатай бөгөөд vertical scrollbar    -тай, харин тэгээс их утгатай үед
тухайн утганд харгалзах тоотой тэнцүү баганатай , horizontial scrollbar -
тай байна гэсэн үг юм.
ExtendedSelect    - ListBox дахь Item-уудыг сонгох зориулалттай бөгөөд
MultiSelect property-той хамт ажиллана.
ExtendedSelect нь True , MultiSelect нь мөн True үед эхний тэмдэглэсэн
Item-аас дараагийн идэвхжүүлсэн       Item-ийн хоорондох   бүх Item-уудыг
тэмдэглэнэ. Мөн хулгана, SHIFT товч ашиглан дэс дараалан байрласан
Item -уудыг тэмдэглэж болно. Хэрэв дараалан байрлаагүй Item-уудыг
тэмдэглэх шаардлагатай бол CTRL товч ашиглана.
ExtendedSelect нь False , MultiSelect нь True үед SHIFT, CTRL-гүйгээр хэд
хэдэн Item-уудыг тэмдэглэж болно. Гэвч нэг үйлдлээр Item          -уудыг
тэмдэглэж чадахгүй.
Харин MultiSelect нь False үед ExtendedSelect ямар ч нөлөөгүй бөгөөд
Item -ууд тэмдэглэгдэхгүй.
SelCount - MultiSelect   True байхад ListBox дахь тэмдэглэгдсэн Item -
уудын тоог олоход хэрэглэнэ. MultiSelect нь False үед SelCount нь      -1
утгатай байна.
Sorted - True үед ListBox дахь Item-уудыг цагаан толгойн үсгийн
дараалллаар эрэмбэлнэ. Энэ үед ListBox -д шинээр нэмэгдэж байгаа
Item-ууд нь мөн эрэмбэлэгдэж орно. False байхад эрэмбэлэхгүй байгаа
байдлаар нь харуулна.
Clear – ListBox-д байгаа бүх Item-уудыг устгахад хэрэглэнэ. Хэдийгээр

стандарт ListBox-ийн Item-ууд нь String төрөлтэй боловч ListBox-ийн Clear

method-ийг хэрэглэх нь Items property-ийн Clear method-ыг хэрэглэснээс

илүү дээр байдаг.


ComboBox
    Items          -мөрийн тоо

GroupBox

RadioGroup
     Items         -мөрийн тоо
     Columns       -баганы тоо

ActionList


CheckListBox

     CheckListBox нь ерөнхийдөө ListBox-той адил боловч элементүүд нь
check box-той байдгаараа түүнээс ялгагдана. Хэрэглэгч түүнээс хэдэн ч
item сонгож болно. Өөртөө scrollbar-тай.




     Properties:
•   • AllowGrayed - Энэ нь үнэн утгатай байвал checkbox нь checked,
    unchecked, and grayed гэсэн 3 төлөвийн аль нэгэнд байж болно. Үгүй
    бол checked, эсвэл unchecked.
•   • Checked            - Аль item тэмдэглэгдсэн байгааг заана.
•   • Columns            - Баганы тоог заана.
•   • Flat         - CheckListBox нь 3 хэмжээст байдлаар харагдах
    эсэхийг заана.
•   • IntegralHeight     - CheckListbox нь гүйцэд харагдахгүй мөр
    агуулах эсэх
•   • ItemEnabled - cbGrayed төлөвийг ашиглалгүйгээр тухайн item-ийг
    идэвхитэй буюу идэвхигүй болгоно.
•   • ItemHeight - style property нь OwnerDrawFixed гэсэн утгатай
    байхад үүнийг ашиглан мөрийн өндрийг зааж өгч болно.
•   • ItemIndex - Сонгогдсон item-ийн дугаарыг заана.
•   • SelCount     - Сонгогдсон item-үүдийн тоо.
•   • Selected           - Тухайн item сонгогдсон эсэх.
•   • Sorted             - CheckListBox-ийн item-үүд нь цагаан толгойн
    дарааллаар эрэмбэлэгдсэн эсэх.
•   • State        - Тухайн item сонгогдсон, сонгогдоогүй, идэвхгүй
    төлөвийн алинд байгааг заана.
•   • Style        - Тэмдэгт мөр агуулдаг стандарт CheckListBox юм уу,
    стандарт бус юм уу гэдгийг заана.

      Events:
•   • OnClickCheck -Аль нэг item-ийн checkbox-ийг сонгоход дуудагдана.
•   •    OnDrawItem-    style property нь      OwnerDrawFixed буюу
    OwnerDrawVariable байхад ашиглаж болно.
•   • OnMeasureItem- style property нь зөвхөн OwnerDrawVariable байхад
    ашиглаж болно.



TcheckBox




Энэ зураг дээр улаанаар тойруулан үзүүлсэн icon бол Стандарт
компонент CheckBox юм.
Энэ товч нь хянах хайрцаг дарагдсан эсвэл дарагдаагүй байдгийг
илэрхийлнэ.Хэрэглэгчид сонголтуудыг A TCheckBox component
олгоно.Хэрэглэгч сонголт хийж хайрцгийг хянаж болно эсвэл сонгохгүй
байж болдог.
TCheckBox properties
AllowGrayed буюу Саарал төлөвт хянах хайрцаг нь байж болохыг
тодорхойлно.
Delphi –ийн бичлэг нь:
property AllowGrayed: Boolean; хэлбэртэй байдаг.Хэрэв энэ нь үнэн
утгатай байвал check box нь checked, unchecked, and grayed гэсэн 3
боломжит төлөвт байдаг.Хэрэв худал утгатай байвал checked and
unchecked гэсэн 2 төлөвтэй байдаг.
Доорхи жишээнд программыг ажиллуулахад эхлээд check box-ийг
шалгана.Хэрэглэгч үүн дээр дарахад the check box -нь unchecked
байна.Дахин дарахад саарал төлөвт орно.
procedure TForm1.FormCreate(Sender: TObject);
begin
 CheckBox1.AllowGrayed := True;
 CheckBox1.State := cbChecked;
end;
-Checked төлөв:
check box нь checked төлөвт байгааг заадаг.
Delphi syntax:
property Checked: Boolean;
C++ syntax:
__property bool Checked = {read=GetChecked, write=SetChecked,
stored=IsCheckedStored, default=0};
Хэрэв AllowGrayed property нь үнэн утгатай байвал та State property-ийг
илүү өргөн хэрэглэх боломжтой.
TCheckBox events:
OnEnter event
Delphi syntax:
property OnEnter: TNotifyEvent;
C++ syntax:
__property Classes::TNotifyEvent OnEnter = {read=FOnEnter,
write=FOnEnter};
OnEnter-ийг удирдлагыг идэвхтэй болгон зарим онцгой процесс
тохиолдоход ашигладаг.Энэ event нь 2 application, form-ийн хооронд
шилжихэд эсвэл удирдлагаа агуулсан application зэрэгт хэрэглэгддэггүй.
Хэрэв тусдаа 2 агуулгатай удирдлагын хооронд шилжих тохиолдолд энэ
нь агуулсан удирлагын өмнөх удирлагад тохиолдоно.
OnExit event үүнтэй адил байдаг.
Жишээлбэл:ОК товч, group box-нь 3 radio button-тай form байдаг гэж
үзье.Тэгээд аль нэг radio button дээр нь дарахад OnExit болдог ба
OnEnter event –нь зайлшгүй дагаж хамт байдаг ба заавал дарагддаг
байна.ОК дээр дарахад OnExit event болох ба заавал нэг нэгтэйгээ хамт
байдаг.




GRAPHICS БА MULTIMEDIA ПРОГРАМЧЛАЛ
• Хялбар замаар Graphics хийх;
• Device context and Tcanvas;
• GDI обьектууд
o Pens, Brushes, Fonts;
o Bitmaps ба Palette;
o Region огтлох;
o Teкст зурах;
o Bitmap зурах;
o Memory Bitmap үүсгэх;
o Memory Bitmap –ийг хадгалах;
• Multimedia програмчлах
o Windows API aшиглан Wave Audio тоглуулах;
o TmediaPlayer компонент;
o MediaPlayer Properties , Methods ба Events
o Wave Audio
o Гаралтын volume –г тохируулах;
o Wave Audio –г бичиж авах;
• MIDI Audio;
• CD Audio;
• AVI Video;
Graphics and Multimedia нь програмын дээд түвшнийг төлөөлдөг.
Өнөөдрийн энэ сэдэвт та нар Graphics ба Multimedia –г Delphi хэл дээр
програмчлах тухай үзэж танилцана. Graphics –ийг програмчлахын тулд
ямар ч гэсэн TCanvas TBitmap классуудын тухай нилээд хэдэн зүйлийг
мэдэх хэрэгтэй. Би та нарт Delphi хэл дээр Graphics –г үзүүлэх хялбар
аргаас эхэлье. Үүний дараа та нар Windows Graphics Device Interface
(GDI)–ийн тухай мөн түүний компонентуудынх тухай мэдэж, хийж
сурна. Одоо бид олон төрлийн хүрээ, хэлбэр дүрс зурах тогтсон дэг
журмын тухай мөн Bitmap үзүүлэх олон аргыг сурна. Харин Multimedia
програмчлах бүлгийн хэсэгт хэрхэн Windows API -аар дуут файл
тоглуулах тухай үзнэ. Мөн та нар долгионт Audio тоглуулах, MIDI
болон AVI video тоглуулахад TMediaPlayer класс хэрхэн хэрэглэгдэх
тухай сурч мэдэх болно. Иймээс эхэлцгээе.
TextRect Clipping rectangle дотор текст бичих
Эдгээр properties ба methods нь Windows Device context –ийн үүргийн
бага хэсгийг төлөөлдөг. Гэхдээ та нарт хэлэхэд Graphics -тай ажиллаж
байхад эдгээр properties ба methods 80 хувийн үүргийг гүйцэтгэдэг.
Хэдийгээр ийм боловч би TCanvas –ийн тухай ярихаасаа өмнө
Graphic’s object –ийг яаж Windows програмчлалд хэрэглэх тухай ярих
хэрэгтэй болов уу.
GDI objects
GDI –д олон төрлийн обьектууд байдаг ба эдгээр нь хэрхэн device
context функцийг тодорхойлдог бол? GDI –ийн энгийн хэрэглэгддэг
обьектууд нь Pens, Brushes, Fonts. Бусад обьектуудад Palettes,
Bitmaps, regions багтдаг. Эхлээд Pens, Brushes, Fonts –ийг үзээд дараа
нь complex object -руу орцгооё.
Pens, Brushes, ба Fonts
Pens, Brushes, Fonts нь TCanvas класст яаж хэрэглэгдэж байгааг авч
үзье.
Pens
Pen нь обьектоор тодорхойлогдсон ба шугам зурахад хэрэглэгдэнэ.
Шугам нь шулуун байх ба нэг цэгээс эхлэлтэй нэг цэгт төгсгөлтэй эсвэл
тэгш өнцөгт, эллипс, олон өнцөгтийн хүрээ байна. TCanvas классын
Pen property –аар pen –ээ оруулах ба энэ нь TPen классын жишээ юм.
Хүснэгт 12.3 TPen-ийн property- нуудыг жагсаав.




Хүснэгт 12.3 TPen properties.
Эдгээр шинж чанаруудыг та хүссэнээрээ тохируулна. Доорх жишээнд
улаан өнгөөр Dashed line-р харуулав.
Canvas.Pen.Color:=clRed;
Canvas.Pen.Style:=psDash;
Canvas.MoveTo(20,20);
Canvas.LineTo(120,20);
Энэ кодчилолыг формынхаа товчинд OnClick handler дээр туршиж
үзээрэй. Таныг товчин дээрээ дарахад зурагдах шулуун нь form дээр
гарах болно.
Тэмдэглэл : Энэ сэдвийн бүх жишээнүүдийг ийм байдлаар туршиж
үзсэн байх хэрэгтэй. Хэрэв та нар дээрх жишээг туршиж үзсэн бол form
–оо дээш нь зөөхөд таны зурсан шулуун арилах болно. Иймээс үүнийг
байнгын болгохыг хүсвэл form –ийн OnPaint event –д дээр шулуун
зурдаг кодоо бичиж болно. OnPaint event нь form –ийн харагдах
байдал, байршил өөрчлөгдхөд үүсээдэг.
Dashed ба Dotted pen style зөвхөн pen width –ийн утга 1 байх үед
хэрэглэгдэнэ. PsClear pen style нь line –аа устгахад хэрэглэгдэнэ.
Тэгэхдээ энэ line нь Windows GDI draw –ийн обьект болох тэгш өнцөгт,
эллипс, олон өнцөгтүүдийн эргэн тойрны хүрээг хэлж байгаа юм.
Зөвлөмж: TPen –ийн олон property -нуудыг form дээрээ Shape
component ашиглан туршиж үзээрэй. Мөн Shape –ийнхаа pen -ийн
property –г өөрчилж сайжруулаарай. TPen классын Mode шинж чанар
нь effect -үүдийн гаднах харагдах байдалд онцгой хэрэгтэй байдаг.
Brushes
Энэ нь Graphical Shape -ийн дотрох хэсгийг буюу filled area –г
төлөөлдөг. Хэрвээ та нар эллипс, тэгш өнцөгт, олон өнцөгтүүдийг
зурсан бол Brush -г ашиглан дүүргэж болно. Ихэвчлэн энэ үед Brush нь
зөвхөн өнгө байдаггүй Bitmap эсвэл pattern –ийг агуулсан байдаг. Brush
нь TCanvas class -д байдаг ба нэг property юм. Brush –аар харагдах
хэлбэрийг өөрчилж туршиж үзээрэй. Brush нь Tbrush class -ийн нэг
объект юм. TPen, TBrush class -д бичиж тэмдэглэх event, method
ерөөсөө байдаггүй. Хүснэгт 12.4 –т шинж чанаруудыг жагсааж бичив.




Property Тайлбар
Хүснэгт12.4 TPen properties.
Доорх жишээнд форм дээрээ дугуй зураад 45 градусын налуутай
зураасаар дотрохыг нь будах хэлбэрийг ашиглалаа.
Canvas.Brush.Color:=clBlue;
Canvas.Brush.Style:=bsDiagCross;
Canvas.Ellipse(20,20,220,220);




Brush -ийн хэв маягийг ашиглаж байхад түүний Color property шугмын
өнгийг өөрчилдөг ба энэ шугам нь зургийнх юм. Зарим нэг VCL
automatically forces зэрэгт background mode -ийг transparent болгодог.
Гэхдээ энэ нь pattern fill үед болно. Background mode –ийг transparent
болгоно гэдэг нь дүрсийн дэвсгэрийг цонхны дэвсгэр өнгө, хэв маяг
хэлбэртэй адил болгохыг хэлж байгаа юм.
Өмнөхөөс арай өөрөөр харагдуулъя. Өөрөөр хэлбэл дугуй дүрсийн
дэвсгэр өнгийг формынхтай адил болгож . Энийг grayscale -дээр харах
тийм амар биш гэдгийг мэдэж байна. Хэрэв background –аа тус тусд нь
тодорхойлохыг хүсвэл VCL circumvent хэрэгтэй ба API –руу шууд очно.
Энд хэрэв цагаан дэвсгэр дээр хөхөөр зураас татах кодыг үзүүлэв :
Canvas.Brush.Color:=clBlue;
Canvas.Brush.Style :=bsdiagCross;
SetBkMode(Canvas.handle,OPAQUE);
SetBkColor(Canvas.Handle, clWhite);
Canvas.Ellipse(20,20,220,220);
Одоо дэвсгэр өнгө цагаан болохыг Figure12.2 т дээрх кодчилолоор
дугуй дүрсийг харуулав.




Brush -ийн өөр сонирхолтой өвөрмөц онцлог нь Bitmap background
option юм. Доор бичигдэх кодчилол нь bitmap brush -ийн тухай их
зүйлийг хэлж өгнө:
Canvas.Brush.Bitmap:=TBitmap.Greate;
Canvas.Brush.Bitmap.LoadFromFile(‘bkgnd.bmp’);
Canvas.Ellipse(20,20,220,220);
Canvas.brush.Bitmap.Free;
Эхний мөрөнд TBitmap обьектийн үүсэж буйг Brush -ийн Bitmap
property –руу гэж тодорхойлж байна. Bitmap property нь утгаа аваагүй
үүсэж байгаа маш өвөрмөц байна. Хоёр дах мөрөнд bitmap -аа
файлаас зөөж байна. Гурав дах мөрөнд эллипс зурж байна. Энэ
мөрний дараа эллипс зурагдсан байх учраас Brush property устгагдаж
байна. Энэ үйлдэл зайлшгүй чухал юм. Учир нь VCL танд үүнийг хийж
өгөхгүй. Хэрвээ brush property устгах нь бүтэлгүй болбол таны
програмд санах ой хүрэхгүй болох магадлалтай. Доорх зурагт Bitmap
brush -аар эллипс зурсныг харуулав. Танд зарим үед заавал hollow
Brush хэрэг болно. Үүгээр background -аа харуулах болно. Hollow Brush
-аа үүсгээд түүнийхээ brush style д зөвхөн bsClear гэж өгнө. Одоо
бүгдээрээ өмнөх жишээгээ авч түүн дээрээ 2 дахь дугуйгаа дотор нь
нэмж hollow brush aшиглая.

procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Width:=1;
Canvas.Brush.Bitmap:=TBitmap.Create;
Canvas.Brush.Bitmap.LoadFromFile('bkgnd.bmp');
Canvas.Ellipse(20,20,220,220);
Canvas.Brush.Style:=bsClear;
Canvas.Pen.Width:=5;
Canvas.Ellipse(70,70,170,170);
Canvas.brush.Bitmap.Free;
end;




Хэрвээ шууд API руу очвол та өөр зүйлүүдийг хийх боломжтой болно.
Хэдийгээр ийм боловч VCL Brush class –т ихэвчлэн эдгээрийг
гүйцэтгэдэг.
Fonts
Энд ямар нэгэн шинэ зүйл байхгүй. Fonts нь TCanvas class –тай
хэрэглэдэг ба Tcanvas -ийн Fonts -оос ялгаагүй форм эсвэл бусад
компонентуудад хэрэглэгддэг. TCanvas –ийн Font property нь бусад
компонентуудын Font property -тай ижил байдаг. Canvas -т font -ийг
солихдоо зөвхөн үүнийг хийгдэг:
Canvas.Font.Name:=’Courlier New’;
Canvas.Font.Size:=14;
Canvas.Font.Style:=Canvas.Font.Style+[fsBold];
Canvas.TextOut(20,20, ‘ Testing’);
Байна. Дараа бид текст зурах хэсэг дэх fonts нь юу хийдэг болохыг авч
үзье.
Bitmaps ба Palette
Ихэнхдээ bitmaps, palettes –ууд нь хамтдаа явдаг. TBitmap class -ийг
хэрэглэж байх үед Bitmap ачаалах ба дүрслэл хийхэд хялбар байдаг.
Та нар хэдийнээ VIII бүлэгийн хичээл дээр Jumping Jack програм дахь
TBitmap –ийн үйл ажиллагааг харсан. TBitmap class нэлээд хэд хэдэн
нөхцөл байдалд өргөн хэрэглэгддэг. Дараагийн бүлэгт bitmaps зурах
болон Memory Bitmaps –ийн талаар ярих үед зарим нөхцөл байдлыг
харах болно. TBitmap class нь нэг цогц учраас би method, property
бүрийг тайлбарлаагүй болно. Palette –ийн чухал ач холбогдлыг
тайлбарлахаар жишээ авч үзүүллээ. OnPaint event handler дээр
кодчилолыг эсвэл button click event дээр хэрэглэ.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap :TBitmap;
begin
Bitmap:=Tbitmap.Create;
{ Bitmap.IgnorePalette:=True;}
Bitmap.LoadFromFile('c:co.bmp');
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End;




Програм ажиллуулахад та гоё Bitmap –ийг формаасаа харах болно.
Эдгээр мөрнүүд ойлгомжтой тул тайлбаргүй. Харин 4 дах мөрөнд VCL
–ийн Palette -ийн мэдээллийг татгалзаарай. Тэгээд дахин програмаа
ажиллуулаарай. Ингэхэд bitmap-ийн өнгө бүгд буруу худал болно.
(хэрвээ video adapter –ийнхаа display –ийг more than 256 Colors гэж
тохируулбал та энэ үр нөлөөг анзаарч чадахгүй. ) Яагаад гэвэл palette
aшиглаж чадахгүй. Харин palette bitmap -ийнхаа зөв өнгөнүүдийг
palette system -д найдвартай хувиарлаж чаддаг. Bitmap, Palette
обьектууд нь Graphics боловсруулалтад чухал үүрэгтэй оролцдог
байна.
Clipping Regions
Regions нь Canvas –ийн дэлгэцэнд зурах хэсгийг хянаж байдаг муж
юм. TCanvas class –д ClipRect property байдаг. Харин энэ нь зөвхөн
уншдаг. Clipping Regions-ийг өөрчлөхөд Windows API –г хэрэглэх
хэрэгтэй. Одоо өмнөх жишээгээ авч хэрхэн Clipping Regions work –д
бага зэрэг зураг хавсаргаж түүнийгээ өөрчилж сайжруулахыг үзье.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
Rgn: HRGN;
begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
Rgn:=CreateRectRgn(100,50,250,250);
SelectClipRgn(Canvas.Handle ,Rgn);
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End;




Одоо програмаа ажиллуулахад та зөвхөн Bitmap -ийн харагдаж байгаа
хэмжээг харах болно. SelectClipRgn функц нь Canvas Clipping Region
(хайчлах муж) –ийг тэгш өнцөгттэй адилтгаж координатыг
100,50,250,250 гэж тогтоодог. Өмнө нь bitmap -ийг хөдөлгөөнгүй
байрлалд зурсан бол одоо зөвхөн Bitmap -ийн Clipping Region –оор
хэмжээг нь тодорхойлсон нь харагдаж байна. Clipping Region –аас
гаднахыг эс зөвшөөрсөн байна. Өмнөх жишээгээ авч олон сонирхолтой
зүйл хийж өөрчиллөө. Тэгш өнцөгт Region үүсгэж байгаа мөрийг авч
оронд нь доорх мөрийг тавилаа.
Rgn:=CreateEllipticRgn(30,30,170,170);
Одоо дахин програмаа ачааллаарай. Энэ үед Bitmap circular region -
аар хязгаарлагдана.
За одоо region –ний өөр нэг төрлийг авъя:
Const
Points: array [0..3] of Point = ((X:80,Y:0) ,(X:0,Y:80), (X:80,Y:160),
(X:160,Y:80));
Var
Bitmap: TBitmap;
Rgn: HRGN;
begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile(‘c:co.bmp’);
Rgn:=CreatePolygonRgn(Points,4,ALTERNATE);
SelectClipRgn(Canvas.Handle ,Rgn);
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End
Энэ үед та олон өнцөгтийн region хэрэглэж region үүсгэж буй цэгүүдээр
массив тодорхойлнсон байна. CreatePolygonRgn функц нь цэгүүдийн
Region form цувааг үүсгэж байна. Үүн шиг хүссэнээрээ олон цэгүүдийг
хэрэглэж болно. Төгсгөлийнх нь хаагдах цэгийг онцгойлон зааж болохгүй
учир нь region автоматаар өөрөө эхлэлийн цэг төгсгөлийн цэгийг хооронд
нь холбож төгсгөдөг. Дахин програмаа ажиллуулж ямар үр дүн өгөхийг
хар.
Тэмдэглэл: Энд бичсэн кодчилолын хэсэгт хэрхэн массивын анхны утгыг
тогтоохыг харуулав. Кодчилол:
Const
Points: array [0..3] of Point
=((X:80,Y:0),(X:0,Y:80),(X:80,Y:160),(X:160,Y:80));
Энд Tpoint массивын хязгаарыг тогтоож анхны өгөгдлөөр хангаж байна.
Tpoint –д 2 талбар байдаг. X ба Y гэсэн. үүнд fieldname буюу талбарын
нэрийг жагсааж тодорхойлох цэгээр өгөгдлийг нь тогтоож өгөх . Жишээ
нь:
(X:80) Мөн X ба Y-ийн өгөгдлөөр хангагдсан биеийг хос хосоор нь
нийлүүлж бичнэ. Үүнийг 4 удаа бичсэн. Яагаад гэвэл массивт 4 элемент
байна. Массивыг зарлаж анхны утга тогтоохдоо зөвхөн ийм байдлаар
бичнэ. Та region –ийг дандаа хэрэглэхгүй ч гэсэн танд хэрэгтэй үед үнэлж
баршгүй чухал болно. Зураг боловсруулалтанд шаардлагатай зүйлүүдийг
хийж гүйцэтгэхэд хэрэг болно.
Зурах үндсэн ажиллагаа
Өмнө нь та номноос графикийн зарим үндсэн хэв маягтай тулгарч байсан
байх. Үүгээрээ та Rectangle method нь талбай ба тэгш өнцөгт зурахад
хэрэглэгддэг гэдгийг, харин Ellipse method нь дугуй ба зуйван дүрс
зурахад,
MoveTo ба LineTo -ээр хүрээ зурахдаа хэрэглэдгийг мэдсэн байгаа байх.
Мөн Arc method нум зурахад, Pie method pie-shaped objects зурахад
хэрэглэгддэг. Энэ бүгд чухамдаа үндсэн ойлголтууд юм.
Teкст зурах
Drawing text хийж сурах нь хэцүү дадлага юм. Нэмж хэлэхэд үүнд нилээд
хэдэн гоё өвөрмөц онцлогууд байдаг . Эдгээрийн талаар та нар мэдэж
авах хэрэгтэй .
TextOut ба TextRect функцууд
TextOut method canvas дээр бичих үндсэн арга болж өгдөг. Үүнд тийм ч
хэцүү юм байхгүй. Та нар зөвхөн X ба Y –ийнхаа байрлалыг зааж өгч
харагдах текстээ жишээн дээрхтэй ижил бичиж өгнө:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri');
End;




Энэ нь формын string –ийг 20,20 байрлалд гаргана. X ба Yнь гарах
текстийнхээ зүүн дээд булангаас нь байрлуулдаг. Үүнийг туршиж
үзээрэй.
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri');
Canvas.MoveTo(20,20);
Canvas.LineTo(100,20);
End;
Энэ кодчилол текстээ 20, 20 байрлалд үзүүлж, мөн шугам 100, 20 хүртэл
зурж байна. Шугам нь текстийнхаа оройноос хөндлөнгөөр зурагдсан.
TextRect method нь танд clipping rectangle -дээ текст нэмж харуулах
боломжийг олгодог. Энэ method -ийг хэрэглэж байх үедээ текстээ заавал
тодорхой хил хязгаар дотор нь багтаах хэрэгтэй. Хэрэв хязгаараас илүү
гарах юм бол хайчилдаг. Доорх жишээнд 100 -аас илүү гарсныг үзүүлж
баталж байна.
Зөвлөгөө: Хэрэв текстээ tab төгсгөлтэй бичвэл Windows API функц
TabbedTextOut-г хараарай.
TextBackground
Саарал форм дээр цагаан background –тай байсан нь сэтгэл татахгүй
байна. Text background -ийг цагаанаар тогтоосон brush -аас олж авсан. Уг
асуудлыг шийдэх 2 арга зам байна. Эхнийх нь canvas brush -ийн өнгийг
солих, дараагийнх нь text background –г transparent хийх. Text background
–
ийг өөрчлөх нь хялбар байна. Тэгэхдээ нэг асуулт байна. Ямар өнгөөр
текстийнхаа дэвсгэр өнгийг болгохоо мэдэж байна уу? Энэ нөхцөлд
текстийнхаа дэвсгэр өнгийг формынхтай ижил болгов. Үүний тулд:
Canvas.Brush.Color:=Color;
Гэж хийнэ. Энэ кодчилол нь олон нөхцөл байдалд ажиллана. Зарим үед
танд олон контрол байна. Харин та зөвхөн text transparent -ийнхаа
background -ийг өөрчлөх юм бол хялбар болно. Кодчилол нь ямар байхыг
харуулъя:
Var
OldStyle: TbrushStyle;
Begin
OldStyle:=Canvas.Brush.Style;
Canvas.Brush.Style:=bsClear;
Canvas.textOut(20,20, ‘www.csms.edu.mn/cheri’);
Canvas.brush.Style:=OldStyle;
End




Эхлээд одоогийн байгаа brush style -аа хадгална. Дараа нь brush style -
ийг
transparent дээр bsClear гэж тогтоож өгнө. Тэгээд текстээ харуулсныхаа
дараа Brush style -ийг эргээд урд нь ямар стиль байсныг тавилаа. Та
текстээ бичиж өгчихөөд өмнөх style -аа хадгалсан хэлбэрээр нь дахин
тогтоож өгнө. Энэ нь хуучин байсан brush style -ийг цаашид байх нь
зүгээр
гэж бодвол дахин тогтоож болохыг харуулав. Transparent background
хэрэглэх үед бас нэг өөр давуу тал бий. Энэ нь та хэсэг текстээ bitmap
background дээр гаргах боломжтой боллоо гэсэн үг. Харин энэ үед solid
дэвсгэр хэрэглэж болохгүй. Кодчилол нь зургийн хамт (factory.bmp file нь
Borland Shared Files 56 Color директоороор олдоно.)
procedure TForm1.Button1Click(Sender: TObject);
Var
OldStyle: TbrushStyle;
Bitmap:TBitmap;
Begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile(‘factory.bmp’);
Canvas.Draw(0,0, Bitmap);
Canvas.Font.Name:=’Arial Bold’;
Canvas.Font.Size:=13;
Oldstyle:=Canvas.Brush.Style;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(20,5,’Transparent background’);
Canvas.brush.Style:=OldStyle;
Canvas.TextOut(20,30,’solid background’);
Bitmap.Free;
end;




Энэ код нь форм дээр bitmap зурна. Дараа нь текст формд зураг нь дээр
transparent background –аар бичигдэнэ. Үр дүнг харж байхад background
transparent нь танд таалагдана. Мөн transparent background текстэнд
зураг
хавсаргана. Үүнийг уг номны XIII бүлэгт “Owner Drawn Status panels”
хэсэгт
үзнэ.
Draw Text функц
Windows API DrawText функц нь canvas дээр TextOut -аас илүү өргөн
боломжтой юм. TCanvas class -д DrawText method байдаггүй учраас
DrawText –ийг хэрэглэхдээ шууд дуудна. Эхлээд DrawText -ийн жишээг
хараад дараа нь энэ функцын тухай авч үзье.
Var
R:TRect;
begin
R:=Rect(20,20,280,80);
Canvas.Rectangle(20,20,280,80);
DrawText(Canvas.Handle,’An example of drawetext.’,-
1,R,DT_SINGLELINE or DT_VCENTER DT_CENTER);
end;
Эхлээд Rect -ийг windows API Rect функцаар анхны утга тогтоосоон
байна.
Үүний дараах мөр нь Canvas дээр rectangle буюу тэгш өнцөгтийг зурж
байна. Ингэхдээ тэгш өнцөгтийн түүн дээр зурагдах хэмжээг нь зааж өгнө.
Сүүлийн мөрөнд текст бичихдээ Drawtext функцыг дуудан бичиж байна.
Харин одоо энэ функцынхээ хоорондоо ялгаатай параметрүүдийг нь авч
үзье.
• Эхний параметр нь тухайн зургаа буюу жишээн дээрх тэгш өнцөгтөө
юун дээр зурахаа зааж өгнө.
• Хоёрдах параметрт string утга авч харагдах текстээ бичиж өгнө.
• Гуравдах параметрт зурагдах хэсгийнх тоог зааж өгнө. –1 утгатай
байвал энэ нь string-ийг бүтэнээр нь гаргана.
• Drawtext -ийн 4 дөх параметр TRect хувьсагчийг авна. Яагаад гэвэл
зарим Drawtext -ийн боловсруулалт тэгш өнцөгтийг хийхдээ
өөрчилдөг учираас энэ параметр хувьсагч авна.
• DrawText хэрхэн ажиллахыг энэ параметрт бичнэ. Параметр нь
текстээ бичих үед хэрэглэгдэх flag-ийг заана. Энэ жишээнд
DT_SINGLELINE, DT_VCENTER, DT_CENTER flag-ийг хэрэглэсэн
байна. Энэ flags нь текстийг дан шугамаар, хөндлөнгөөр нь голлуулж
гаргахыг илэрхийлж байгаа юм. Drawtext -д бараг 20 flags байдаг ба
тэдгээрийг тус тусд нь тодорхойлж болно. Би тэр болгоныг
тайлбарламааргүй байна учир нь Win 32 API –ийн online help -д
гүйцэт жагсааж бичсэн байдаг .
Өмнөх жишээндээ Drawtext функцдээ текстээ голлуулж Horizontally,
Vertically, both зэргээс нэгийг нь сонгон авсан. Та яг одоо энэ функцын ач
холбогдлыг ухаарахгүй байж магадгүй. Гэвч та хэрвээ owner drawn
components хийж эхлэхээр эсвэл own graphical compoment -aa бичиж
эхлэхээрээ хэрэгцээг нь мэдрэх болно.
procedure TForm1.Button1Click(Sender: TObject);
Var
R: TRect;
begin
R:=Rect(20,100,120,150);
DrawText(Canvas.Handle,'This text is too long.',-1, R,
DT_END_ELLIPSIS);
end;
Дээрх код ажиллахад үүсэх үр дүнд текст ингэж харагдана.
Хэрвээ та тэгш өнцөгт дотор текстээ багтахгүй урт гэж мэдвэл flag -ийг
хэрэглэж чадах боллоо. DT_CALCRECT flag нь текстийн багтаахад
хэрэглэх өндрийг боддог. Энэ flag –ийг хэрэглэж байхад харин текстээ
бичиж өгөхгүй . Windows текстийг багтаахад хэр зэрэг өндөртэй тэгш
өнцөгт байхыг хэлж өгнө. Тэгээд Windows багтах өндрөөр нь тэгш
өнцөгтийн зүүнээс эхлэн өөрчилж гүйцэтгэдэг байна. Энэ flag олон мөр
текстийг бичихэд маш чухал ач холбогдолтой байдаг. Доорх жишээнд
windows -оос текстээ багтаах тэгш өнцөгтийнхөө өндрийг асууж, тэр
өндрөөр нь тэгш өнцөгтөө зураад дээр нь текстээ бичиж байгаа
кодчилолыг бичив.
procedure TForm1.Button1Click(Sender: TObject);
Var
R: TRect;
S: string;
begin
R:=Rect(20,150,150,200);
S:='This is very long string which will '+'run into multiple lines of text';
DrawText(Canvas.Handle, Pchar(s),-1,R,DT_CALCRECT or
DT_WORDBREAK);
Canvas.Brush.Style:=bsSolid;
Canvas.Rectangle(R.Left,R.Top,R.Right,R.Bottom);
Canvas.Brush.Style:=bsClear;
DrawText(Canvas.Handle, Pchar(s),-1,R, DT_WORDBREAK);
end;




DrawText -ийн 2 дах параметр string биш текст параметр болохоор
массивын заагчийг шаарддаг учираас Pchar(s) гэж бичсэн байна.
Тэмдэглэл: Хэрэв та Delphi 1.0 –ийг ашиглаж байгаа бол String –г Pchar
луу болгохдоо StrPCopy функцыг хэрэглээрэй.
Жишээ нь:
Var
Temp: array [0..3]of Char;
R : TRect;
S : string
begin
DrawText(Canvas.Handle, StrPCopy(Temp,S), -1, R,DT_CALCRECT or
DT_WORDBREAK);
Харин Delphi 1.0 –ээс дээших хувилбаруудад бол Pchar –г өмнөх
жишээтэй
адил хэрэглээрэй . Энэ кодчилолоо формынхоо OnPaint event дээр
тавиад
програмаа ажиллуулаарай. Мөн текстийнхаа уртыг өөрчлөөд үзээрэй.

Ингэхэд энэ нь ямар ч асуудалгүй та хичнээн ихийг нэмж бичсэн ч тэгш
өнцөгт таны текстийн гаднаар хүрээлэгдсэн байх болно.
Зөвлөгөө: Хэрэв танд текст бичих олон cонголт хэрэгтэй байгаа бол
DrawTextEx функцыг хэрэглээрэй. Win32API-ийн online help –с
мэдээллийг
аваарай.
Тэмдэглэл: DrawText дээр текст бичих нь TextOut -ийг хэрэглэхээс арай
удаан байдаг. Хэрвээ таны зургийн боловсруулалт хурдан байх
шаардлагатай бол TextOutм-ийг хэрэглэх нь зохимжтой. Гэхдээ энэ 2 нь
зарчмын хувьд хоорондоо ялгаагүй юм. DrawText нь маш өргөн
хэрэглээтэй.
Bitmap зурах
Bitmap зурах нь нилээн хэцүү юм шиг санагддаг. Харин та үүнийг
үзсэнийхээ дараа маш хялбархан зүйл байна гэж бодох болно. Тэгэхээр
TCanvas –д Btmap зурахад зориулагдсан хэдэн method –ууд байдаг.
Эдгээрээс хамгийн их хэрэглэгддэг method бол Draw. Энэ нь Canvas
дээрх
гарах байрлалыг зааж өгөхөд л хангалттай. Одоо хэдэн жишээ авъя.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
end;
Энэ жишээнд өгөгдсөн зургийн файлаас TBitmap обьект үүсгэж формын
зүүн дээд буланд гаргаж үзүүлж байна. Bitmap –даа ямар ч өөрчлөлт
оруулахгүйгээр гаргаж үзүүлбэл Draw -ийг хэрэглээрэй. Хэрвээ хэмжээг
нь
өөрчилж гаргамаар байгаа бол StretchDraw method -ийг хэрэглээрэй.
Ингэхдээ Bitmap -ийнхаа гарах тэгш өнцөгтийн хэмжээг зааж өгнө. Хэрвээ
Bitmap -ийн өөрийнх нь хэмжээнээс томоор заавал зураг чинь stretched
болж гарна. Харин жинхэнэ хэмжээнээс нь багаар зааж өгвөл багасгаж
гаргах болно. Жишээ нь:
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
R: TRect;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
R:=Rect(0,0,100,100);
Canvas.StretchDraw(R,Bitmap);
Bitmap.Free;
end;
Тэмдэглэл: StretchDraw –аар bitmap -ийн жинхэнэ харагдах харьцааг
өөрчлөх гэж оролдсоны ч хэрэггүй. Яагаад гэвэл Bitmap -ийнхаа жинхэнэ
өндөр өргөнийхөө харьцааг хадгалж хамгаалсан байдаг. Мөн өөр нэг
CopyRect method байдаг. Энэ method үндсэн гарах тэгш өнцөгтийнхөө
бие
ба хуваагдах тэгш өнцөгтийнхөө очих биеийг зааж өгөхөд болно. Нэг
ёсондоо bitmap -аа хэсэгт хувааж үзүүлэх боломж өгч байгаа юм. Жнь:
Var
Bitmap: TBitmap;
Src: TRect;
Dst: TRect;
I, X, Y :Integer;
Strips: Integer;
Stripsize: Integer;
OldPal: Hpalette;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile(‘factory.bmp’);
Strips :=6;
Stripsize:=(Bitmap.Height div Strips);
OlsPal:= SelectPalette(Canvas.Handle,Bitmap.Palette,True);
For I:=0 to Pred(Strips) do begin
Src:=Rect(0,I*Stripsize)     .
Энд зургаа оруулж ирээд зурааснуудад зүсч санамсаргүйгээр байрлалыг
үзүүлж байна. Энэ кодыг өөрөө үндсэн формынхоо OnPaint handler
оруулж
туршиж үзээрэй. Тэгэхээр илүү ойлгомжтой болно. Зураг onPaint event
ажиллах болгонд зурагдах болно.
Тэмдэглэл: Өмнөх жишээнд Palette функцыг ашиглаж байхад формын
palette -ийг Bitmap Palette property –д тогтоож өгсөн. Учир нь canvas –т
Palette байдаггүй. Иймээс формдоо API -г ашиглаарай. Хэрвээ Palette -аа
тогтоож өгөөгүй бол формдээр Bitmap -ийг гарч байхад өнгө буруу гарна.
CopyRect method bitmap -ийг гаргахад бүтэц хэрэглэгддэг. Иймээс уг
функцийг хэргэлж байхад нэмэлт алхам шаардлагатай. Бас нэг өөр
bitmap
drawing method байдаг тухай дурьдахыг хүсч байна. the BrushCopy
method
үндсэн тэгш өнцөгтийн очих тэгш өнцөгт, зураг, transparent color -ийг зааж
өгөх боломжийг олгодог. Online help BrushCopy –д энэ method -ийг
хэрэглэхээсээ илүү ImageList component -ийг хэрэглэхийг зөвлөдөг.
BrushCopy method нь ImageList –ийг бодвол хэрэглэхэд хялбар, гоё
харагдуулах боловч хугацаа илүү зарцуулдаг. Хэрвээ transparent
background –тай bitmap -ийг хэрэглэж байгаа бол заавал BrushCopy -г
хэрэглээрэй.
Offscreen Bitmap
Offscreen bitmaps, мөн bitmaps memory гэж дуудаж болдог. Энэ нь
Windows
програмчлалд энгийнээр хэрэглэгддэг. Offscreen bitmaps танд зургаа
санах
ойд хадгалчихаад дараа нь Draw method –оор үзүүлэх боломж олгодог.
Offsreen Bitmaps help богино хугацаанд дэлгэцэнд гаргахын тулд
ашиглагддаг. Энэ нь олон удаа шууд зурахад гардаг анивчих үзэгдлээс
зайлсхийдэг. Мөн complex Bitmap програмчлахад маш зүгээр байдаг.
Зургаа санах ойд хадгалаад дэлгэцэнд үзүүлэхад бэлэн болгож
бэлтгэдэг.
OffscreenBitmaps Microfofts DirectX SDK animation –д хамгийн өргөн
дэлгэрсэн шинэ технологи. Offscreen Bitmap -ийн процесс 3 алхамаас
бүрдэнэ. Үүнд:
1. Bitmap memory үүсгэнэ.
2. Bitmap memory дээр зурна.
3. Bitmap memory –г дэлгэц руу хуулах.
Memory Bitmap үүсгэх
Bitmap memory (санах ой ) үүсгэх нь хялбар байдаг. Memory Bitmap –аа
үүсгэж байхад цаг тутамд TBitmap объект үүсэж байх болно. Энэ үед
memory bitmap -д файлаа хадгална. Дараа нь memory bitmap үүсгээд,
хэмжээг зааж өгч гаргана.
Жишээ нь:
Form дээр нэг button авч түүнийхээ OnClick event –д туршиж үзээрэй.
Button
дарах бүрд тэгш өнцөгт санамсаргүйгээр зурагдан дэлгэцэнд харагдах
болно. Bitmap memory хялбархан зурагдах ба canvas –т Bitmap –аа
хуулдаг. Хэрэв 256 өнгөт video adapter хэрэглэж байгаа бол өнгөнүүд
dithered болно. Учир энь жишээнд Palette хийгээгүй болно.
Тэмдэглэл: Memory Bitmap үүсгэж байхдаа Bitmap ийн өнгө video үзүүлэх
өнгөний тохиргоотой ижил байх ёстой. Хэрвээ video display 256 өнгөн
дээр
сонгосон бол Bitmap 256 өнгөтэй байна. харин 24 - 32 bit video display -
тай
бол memory bitmap 32k, 64k эсвэл 16 сая өнгөтэй байх болно.
Memory Bitmap –г хадгалах
Memory Bitmap –г хадгалахдаа SaveToFIle процедурыг дуудна.
BITMAP.SAVETOFILE(‘TEST.BMP’); Та нар програмынхаа дэлгэцийг
амархан үүсгэж чаддаг. Энэ бүгдийг та үнэндээ memory Bitmap –д
дэлгэцийнхээ хэсгийг хуулж байгаа юм.
Multimedia Programming
Multimedia programming гэдэг үг нь олон утгыг илэрхийлдэг. Учир нь
multimedia program -д боломжийн бүх өргөн хүрээг өөртөө агуулсан
байдаг.
Multimedia нь ердийн wave audio, MIDI video clips, animation зэргийг
багтаадаг. Зарим хүмүүс multimedia програмчлалыг тоглоомын
програмчлалтай андуурдаг. Тоглоомын програмчлал нь multimedia –тай
гарцаагүй холбоотой болдог. Гэвч sound, video –той илүү холбоотой.
Одоо graphics эсвэл multimedia API -ийн тухай тодорхой хэлбэл OpenGL
эсвэл DierctDraw -ийн тухай авч үзье. Graphics програмчлалын тухай их
мэдээлэлтэй ном хэрэглэвэл сайн мэргэжих болно. Delphi 4.0 Unleased
(ISBN: 0-672-312-859) ном сайн сонголт байх болно.
TMediaPlayer компонент
VCL нь хялбарханаар Multimedia удирдах MediaPlayer компонентоор
хангадаг. Энэ компонент нь Component Palette –ийн System tab -д
байрладаг. Wave files, AVI video     -г тоглуулж чадна. TMediaPlayer –ийг
хэрэглэхэд маш амархан. Зөвхөн Wave file тоглуулахын тулд би
PlaySound
функцыг өмнөх жишээнд хэрэглэсэн. Энэ контролд Play, Pause, Stop,
Next,
Previous, Step, Back, Record, Eject гэсэн button -ууд байдаг.
MediaPlayer -ийн формыг үзүүллээ.




Энэ MediaPlayer-ийг хэрэглэх маш энгийн юм. FileName property –д
multimedia файлын нэрийг оноосноор товчин дээр дарахад тоглуулж
эхэлдэг. Ингэхдээ .wave, .mid, .avi file –уудыг сонгож болно. Та
MedioPlayer -аа илүү сонирхолтой хиймээр байгаа бол сайн ухаж төвхөж
үзээрэй. Зарим нөхцөлд MediaPlayer -ийн visual control bar их зүгээр
харагддаг. Магадгүй та MediaPlayer –аа control bar (Items –гүйгээр)
хиймээр байгаа бол MediaPlayer –ийн Play, Start, Stop, Rewind кодыг
нарийн аргаар хийгээрэй. Хэрвээ Media Player -ийн runtime үед
харагдуулахгүйг хүсвэл Visible –г False утгатай болгоорой.
Wave Audio ба Windows API
Windows API function –ний тухай энгийн зүйлүүдийг яримааргүй байна.
Wave файлыг тоглуулхад Win32API –ийн PlaySound функцийг ашиглаж
болно. Эхлээд та нар Mmsystem –ээ өөрийнхөө хэрэглэгчдийг list
болгохоор нэмнэ. Дараа нь PlaySound функцээ доорх байдлаар дуудна.
PlaySound(‘test.wav’,0,SND_FILENAME);
Амархан байгаа биз? PlaySound –н эхний параметрт ямар файл
тоглуулахаа зааж өгнө. Сүүлийн параметрт дуу хэрхэн тоглогдох flag -ийг
тогтоож өгнө. Дискнээс wave audio тоглуулж байхдаа сүүлчийн параметрт
та SND_FILENAME гэж тогтоож өгнө. Та өөр flag зааж өгч болно. Харин
энэ
тохиолдолд зөвхөн PlaySound функц нь мөн дискэндээр файлтай ижил
sounds system тоглуулж чадна. Cистемийн дууг тоглуулахдаа эхний
параметрт нь sound alies -ийг зааж өгнө. Харин flags параметрт
SND_ALIES
гэж жишээндээ зааж өгчээ.
PlaySound (‘SystemAsterisk’,0,SND_ALIES);
Энэ код нь системийн дуу Asterisk –ийг тоглуулна. Системийн дууны
жагсаалтыг олж авхыг тулд Сontrol Panel –ийн Sound аpplet –ийг
ажиллуул.
Хэрвээ системийн дуу олдохгүй бол windows default дууг тоглуулна.
Default
дуу нь ding байдаг.
Тэмдэглэл: Win32API MessageBeep функц мөн system sound -г
индексийн
дугаараар нь тоглуулдаг. Win32 online help –с MessageBeep -н тухай бүх
мэдээллийг хараарай. Play sound функц дуудах үед 2 өөр чухал flags
байна.
• SND_ASYNC flag нь дууг асинхрон тоглохыг зөвшөөрдөг. Энэ flag
хэрэглэгдэж байхад дуу тоглож эхлэхдээ шууд програмын тоолуурыг
програмруу буцаадаг. Энэ нь таны програм дараагийн командаа
ажилуулж байхад sound тоглосоор байх болно гэсэн үг.
• SND_SYNC flag нь дууг тоглож дуусах хүртэл програмын тоолуурыг
програмруу буцаахгүйгээр зааж өгдөг. SND_SYNC нь PlaySound –н
default учираас энэ flag-г тодорхойлж өгөх хэрэггүй. Энд маш олон
flag-ууд PlaySound -р дууг яаж тохируулахад хэрэглэгдэнэ. Бүрэн
мэдээллийг Win32 online help дээр PlaySound функц гэсэн хэсгээс
хараарай.
MediaPlayer –ийн Properties, Method, ба Event
TMediaPlayer –т маш олон property байдаг. Тэдгээрийн ихэнх нь
ойлгоход хялбар, харин зарим нь бага зэргийн төвөгтэй байдаг.
TmediaPlayer -ийн үндсэн гол шинж чанаруудыг жагсааж бичив.
Property Тайлбар
TMediaPlayer –т мөн олон method байдаг.
roperty Тайлбар
TMediaPlayer компонентод зөвхөн нэг event байдаг. OnNotify event нь
команд гүйцэтгэж дуусхад дуудагддаг. Харин зөвхөн Notify property -гийн
утга true үед та алдааг шалгаж болно. NotifyValue Property нь утгыг харах
үйлдлийг амжилттай эсэхийг заана.
Wave Audio
Multimedia -гийн олон үндсэн үйлдлүүдийн нэг нь Wave audio тоглуулах
юм.
энэ нь магадгүй ердийн үйлдэл юм. Wave file synchronously тоглуулж
байхад:
Play.wait:=true;
Player.filename:=’testwav.wav;
Player.open;
Player.play;
Энд wave property true wave файлын тоглох төлөв нь synchronously
байна.
Player.FileName := ‘test.wav’;
Player.Open;
Player.StartPos := 1000;
Player.EndPos := 3000;
Player.Play;
Тэмдэглэл: Хэрэв StartPos, EndPos –ийн утгууд буруу байвал wave
файлыг тоглуулж чадахгүй. Буруу өгөгдөл гэдэгт startPos, EndPos –ээсс
их
эсвэл EndPos –ийн утга Media файлын уртаас их зэрэг багтана.
Дууны хэмжээг тохируулах
Wave төхөөрөмжийн дууг тохируулах нь харьцангуй амархан зүйл юм.
Windows API үүнийг хийнэ. WaveOutgetvolume ба WaveOutsetvolume
функцүүд дууны цар хүрээг тохируулж чадна. Volume нь integer утга авна.
Өндрийг нь баруун, сулыг нь зүүн талын volume тохируулгаар хийнэ. Тэг
утга нь дуугүй ба $FFFF (hex) байвал хамгийн чанга гэх мэтчилэн өгнө.
waveOutSetVolume(0, $FFFFFFFF);
WaveOutsetVolume функц нь зөвхөн wave бүтээгдэхүүний дууг
тохируулна.
Master дууг зөвхөн multimedia mixer control -оор тохируулдаг.
Wave Audio бичлэг хийх
Уг сэдэв нь тийм амар зүйл биш. Яагаад гэвэл wave файл бичихдээ
эхлээд
бичигдэх wave файлаа нээнэ. Энэ нь бичихтэйгээ ижил параметртэй
шинэ
файл байна. Тэгээд дараа шинэ өгөглөө бичнэ. Filename property -ийн
name -ийг өөрчлөх ба түүндээ хадгална. Энэ бүгд бага зэрэг төвөгтэй.
Жишээ нь:
Filename DUMMY.wav энэ файл 22050kHz –ийн WaveFormat -тай болно.
Товчин дээр дарах үед та wave audio -оор бичиж эхэлнэ. Энэ үед бичих
үйл
явц эхэлчихсэн ба удирдлага таны application руу буцаана. Одоо зогсоох
хэрэгтэй . Доор жишээнд үзүүлэв.
procedure TForm1.StartBtnClick(Sender: TObject);
begin
with MediaPlayer do begin
FileName := ‘dummy.wav’;
Open;
Wait := False;
StartRecording;
end;
end;
procedure TForm1.StopBtnClick(Sender: TObject);
begin
with MediaPlayer do begin
{ Бичих процесийг зогсоож байна }
Stop;
{ файлын нэрийг өөрчилөн, хадгална}
FileName :=’new.wav’;
{ Хадгалах ба хаана }
Save;
Close;
end;
end;
Тэмдэглэл: Бичиж байх үед энэ алхамыг wave audio recording гүйцэтгэх
шаардлагатай. MediePlayer -ийн байрлалыг олохын тулд Record method
дууд. Бичлэг хийх үзүүлэлтүүд нь дараах байдалтай байна. Үүнд: хурд,
хоолойны тоо (mono, stereo) bits –н тоо, (ихэвчлэн 8 эсвэл 16) зэрэг хэв
маягууд байдаг. Ердийн wave form -ийн тоглуулах давтамж нь 8000kHz,
11025KHz, 22050kHz, 44150kHz байдаг. Хамгийн өндөр давтамжтай audio
бичлэг дээд зэргийн чанартай. Магадгүй та тоглоом хийгээгүй бол
stereorecord -ийг хэрэглэхгүй байх. Мөн bits -ийн тоо нь дуу бичлэгийн
чанарт нөлөөлдөг. Энэ нь ихэвчлэн 8 эсвэл 16 байдаг.
Тэмдэглэл: Өндөр чанартай дууг бичих дискны ихэнх зайг ихээр эзэлдэг.
Wave file -аа stereo -оор бичиж байхад нэг хоолойгоор бичсэн файлаас
хэмжээ нь 2 дахин их болдог. 16 bits –г хэрэглэх нь wave файлаа 8 bits
дээр
тавьж 2 дахин бичсэнтэй адил юм. Файлаа 22050kHz хурдтай, тоон ба 8
bits per -тай бичсэн бол энэ нь 200K. Үүний адилаар 22050kHz stereo 16
bits per-р бичсэн бол 800K болно. Ихэнхдээ stereo, 16 bits per -ээр бичих
нь
дискны зайг ихээр эзэлдэг. 22050kHz, тоо нь 8 bits per -ээр бичих нь
зүгээр
байдаг ба дууны чадал файлын хэмжээнд тохирдог.
MIDI Audio
MIDI audio –гийн талаар ихийг нурших хэрэггүй байх. Үүнийг та
MediePlayer
-ийн FileName property –д MIDI файл гэж сонгоод Play method –ийг
дуудахад болно. Ихэнх sound card нэг зэрэг 2 wave file –ийг тоглуулах
боломж өгдөггүй. Үүнтэй адил нэгэн зэрэг нэгээс олон file-ийг MIDI file –д
тоглуулах боломжгүй байдаг. Хэдийг ийм боловч MIDI file болон wave file
2
-ийг зэрэг тоглуулах боломжийг олгодог. Энэ нь тоглоом тоглож байхад
Music Track ба Sound effect нэгэн зэрэг тоглуулж байдгийг хэлж байгаа
юм. Та ингэж Wave, MiDI файлуудыг зэрэг тоглуулмаар байвал
MediaPlayer -ийн компоненттэй ажиллана. Тоглуулахдаа MediaPlayer –аа
MIDI файлд, PlaySound –аа wave файлд хэрэглээрэй. MIDI file ихэвчлэн
тоглоомын background дуунд хэрэглэгддэг. Хэрвээ MIDI file -аа ийм
байдлаар хэрэглэж байгаа бол дуу төгсгөлдөө хүрэх үед дахин эхлүүлж
байгаарай. TMediaPlayer –нь ийм дууг үргэлжилснээр нь тоглуулж
чаддаггүй. Ийм боловч та MideaPlayer-н OnNotify event –ийг давтах
эффект
болгож хэрэглээрэй.
Үүний дараа OnNotify event handler –аар хангах хэрэгтэй. Энэ event
handler –т амжилттай тоглож дууссаны дараа MIDI дахин эхлүүлэх
кодчилол хэрэгтэй. Жишээ нь:
procedure TForm1.MediaPlayerNotify(Sender: TObject);
begin
with MediaPlayer do
if NotifyValue = nvSuccessful then begin
Position := 0;
Play;
end;
end;
Энэ жишээ нь NotifyValue property -г nvSuccessfull утгатай эсэхийг шалгаж
байна. Position 0 байна. Энэ нь файл дахин тоглож эхэлснээр play method
дуудагдана гэсэн үг. Энэ бүгд маш энгийн байна. Хэдэн ярвигттай
асуудлууд бий. Тэдгээрийн талаар мэдэж авах ёстой. Эхнийх нь Position
property 0 гэж өгсөн.
Энэ нь файлыг дахин эхлэлд нь эргүүлэх нөлөөтөй. Хэвээ autoRewind
property true утгатай байвал энэ нь боломжгүй. Хоёр дах нь энд нилээд
хэдэн MediaPlayer үйл ажиллагаа байна. түүнийг мэдэж авах . Энд
OnNotify
event NotifyValue нь successful утгатайгаар дуудагдаж байгаа үйлдэл юм.
Жишээлбэл утга нь nvSuccesfull утгатай байвал команд дуусахаас
хамааран Stop командын үүрэг гарна.
CD Audio
CD тоглуулах нь харьцангуй амархан. CD тоглуулахдаа Device Type
property –г dtCDAudio -аар тогтоож мөн Play button дарагдахад эсвэл Play
method дуудаарай. CD Audio тоглуулахын тулд CDAudio –д Different
TimeFormat хэрэглэгддэгийг ойлгох хэрэгтэй. Та TMSF –ийг хэрэглэж
байгаа бол (цаг, минут, секунд, фрайм) TimeFormat тодорхой мөр эсвэл
current байрлалаас тодорхой мөр лүү гэсэн мэдээлэлтэй болно. Ямар нэг
минут , секунд эсвэл фраймын утгыг мөрийн дугаар болгож тавья.
Жишээнд current track дотрох playing position-г string –р зааж өгч байна.:
var
Time : Integer;
Track : Integer;
Minutes : Integer;
Seconds : Integer;
TimeStr : string;
begin
MediaPlayer.TimeFormat := tfTMSF;
Time := MediaPlayer.Position;
Track := mci_TMSF_Track(Time);
Minutes := mci_TMSF_Minute(Time);
Seconds := mci_TMSF_Second(Time);
TimeStr := Format(‘Track Time: %2.2d:%2.2d’, [Minutes, Seconds]);
Label1.Caption := ‘Track: ‘ + IntToStr(Track);
Label2.Caption := TimeStr;
end;
Эхлээд TimeFormat –ийг TMSF гэж өгч байна. Дараа нь Time дуудагдаж
current position -ний хэмжигдхүүн хадгалагдаж байна. Track, Minute,
Second
гэсэн өөр утгууд windows Time-ийн (mci_TMSF_Track ) гэсэн
өөрчлөлтйиг
авч байна. MM system unit –д macro -yудыг агуулагддаг. Хэрэв эдгээр
макронуудыг хэрэглэвэл энэ хэсгээ та өөрийнхөө uses List -д нэмээрэй.
Өөрсдийнхөө цагийн утгуудыг авч дууссаны дараа Time string мөрийн
цагийг үзүүлэхээр үүсгэнэ. Тэгээд мөрийн дугаар ба мөрийн цаг Label
component -д гарч ирнэ. MSF (minute,second,frames) –ийг гэсэн
TimeFormat
хэрэглэж байгаа CD global level авах болно. Жишээ нь MSF TimeFormat –
ийг current podition –г CD –ний эхлэл гэсэн хуучин хэвд оруулахад
хэрэглээрэй. Үүнтэй ижил MSF TimeFormat -ийг CD -ний current position -г
CD дээрх 30 минутын хэмжээтэй мөрд гэж зааж өгч болно. Доорх жишээ
нь мөрний тухайд биш яаж буцааж хуучин хэвд нь оруулан үзүүлж
байгааг
харуулав. CD дээрх минут ба секундийг current position :
var
Time : Integer;
Minutes : Integer;
Seconds : Integer;
TimeStr : string;
begin
MediaPlayer.TimeFormat := tfMSF;
Time := MediaPlayer.Position;
Minutes := mci_MSF_Minute(Time);
Seconds := mci_MSF_Second(Time);
TimeStr := Format(‘Total Time: %2.2d:%2.2d’, [Minutes, Seconds]);
Label3.Caption := TimeStr;
end;
Энэ жишээ нь СDPlayer тоглуулах програмыг агуулсан байна. Мөн
TMediaPlayer Audio CDPlayer -ийг үүсгэхэд хэрхэн хэрэглэгдэж байгааг
багтаасан байна.
AVI Video
TmediaPlayer -ээр AVI video тоглуулахын тулд AVI файлаа сонгоод Play
method –оо дуудна. (эсвэл Play button дарна.) Хэрэв default MediaPlayer –
ийн тохиргоо хэрэглэж байгаа бол тусдаа цонх нь pop up болж AVI
үүндээр
гарах болно. Мөн Display Property -г ямар нэг цонх төрлийн компонентийг
зааж өгснөөр video тэр компонентийн мужид тоглох болно.
Жишээ нь: Panel дээр AVI video -гоо тоглуулбал дараах хэлбэртэй бичнэ.
MediaPlayer.Display := AVIPanel;
Panel дээр AVI video тоглуулж байхад дүрс харагдах болно. Хэрэв video
нь
Panel -ийн тэгш өнцөгтөөс том тэр video Panel –д хайчлагдаж хэмжээг нь
бүрэн гаргахгүй болгоно. Үүнийг Strech эсвэл Shrink болгож video -гоо
харвал DisplayRect property -г Stretch эсвэл Shrink гэж зааж өгөөрөй.
MEDIAPLAYER.DISPLAYRECT := AVIPANEL.CLIENTRECT;
Үүнд AVI video –ны олон төрлийн format байна. Гэвч бүх AVI –г system
дүүрэн тоглохгүй. Хэрвээ баталгаатай тоглуулахыг хүсвэл standard
Microfoft AVI video type -ийг оруулаарай. Яагаад таны хэрэглэгч гарцаагүй
Microsoft AVI суулгасан байна.


Registry ашиглах
Application -ний системийн мэдээлэл нь WIN.INI эсвэл application –ийн
онцгой хэлбэрийн өгөгдлийн хувийн .ini файл юм. Энэ нь зарим нэг
ашигтай боловч бас ашиггүй зүйлүүд бий. Хаа нэгтэй миний шинэ шийдсэн
зүйлийг хэн нэгэн Registry –ийн application –ийн онцгой хэлбэрийн
мэдээллээр ашиглаж байж болзошгүй юм.
Гэвч бүгд л Registry –ийг хэрэглэдэг бөгөөд тэд хэзээч Registry сайн, муу
гэж хэлдэггүй бөгөөд үүнийг ашигласаар л байна. Registry -ийн term нь
Windows Registration Database –ээс богино. Registry нь олон өргөн зүйлийн
мэдээллийн тухай таны Windows –ий дүрслэлд байдаг. Win95 – NT
хүртлэх програмууд нь Registry засагч програмтай байдаг. Delphi Code
Insight –ийн сонголтоос Registry Editor –ийг харж болно.
Registry –ийн өгөгдлийн төрлүүд
Registry –ийн өгөгдлийн төрлүүд нь цөөн тооных байдаг. Үүнд үндсэн
өгөгдлийн төрлүүд нь binary data, string , integer гэсэн төрлүүд байна.
binary data нь ямар нэг 2 –тын тоон өгөгдөлд ашиглагдана. Магадгүй та
хэзээ ч 2 тоон өгөгдлөөр нь шууд хэрэглээд байхыг хүсэхгүй байх.
Магадгүй таны ихэнх зорилгод зөвхөн унших , бичхэд string болон integer
утга хэрэглэгддэг байх.
TRegistry класс
Windows API нь Registry –д цөөн тооны функцууд олгосон байдаг.
Тэдгээр
функцууд нь, RegOpenKey, RegQueryValue, RegSetValue, RegDeleteKey
зэрэг функууд юм. API –ийн төвшин нь Registry –тэй доод төвшнөөр
холбогддог. Borland нь VCL class –таа TRegistry –ийн дуудалтыг олгосон.
Энэ класт танд хэрэгтэй TRegistry –ээс бичих , унших бүх зүйлийг
олгосон.
TRegistry Properties
TRegistry –т 4 properties байдаг. CurrentKey property нь сонгосон
түлхүүрийн утга бөгөөд бодит тоон утгаар түлхүүрүүд ялгагдана.
CurrentKey property –н түлхүүрийн нээсэн үед тавигдана. Энэ property нь
уншиж чадахгүй.
TRootKey and CurrentPath properties нь хаттай техт үүсгэдэг түлхүүр дээр
ажиллан. CurrentKey property нь техт тодорхойлолттой түлхүүрийн хэсэгт
RootKey утга гаргадаг. Энэ түлхүүрийг авах жишээ.
HKEY_CURRENT_USERSoftwareBorlandDelphi4.0Code Insight
TRegistry Methods
TRegistry –ийн класст цөөн тооны methods байдаг. 14.1 жагсаалтанд
анхдагч methods –уудын тодорхойлтуудыг гаргав.
Хүснэгт 14.1 TRegistry- ийн анхдагч METHOD -ууд
Method Тодорхойлолт
Delphi
TRegistry ашиглах нь

TRegistry ашиглах нь үнэндээ амархан. Ихэнхдээ Registry хэрэглэх
гараагаа дараах алхамаар хий.
• TRegistry class үүсгэх;
• OpenKey method -ийг ашиглан түлхүүр нээх, үүсгэх хэрэгтэй;
• Өгөгдлийг унших болон бичхэд Read болон Write функцийг дахин
дахин ашигла;
• TRegistry class –ийг чөлөөл;
procedure TForm1.FormCreate(Sender: TObject);
var
Reg : TRegistry;
KeyGood : Boolean;
Top : Integer;
Left : Integer;
Width : Integer;
Height : Integer;
begin
Reg := TRegistry.Create;
try
KeyGood := Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, False);
if not KeyGood then begin
Top := Reg.ReadInteger(‘Top’);
Left := Reg.ReadInteger(‘Left’);
Width := Reg.ReadInteger(‘Width’);
Height := Reg.ReadInteger(‘Height’);
SetBounds(Left, Top, Width, Height);
end;
finally
Reg.Free;
end;
end;
Энэ код нь хялбар нээгдэх түлхүүрийг ашиглах ба WriteInteger method –
ашиглан form -ны Top, Left, Width, and Height properties -ийн түрхүүрийг
бичнэ. OpenKey method –ийн сүүлчийн параметрыг true болгож байгааг
ажигла. Registry –ээс унших утга, бичих утга нь бүх үндсэн дуудалтууд
юм.
Бусад өгөгдлийн уншилт, бичилтийн methods нь өмнөх кодын хэсгээс өөр
байдаг.
Registry -ийг өгөгдөл хадгалах зориулалтаар хэрэглэх нь
Энэ програм нь Registry –ийн цөөн зүйлийг агуулдаг. Сүүлчийн хэмжээ
болон цонхны байрлал, цонхны байдал (normal, minimized, or maximized)
хамгийн сүүлд нээсэн хавтас, сүүлчийн файл, хамгийн сүүлд ашиглагдаж
байсан файл, өгөгдөл, хамгийн сүүлд ажилласан програмын огноо зэрэг.
RegTest програмд үүсгэсэн Registry –ийн түлрүүрийг арилгахыг хүсвэл та
үндсэн form дахь Delete Кеу товчлуурыг дар (see Figure 14.4, later in the
chapter).
Жагсаалт 14.3. RegTestU.pas.
unit RegTestU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, Menus, StdCtrls, ExtCtrls, Registry;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
DeleteKey: TButton;
Panel2: TPanel;
Label2: TLabel;
Label3: TLabel;
TimeLabel: TLabel;
DateLabel: TLabel;
MainMenu: TMainMenu;
File1: TMenuItem;
FileOpen: TMenuItem;
FileExit: TMenuItem;
OpenDialog: TopenDialog;
procedure FormCreate(Sender: TObject);
procedure FileOpenClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FileExitClick(Sender: TObject);
procedure DeleteKeyClick(Sender: TObject);
private
{ Private declarations }
KeyDeleted : Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Reg : TRegistry;
KeyGood : Boolean;
DT : TDateTime;
Top : Integer;
Left : Integer;
Width : Integer;
Height : Integer;
begin
{ KeyDeleted хувьсагчыг False болгож байна. }
{ Хэрэглэгч програмаас түлхүүр устгасан эсэхийг шалгахад
хэрэглэгдэнэ}
KeyDeleted := False;
{ TRegistry классын обьектийг үүсгэж байна. }
Reg := TRegistry.Create;
try
{ Түлхүүрээ нээж байна }
KeyGood := Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days', False);
if KeyGood then begin
Top := Reg.ReadInteger(‘Top’);
Left := Reg.ReadInteger(‘Left’);
Width := Reg.ReadInteger(‘Width’);
Height := Reg.ReadInteger(‘Height’);
SetBounds(Left, Top, Width, Height);
WindowState :=TWindowState(Reg.ReadInteger(‘WindowState’));
DT := Reg.ReadDate(‘Date and Time’);
DateLabel.Caption := DateToStr(DT);
TimeLabel.Caption := TimeToStr(DT);
end;
finally
Reg.Free;
end;
end;
procedure TForm1.FileOpenClick(Sender: TObject);
үar
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, True);
if Reg.ValueExists(‘LastDir’) then
OpenDialog.InitialDir := Reg.ReadString(‘LastDir’);
if Reg.ValueExists(‘LastFile’) then
OpenDialog.FileName := Reg.ReadString(‘LastFile’);
if Reg.ValueExists(‘FilterIndex’) then
OpenDialog.FilterIndex := Reg.ReadInteger(‘FilterIndex’);
if OpenDialog.Execute then begin
Reg.WriteString(‘LastDir’, ExtractFilePath(OpenDialog.FileName));
Reg.WriteString(‘LastFile’, ExtractFileName(OpenDialog.FileName));
Reg.WriteInteger(‘FilterIndex’, OpenDialog.FilterIndex);
end;
finally
Reg.Free;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
Reg : TRegistry;
begin
if KeyDeleted then
Exit;
Reg := TRegistry.Create;
try
Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, True);
Reg.WriteInteger(‘WindowState’, Ord(WindowState));
if WindowState <> wsMaximized then begin
Reg.WriteInteger(‘Top’, Top);
Reg.WriteInteger(‘Left’, Left);
Reg.WriteInteger(‘Width’, Width);
Reg.WriteInteger(‘Height’, Height);
end;
Reg.WriteDate(‘Date and Time’, Now);
finally
Reg.Free;
end;
end;
procedure TForm1.FileExitClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.DeleteKeyClick(Sender: TObject);
var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.DeleteKey(‘SoftwareSAMS’);
KeyDeleted := True;
finally
Reg.Free;
end;
end;
end.
Дээрх жишээн дэхь RegTest програмыг ажиллуулбал та өөрийн
applications –ний Registry ашиглалтын тухай ихийг сурах болно. Figure
14.4
дэхь RegTest програмыг ажиллагааг үзүүлнэ,
Мessage барих
XI бүлгээр ("Delphi –гийн хэрэгслүүд ба тохиргоонууд") бид WinSight
програмын хэсэг нь Windows messages гэж хэлж байсан. Ихэнх хэсгийн
Delphi –ийн message барих процесс нь хялбар хийгддэг бөгөөд энэ нь
event
–ээ дамжин ашиглагддаг. Таны message барих процесс нь Delphi –гийн
messaging system -ээс түрүүлж хэрэгждэг. Message -ийн 2 үндсэн төрөл
байна.
• Windows messages. Эдгээр меssage –уудыг VCL бариж боловсруулж
чадахгүй;
• Хэрэглэгчийн тодорхойлсон message;
Windows Message –ийн талаар дэлгэрэнгүй
Програмын бүтцийг ашигласнаар Windows messages програмд яаж
илгээгдэх, VCL дэхь төлөв тохируулна.
Message төрөлүүд
Үндсэндээ message -үүд нь 2 үндсэн төрөлд хуваагддаг.
• Command messages – Цонх болон бусад контролд даалгавар өгөх.
• Notification messages - Windows нь ямар нэг зүйл тохиолдлоо гэдгийг
илтгэдэг.

   Динамик холболттой сан үүсгэх

Яагаад DLL-ийг хэрэглэх хэрэгтэй болсон бэ?
Dll нь дараахь ач холбогдлуудыг үзүүлж чадна:
• • Кодыг үр ашигтайгаар ашиглах//Effective code reuse
• • Олон application-ний дунд кодыг хувааж ашиглах //Capability to
    easily share code among many applications
• • Кодыг хэсэгчилэх боломж //Capability to compartmentalize code
• • Internationalization of your application
•  • Windows-ийн нөөцийг үр ашигтайгаар ашиглах //Effective use of
   Windows resources
Эдгээрийг тус тусад нь авч үзье.

Кодыг үр ашигтайгаар ашиглах//Effective code reuse

Кодыг дахин ашиглана гэдэг бол объект хандалтад програмчиллын нэг
том хэсэг.Dll нь үүнийг гүйцэтгэх зам нь болж чадна.
Жишээ нь та Windows-ийн тусгай нэг үйлдэл гүйцэтгэдэг нэлээд том
хэмжээний код бичсэн гэж үзье .Энэ хэсгийг бичихэд маш хүнд байсан
бөгөөд хэрвээ хэрэгтэй газраа энэ нь дахин ашиглагдаж болдог бол
үнэхээр амар байх болно.Dll бол яг үүнийг чинь л гүйцэтгэдэг юм.
Үүнийг хийхийн тулд бүх кодоо DLL-дээ бичиж compile хийгээд дараа нь
хэрэгтэй газраасаа DLL-ийгээ дуудахад л хангалттай.Бичсэн DLL-ээ
бусдад худалдаж ч болно.
--------------------------------------------------------------------------------
NOTE:Түүнчилэн та C++Builder, Visual Basic, Visual C++,бусад
програмчиллын орчинд бичигдсэн кодноос дуудагдах боломжтой DLL-ийг
амархан үүсгэж болно.Мэдээж энэ нь DLL дотор байгаа кодоосоо мөн
хэрхэн дуудахаас хамаарах боловч үүнийг хийж болно.
 --------------------------------------------------------------------------------
Олон application-ний дунд кодыг хувааж ашиглах //Capability to easily share code among many applications


кодыг хувааж ашиглах гэдэг бол арай хэдэн алхам илүү хийгдэнэ.
Таныг нэгэн том корпарацид програмистаар ажилладаг гэж үзье.Тэгвэл
танд өөр өөрсдийн гэсэн системтэй олон зуун хэрэглэгч байх болно. (Энэ
жишээнд сүлжээний асуудлуудыг авч үзсэнгүй.).Эдгээр хэрэглэгчдэд 5
application бичсэн ба application бүр нь 100KB-д compile хийдэг гэж
үзье.Хэрвээ та DLL хэрэглэхгүй бол 100KB кодоо 5 удаа давтаж
хэрэглэхэд нийт 500KB код болно.Энэ бол үнэхээр кодыг үр ашиггүй зарж
байна.
Тэгэхлээр 5 application бүр нэг DLL-д бичигдсэн кодыг хувааж
ашиглахаар зохион байгуулж болно.Ингэснээр Хэрэглэгч бүр нэмэлт
100KB DLL-ийг байрлуулах зай машиндаа агуулах болно гэхдээ
application бүр 100KB-ийг хасах болно.Эцсийн дүнд нь хэрэглэгч бүр
400KB disk space хэмнэнэ. 400KB-ийг хэмнэх гэдэг нь их сонсогдохгүй
байгаа ч гэсэн хэрвээ хэрэглэгчдийн тоо маш их бол энэ тоо мэдээж
нэмэгдэнэ.
Жинхэнэ амьдрал дээр бол та DLL-ийг хэрэглэснээр хэдэн хэрэглэгч бүр
дээр хэдэн MB-аар хэмнэж болдог
Хэрвээ энэ 5 app –ийн 3 нь зэрэг ажиллавал яах вэ ? Ямар ч асуудал
гарахгүй .
Windows нь хаанаас хэн дуудаж байгаа замыг нь хадгалж байдаг учраас
ямар нэг будлиан үүсдэггүй.
Кодыг хэсэгчилэх боломж //Capability to compartmentalize code

Энэ асуудал ихэвчилэн кодоо өөрчлөх засах үед тохиолддог.
Энэ аргыг хэрэглэсний нэг давуу тал бол маш амархан
upgrade(өөрчлөлт) хийх боломжтой. Ямар ч шилдэг програм байсан ч
гэсэн энэ нь ямар нэг хэмжээгээр заавал алдаатай л
байдаг(bug).Тэгэхлээр та DLL дахь алдаагаа хайж байгаад засаад
ажиллулах нь бүхэл бүтэн програмын хаа файлыг засахаас хэдэн хувь
хялбар болох нь ойлгомжтой.
Хэрвээ та програм бичээд нэг их удаагүй бол үүний ашиг тусыг
одоохондоо мэдрэхгүй байх гэхдээ маш том хэмжээний хэдэн MB-аар
хэмжигдэх програмын үед бол энэ үнэхээр авч үзэх асууддал болно.


Internationalization of your application

Хэдэн жилийн өмнө бол та програм бичээд олон улсын зах зээлийн
тухайд бол санаа зовох зүйл байгаагүй.Програмдаа menu items, dialog
boxes, hint text, error messages-ийг үүсгээд ашиглаад өөрийнхөө хэл дээр
бичлээ Зах Зээл дээр гаргалаа тэгээд энэ тухай ахиж боддоггүй байлаа.
Одоо бол дэлхий улам л жижгэрч Internet World Wide Web зэрэг зүйлүүд
хэдэн жилийн өмнө байснаасаа өөр болж байна.Та нэг жижиг Demo
программ бичээд Internet-д тавихад хэдхэн минут цагийн дотор л хэн ч
гэсэн таны програмыг үзээд ашиглах боломжтой болсон билээ. Эндээс
юуг хэлэх гээд байна гэвэл Програмаа өөр хэл дээр хөрвүүлэх тухай
одоо авч үзэх цаг болсон.
Үүнийг шийдэх нэг арга бол DLL-үүдэд янз бүрийн хэл дээрхий
тэмдэгтүүдийн нөөцийг агуулсан resources үүсгэх. Хэл болгонд ялгаатай
DLL үүсгэж болно эсвэл нэг DLL-д хийгээд зөв хувилбарыг нь дуудах
зэргээр зохион байгуулж болно. Runtime-ийн үед та Windows API function
LoadString-ийг дуудах шаардлагатай components-тай холбоход хэрэглэж
болно.
--------------------------------------------------------------------------------
NOTE: One disadvantage to the Delphi programming model is that it doesn't
use traditional resources as other programming environments do. Resources
such as menus are not loaded as resources but rather are contained within
the form's resource. This makes internationalization more difficult and is one
of the few times that this model works against you.
--------------------------------------------------------------------------------

Windows-ийн нөөцийг үр ашигтайгаар ашиглах //Effective use of Windows resources

Одоогийн систем бол маш хурдан болсон өмнө нь байсан RAM ,hard disk
space зэрэг нь бүгд нэмэгдсэн.”Би ердөө л 2MB of system RAM хэрэглэж
байна шүү дээ ” гэж хэлэх нь амархан болжээ. Үнэндээ бол та үргэлж
хэрэглэгч тань ямар хэмжээний нөөц ашиглаж байгааг хянаж ухамсарлаж
байх ёстой.
Тэгэхлээр энд дахиад л DLLs тусалж чадна.Энэ бол кодыг олон
application-ы дунд хувааж ашиглах гэдгийн үргэлжлэл гэсэн үг.
Өмнө ярьж байсан жишээгээ дахин авч үзье.Хэрвээ DLL хэрэглэхгүй бол
нэгэн зэрэг ачаалагдаж байгаа зарим програмууд нь санах ойд ижил код
зэрэг ачаалагдах болно.
Энэ тохиолдолд system resources-ийг дэмий үрж байна яагаад гэвэл
program бүр тухайн кодын өөрин гэсэн хуулбарыг үүсгэнэ.
DLL-ийг ашигласнаар бүх application нь санах ойд байгаа адилхан кодыг
ашиглаж системйин хатуу байдлыг багасгана.

DLL Unit-ийн Aнатоми
Бусад Pascal unit шиг DLL unit нь тусгай форматтай байдаг. Listing 19.1-
д lDLL unit-ийн байж болох хамгийн бага хэмжээг харуулсан байна.

LISTING 19.1. A BASIC DLL UNIT.
library TestDLL;
uses
  SysUtils,
  Classes,
  Forms,
  Windows;
procedure SayHello(AForm : TForm);
begin
  MessageBox(AForm.Handle, `Hello From a DLL!',
   `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
exports
  SayHello;
begin
end.

Unit-ийн эхэнд байгаа library гэсэн түлхүүр үгэнд анхаарлаа хандуул.
Library түлхүүр үг нь энэ unit –ийг DLL unit гэдгийг зааж өгнө.Энэ DLL-д
ганцхан SayHello procedure байна. SayHello procedure нь бусад Object
Pascal procedure-уудаас ямар ч ялгаагүй.

Одоо анхаарлаа exports гэсэн түлхүүр үгэнд хандуул. exports гэсэн
хэсэгт тодорхойлогдсон Ямар ч procedure & function DLL-ээс
експортлогддог.


Эцэст нь DLL unit-ийн төгсгөлд begin and end гэсэн түлхүүр үг байна.Энэ
код block бол DLL-ийн үндсэн код block бөгөөд энд DLL эхлээд
дуудагдахад гүйцэтгэгдэх кодыг бичиж өгнө.

The Basics of DLL Writing
Functions and Procedures in DLLs
DLL дэх функц процедур нь хоёр категорид хуваагдана.
• • DLL дэх локаль функц процедурууд
• • DLL-ээс експортлогдсон функц процедурууд
DLL нь method агуулсан классуудыг агуулах боломжтой.
DLL дэх локаль функц процедурууд
Энэ төрлийн функц процедуруудыг яг бусад функц процедур шиг
зарлана.Эдгээр функц процедурууд нь DLL дотроо дуудагдана харин
DLL-ийн гаднаас дуудагдах боломжгүй.Өөрөөр хэлбэл дуудаж байгаа
application нь эдгээр функц процедуруудлуу ханддаггүй, тэдгээр нь DLL-
ийн хувьд private мэтээр ойлгогдоно.
--------------------------------------------------------------------------------
ТАЙЛБАР: DLL нь DLL-ийн бүх функц процедурууд хандаж болох
глобал өгөгдлийг агуулдаг.Өөөрөөр хэлбэл нэг программ нь глобал
хувьсагч х-ээ 100 болгож өөрчилбөл DLL-ийг ашиглаж байгаа бүх
программуудад энэ өөрчлөлт нь нөлөөлнө.
--------------------------------------------------------------------------------
DLL-ээс експортлогдсон функц процедурууд
DLL-ээс гадна дуудагдаж чадах функц процедурууд энэ категорид орно.
Эдгээр нь public –аар ойлгогдсон байна.
--------------------------------------------------------------------------------
NOTE: DLL дэх функц процедурууд нь гүйцэтгэгдэж байгаа application-
аас болон бусад DLL-ээс дуудагдаж болно.
--------------------------------------------------------------------------------
функц процедурууд нь експортлогдсоны дараа үүнийгээ application-саа
дуудах хэрэгтэй болно.
Exports түлхүүр үг
Listing 19.1 DLL дэх SayHello процедурыг експортлож байгаа жишээ
үзүүлсэн байна.
2.Нэрээр нь Export-х
Хамгийн өргөн арга бол нэрээр нь експортлох юм.

exports
 SayHello,
 DoSomething,
 DoSomethingReallyCool;

Експортлогдож байгаа функц процедуруудаа таслалаар тусгаарлан
жагсаан бичиж болно.
2.Дугаараар нь Export-х
Мөн функц процедуруудаа дугаараар нь експортлож болдог.ингэсэн
тохиолдолд index гэсэ түлхүүр үг ашиглана.

exports
 SayHello index 1,
 DoSomething index 2,
 DoSomethingReallyCool index 3;
Энэ аргыг нэг их хэрэглэдэггүй.

-
 DLL-Proc-ийг ашиглах
Өмнө дурдсанчилан DLL-ийн үндсэн block-д initialization code-оо бичиж
өгдөг. Харин finalization code-оо хаана бичих вэ гэсэн асуудал байна.DLL
нь бусад unit шиг initialization and finalization хэсэг гэж байдаггүй. DLL-ийн
үндсэн code block-д санах ойгоо хуваарилж өгдөг. Харин чөлөөлөхдөө
DLLProc –ийг ашиглана. DLLProc нь нь DLL-ийн амьдралын хугацаан
дахь тухайн үед дуудагддаг процедур юм.
DLLProc хэрхэн бий болог тухай авч үзье.
DLL нь Windows-ийг санах ойд ачаалагдах болон санах ойгоос
чөлөөлөхийн өмнө нь message хүлээж авдаг.Мөн Түүнчилэн аль хэдийн
ачаалагдсан DLL-ээс процесс бэхлэгдэх эсвэл Detach хийхэд message
хүлээж авна.
Эдгээр message-үүдийг олж авахын тулд Тусгай процедур үүсгээд
үүнийхээ хаягийг DLLProc гэсэн глобал хувьсагчид олгодог.
Энэ процедур нь доор илэрхийлсэн байдлаар харагдаж болно.

procedure MyDLLProc(Reason: Integer);
begin
 if Reason = DLL_PROCESS_DETACH then
   { DLL is unloading. Cleanup code here. }
end;

Зөвхөн DLLProc procedure-ийг зарлах нь үүнийг хэрэглэхэд хангалттай
биш. Дээр нь үүнийхээ хаягийг DLLProc гэсэн глобал хувьсагчид олгох
ёстой.Энэ үйлдлийг DLL-ийн үндсэн block-д хийдэг.
begin
 DLLProc := @MyDLLProc;
 { More initialization code. }
end.

Энэ код нь DLL дуудагдахад биелэгдэнэ. DLLProc одоо бол суулгагдсан
гэж тооцогдох бөгөөд processes attach хийхэд болон detach хийхэд DLL-
ээс дуудагдана.
 Listing 19.2-д DLLProc-ийг илэрхийлж байгаа DLL үзүүлсэн байна.

LISTING 19.2. A DLL UNIT THAT USES A DLLProc.
library TestDLL;
uses

 SysUtils,

  Classes,
  Forms,
  Windows;
var
  SomeBuffer : Pointer;
procedure MyDLLProc(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    { DLL is unloading. Cleanup code here. }
    FreeMem(SomeBuffer);
end;
procedure SayHello(AForm : TForm);
begin
  MessageBox(AForm.Handle, `Hello From a DLL!',
    `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
{ More DLL code here that uses SomeBuffer. }
exports
  SayHello;
begin
 { Assign our DLLProc to the DLLProc global variable. }
 DLLProc := @MyDLLProc;
 SomeBuffer := AllocMem(1024);
end.
Listing 19.2 дахь Reason parameter нь DLLProc-ийг дуудагдах
шалтгааныг илэрхийлж байгааг та тааварласан байх. Table 19.1-д
Reason parameter-ийн боломжит утгуудыг харуулсан байна.

TABLE 19.1. DLLProc Reason VALUES.

DLL_PROCESS_DETACH         DLL –Санах ойгоос чөлөөлөх.
DLL_THREAD_ATTACH          process нь DLL-д хобогдож байна.
DLL_THREAD_DETACH          process нь DLL-ээс detach хийж байна..
Loading DLLs
DLL дэх функц процедурыг хэрэглэхийн өмнө эхлээд DLL-ээ санах ойд
ачаалах хэрэгтэй. DLL-ийг runtime-ийн үед дуудах хоёр янзын арга
байна:
•   •   Static loading
•   •   Dynamic loading
Хоёуланд нь өөр өөрийн давуу болон сул тал байдаг.
Static Loading
Static ачаалалт нь таны DLL –ийг дуудах програм ажиллаж эхлэхэд DLL
нь автоматаар ачаалагддаг. Staticдуудалтыг ашиглахын тулд функц
процедураа DLL дотор external түлхүүр үгтэй зарладаг.Энэ тохиолдолд
DLL доторхи функц процедурыг яг бусад функц процедур шиг ашиглаж
болно.Энэ аргын сул тал нь хэрвээ DLL нь программын заалтыг
тодохойлоогүй бол программ дуудахаас татгалзана.
Dynamic Loading
Dynamic-аар ачаална гэдэг нь DLL-ийг шаардлагатай үед нь ачаалж
шаардлагагүй үед чөлөөлөх гэсэн үг юм.Давуу тал нь гэвэл DLL нь санах
ойд яг хэрэгтэй үедээ л оршин байна тэгэхлээр санах ойг үр ашигтайгаар
ашиглана гэсэн үг .Өөр нэг давуу тал нь таны application илүү хурдан
ажиллана гэсэн үг.
Гол дутагдалтай тал нь танд арай илүү ажиллагаа хийх хэрэгтэй
болно.Эхлээд Windows API function LoadLibrary-аар DLL-ээ дуудах
шаардлагатай. DLL-ээ ашигласны дараа
FreeLibrary-аар чөлөөлөх болно.Тиймээс хүссэн функц процедураа
дуудахын тулд GetProcAddress function –ийг ашиглах хэрэгтэй.Нэмж
хэлэхэд энэ аргыг хэрэглэхэд будлих толгой эргэх асуудал гарч
болзошгүй.
DLL –д байгаа функц процедурыг дуудах
 1. 1. Static Loading ашиглаж дуудах
Дуудаж байгаа application нь функц процедурыг зарлах хэрэгтэй.Үүний
дараа ердийн л функц дуудаж байгаа мэт дуудаж ашиглаж болно. DLL
дэх функц процедурыг оруулж ирэхдээ зарлалтандаа external
тодорхойлогчийг оруулж ирэх хэрэгтэй.Жишээ нь SayHello procedure-ийг
дуудаж байгаа application-даа дараахь байдлаар тодорхойлно:

procedure SayHello(AForm : TForm); external `testdll.dll';
external гэсэн түлхүүр үг нь compiler-д энэ procedure нь DLL
(TESTDLL.DLL in this case)-д байж болно гэж ойлгуулж байгаа. Яг дуудаж
байгаа хэлбэр нь ямар нэг ондоо зүйлгүй.

SayHello(Self);

USING THE external KEYWORD
Дараахь гурван аргаар импортлож болно:
• • Нэрээр нь//By actual name
• • Индексээр нь//By ordinal value
• • Нэрийг нь өөрчилж//By renaming
Эхний арга нь функц процедурыг яг DLL-д байгаагаар нь зарлаж өгөх.

procedure SayHello(AForm : TForm); external `testdll.dll';

Хоёрдахь арга нь DLL –ээс експортлогдож байгаа функф процедурын
дугаарыг нь шаардана.

procedure SomeOrdinalProcedure; external `testdll.dll' index 99;

Гуравдахь аргын хувьд функц процедураа хүссэнээрээ нэрлэж болох ба
жинхэнэ нэрийг нь тодорхойлж өгөх хэрэгтэй.

procedure CoolProcedure;
 external `testdll.dll' name `DoSomethingReallyCool';

2. Calling Functions and Procedures Using Dynamic Loading
Динамикаар дуудахад DLL дэх функц процедурыг заасан заагч зарлахыг
шаарддаг.Жишээ нь DLL-д SayHello гэсэн процедур байг:

procedure SayHello(AForm : TForm);
begin
 MessageBox(AForm.Handle, `Hello From a DLL!',
  `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;

Тэгвэл энэ функцийг дуудахын тулд procedure-ийг илэрхийлж байгаа
төрлийг тодорхойлж өгөх хэрэгтэй:

type
  TSayHello = procedure(AForm : TForm);

Ингэснийхээ дараа DLL-ээ дуудаад GetProcAddress –ийг ашиглан
процедурыг зааж процедураа дуудна , эцэст нь DLL –ийг чөлөөлнө.

var
 DLLInstance : THandle;
 SayHello : TSayHello;
begin
 { Load the DLL. }
DLLInstance := LoadLibrary(`testdll.dll');
 { Get the address of the procedure. }
 @SayHello := GetProcAddress(DLLInstance, `SayHello');
 { Call the procedure. }
 SayHello(Self);
 { Unload the DLL. }
 FreeLibrary(DLLInstance);
end;

Алдаа шалгах үйлдэл хийхийг доор нэмж харуулсан байна:

procedure TForm1.DynamicLoadBtnClick(Sender: TObject);
type
  TSayHello = procedure(AForm : TForm);
var
  DLLInstance : THandle;
  SayHello : TSayHello;
begin
  DLLInstance := LoadLibrary(`testdll.dll');
  if DLLInstance = 0 then begin
    MessageDlg(`Unable to load DLL.', mtError, [mbOK], 0);
    Exit;
  end;
  @SayHello := GetProcAddress(DLLInstance, `SayHello');
  if @SayHello <> nil then
    SayHello(Self)
  else
    MessageDlg(`Unable to locate procedure.', mtError, [mbOK], 0);
  FreeLibrary(DLLInstance);
end;

Creating a DLL Project with the Object Repository

1. File|New-ийг сонгоход Object Repository дэлгэцэнд гарна.

2. Double-click the DLL icon.

Ингэхэд нэг цонх үүсэх бөгөөд энэ нь доор үзүүлсэн шиг байна.
library Project2;
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  View-Project Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the DELPHIMM.DLL shared memory manager, which must be deployed
along
  with your DLL. To avoid using DELPHIMM.DLL, pass string information
  using PChar or ShortString parameters. }
uses
 SysUtils,
 Classes;
begin
end.

Энд бичигдсэн сануулгыг нь устгаад л шууд кодоо бичиж болно.DLL
ашиглан динамк болон статик дуудалтыг харуулсан жишээг доор
хавсаргав:

LISTING 19.3. TestDll.dpr.
library TestDLL;
uses
  SysUtils,
  Classes,
  Forms,
  Windows;
procedure SayHello(AForm : TForm);
begin
  MessageBox(AForm.Handle, `Hello From a DLL!',
   `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
procedure DoSomething;
begin
  MessageBox(0, `This procedure was exported by ordinal.',
   `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
procedure DoSomethingReallyCool;
begin
  MessageBox(0, `Something really cool.',
   `DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
exports
  SayHello,
  DoSomething index 99,
  DoSomethingReallyCool;
begin
end.

LISTING 19.4. DynLoad.dpr.
library TestDLL;
uses
  SysUtils,
  Classes,
  Forms,
  Windows;
procedure MyDLLProc(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
    { DLL is unloading. Cleanup code here. }
MessageBox(0, `DLL is unloading!',
  `DLL Message', MB_OK or MB_ICONEXCLAMATION);
end;
procedure SayHelloDyn(AForm : TForm);
begin
 MessageBox(AForm.Handle, `Hello From a DLL!' + #13 +
  `This DLL was loaded dynamically',
  `DLL Message', MB_OK or MB_ICONEXCLAMATION);
end;
exports
 SayHelloDyn;
begin
 DLLProc := @MyDLLProc;
end.

LISTING 19.5. CallDllU.pas.
unit CallDLLU;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
   HelloBtn: TButton;
   OrdBtn: TButton;
   DynamicLoadBtn: TButton;
   NamedBtn: TButton;
   procedure HelloBtnClick(Sender: TObject);
   procedure OrdBtnClick(Sender: TObject);
   procedure DynamicLoadBtnClick(Sender: TObject);
   procedure NamedBtnClick(Sender: TObject);
  private
   { Private declarations }
  public
   { Public declarations }
  end;
var
  Form1: TForm1;
{ A procedure imported by name. }
procedure SayHello(AForm : TForm);
  external `testdll.dll';
{ A procedure imported by ordinal. }
procedure OrdinalProcedure;
  external `testdll.dll' index 99;
{ A procedure imported and renamed. }
procedure CoolProcedure;
  external `testdll.dll' name `DoSomethingReallyCool';
implementation
{$R *.DFM}
procedure TForm1.HelloBtnClick(Sender: TObject);
begin
  SayHello(Self);
end;
procedure TForm1.OrdBtnClick(Sender: TObject);
begin
  OrdinalProcedure;
end;
procedure TForm1.NamedBtnClick(Sender: TObject);
begin
  CoolProcedure;
end;
procedure TForm1.DynamicLoadBtnClick(Sender: TObject);
type
  TSayHello = procedure(AForm : TForm);
var
  DLLInstance : THandle;
  SayHello : TSayHello;
begin
  { Load the DLL. }
  DLLInstance := LoadLibrary(`DynLoad.dll');
  { If loading fails then bail out. }
  if DLLInstance = 0 then begin
    MessageDlg(`Unable to load DLL.', mtError, [mbOK], 0);
    Exit;
  end;
  { Assign the procedure pointer. }
  @SayHello := GetProcAddress(DLLInstance, `SayHelloDyn');
  { If the procedure was found then call it. }
  if @SayHello <> n


il then
    SayHello(Self)
  else
    MessageDlg(`Unable to locate procedure.', mtError, [mbOK], 0);
  { Unload the DLL. }
  FreeLibrary(DLLInstance);
end;
end.



Шинээр компонент үүсгэх

Компонент бичих нь дээд түвшиний програмчлалыг ашигладаг.
Компонент үүсгэдээ эхлээд түүний Класс-г үүсгэдэг. Класс гэдэг нь
обекьтыг хэлнэ. Обект нь property, event, method-той байдаг. Зарим нь
private хэсэгт байрладаг, бусад нь public хэсэгтбайрладаг ба түүн руу
хэрэглэгчид хандах боломжтой байдаг. Компонент бичих нь цэвэр
програмчлал шаарддаг.
   - -      New component dialog box
        Энэ нь компонент бичих эхлэлийг тавьж өгдөг.
Ancestor type – удамшуулах төрөл
Class name – Классын нэр
Palette page- компонент байрлах хуудас
Unit file name- source файлын нэр
Search path- хайх зам




Хэрэв Install товч дээр дарвал source файлыг үүсгээд түүнийг суулгаад
тухайн компонент хавтасанд нь байрлуулдаг.
Create unit –г сонговол зөвхөн source файлыг үүсэж өгдөг.

Published property –нь object inspector дээр design time-н үед харагддаг.
Урьд обьектод зарлагдсан property-г дахин зарлаж болдог.
Шинээр компонент үүсгэхдээ анхаарах зүйл нь Class name нь заавал Т
үсгээр эхэлдэг.


Source code

Unit Label_sukh;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TLabel_sukh = class(TCustomLabel)
 private
  { Private declarations }
 protected
  { Protected declarations }
public
  { Public declarations }
 published
  { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Sukh's', [TLabel_sukh]);
end;

end.

Дээр харагдаж байгаа Private Protected Public Published хэсэгт зарлалтын
бичдэг.

Property - үндсэндээ утга хадгалахад зориулагдсан байдаг.
   - -      Унших
   - -      бичих
   - -      унших-бичих
   - -      Зөвхөн унших эсвэл зөвхөн бичих
   - -      Анхны утга
   - -      Pulished-non published гэсэн тодорхойлолтой байдаг.

Ихэнхдээ property-н утгыг хадгалж байдаг хувсагчийг F –ээр эхлүүлж
бичдэг.
Left := 20;
when you mean to write
FLeft := 20;

Унших ба Бичих
property FlashRate : Integer
   read FFlashRate write SetFlashRate;
Тухайн property нь read хэсгээс унших өгөгдөлтэй ижил төрөлтэй байна.
Write хэсэгт ижил төрөлтэй өгөгдөлийг дамжуулдаг.
Read хэсэгт нь хувсагч, write хэсэгт нь процедур байдаг.
procedure TFlashingLabel.SetFlashRate(AFlashRate : Integer);
begin
FFlashRate := AFlashRate;
{ Do some other stuff. }
end;
Зөвхөн унших

property FlashRate : Integer
read FFlashRate;
Зөвхөн бичих
property FlashRate : Integer
write SetFlashRate;
Анхны утга
property FlashRate : Integer
read FFlashRate write SetFlashRate default 800;

constructor TFlashingLabel.Create(AOwner : TComponent);
begin
inherited;
FFlashRate := 800;
{ Other things here. }
end;

Method бичих
Процедураа заавал public хэсэг зарласан байна.
Унших болон бичих процедур нь protected хэсэгт зарлана.
ComponentState property
Design time үед байгаа эсэхийг шалгана.
if csDesigning in ComponentState then
Exit;



unit FlashingLabel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;
type
TFlashingLabel = class(TCustomLabel)
private
{ Private declarations }
FFlashEnabled : Boolean;
FFlashRate : Integer;
Timer : TTimer;
protected
{ Protected declarations }
{ Protected write methods for the properties. }
procedure SetFlashEnabled(AFlashEnabled : Boolean);
procedure SetFlashRate(AFlashRate : Integer);
procedure OnTimer(Sender : TObject); virtual;
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
published
{ Published declarations }
property FlashEnabled : Boolean
read FFlashEnabled write SetFlashEnabled default True;
property FlashRate : Integer
read FFlashRate write SetFlashRate default 800;
property Align;
property Alignment;
property AutoSize;
property BiDiMode;
property Caption;
property Color;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property FocusControl;
property Font;
property ParentBiDiMode;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowAccelChar;
property ShowHint;
property Transparent;
property Layout;
property Visible;
property WordWrap;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;
procedure Register;
implementation
constructor TFlashingLabel.Create(AOwner : TComponent);
begin
inherited;
FFlashEnabled := True;
FFlashRate := 800;
Timer := TTimer.Create(Self);
Timer.Interval := FFlashRate;
Timer.OnTimer := OnTimer;
end;
procedure TFlashingLabel.SetFlashEnabled(AFlashEnabled : Boolean);
begin
FFlashEnabled := AFlashEnabled;
if csDesigning in ComponentState then
Exit;
Timer.Enabled := FFlashEnabled;
if not FFlashEnabled then
Visible := True;
end;
procedure TFlashingLabel.SetFlashRate(AFlashRate : Integer);
begin
FFlashRate := AFlashRate;
Timer.Interval := AFlashRate;
end;
procedure TFlashingLabel.OnTimer(Sender : TObject);
begin
if csDesigning in ComponentState then begin
Timer.Enabled := False;
Exit;
end;
Visible := not Visible;
end;
procedure Register;
begin
RegisterComponents(`Samples', [TFlashingLabel]);
end;


Registry
Анх windows нь системийн өгөгдөлийг INI файлд хадгалдаг байсан.
Энэ нь нэг талаас эвдэрэхд ша амархан нөгөө талаас нь үзэхэд
нууцлалтгүй байсан. Үүнээс үүдэж Registry гэсэн ойлголт гарч ирсэн.
Registry нь widows 95-с хойших үйлдлийн систенд байдаг.

Хандах
   1. хувьсагч зарлаад үүсгэх(Tregistry,Create)
   2. rootkey –д root-г зааж өгнө.
   3. Openkey зам ыг тодорхойлох(талбар)
   4. өгөгдөл уншин ба бичих
   5. хувьсагчаа санах ойгоос чөлөөлөх.



   1. хувьсагч зарлаад үүсгэх(Tregistry,Create)
      var
       reg:Tregistry;
      ……

        begin
         reg:=Tregistry.create;

   2. rootkey –д root-г зааж өгнө.
reg.rootkey:=HKEY_CURRENT_USER;

                   HKEY_LOCAL_MACHINE
                   HKEY_CLASSES_ROOT
                   HKEY_USERS.. гм байдаг.
  3. reg.openkey('SoftwareMicrosoftWindowsCurrentVersionRun',false)

  4. reg.Readinteger(num')
     reg.Readstring('txt')
     reg.readbool(‘bool’)
     ….
     ReadBinaryData
     ReadBool
     ReadCurrency
     ReadDate
     ReadDateTime
     ReadFloat
     ReadInteger
     ReadString
     ReadTime
     ….
     reg.writeinteger(‘num’,123)
     reg.writestring(‘txt’,’aaaaaaa’);
     ….
     WriteBinaryData
     WriteBool
     WriteCurrency
     WriteDate
     WriteDateTime
     WriteFloat
     WriteInteger
     WriteString
     WriteTime

  5. reg.free


GRAPHICS БА MULTIMEDIA ПРОГРАМЧЛАЛ
• Хялбар замаар Graphics хийх;
• Device context and Tcanvas;
• GDI обьектууд
o Pens, Brushes, Fonts;
o Bitmaps ба Palette;
o Region огтлох;
o Teкст зурах;
o Bitmap зурах;
o Memory Bitmap үүсгэх;
o Memory Bitmap –ийг хадгалах;
• Multimedia програмчлах
o Windows API aшиглан Wave Audio тоглуулах;
o TmediaPlayer компонент;
o MediaPlayer Properties , Methods ба Events
o Wave Audio
o Гаралтын volume –г тохируулах;
o Wave Audio –г бичиж авах;
• MIDI Audio;
• CD Audio;
• AVI Video;
Graphics and Multimedia нь програмын дээд түвшнийг төлөөлдөг.
Өнөөдрийн энэ сэдэвт та нар Graphics ба Multimedia –г Delphi хэл дээр
програмчлах тухай үзэж танилцана. Graphics –ийг програмчлахын тулд
ямар ч гэсэн TCanvas TBitmap классуудын тухай нилээд хэдэн зүйлийг
мэдэх хэрэгтэй. Би та нарт Delphi хэл дээр Graphics –г үзүүлэх хялбар
аргаас эхэлье. Үүний дараа та нар Windows Graphics Device Interface
(GDI)–ийн тухай мөн түүний компонентуудынх тухай мэдэж, хийж
сурна. Одоо бид олон төрлийн хүрээ, хэлбэр дүрс зурах тогтсон дэг
журмын тухай мөн Bitmap үзүүлэх олон аргыг сурна. Харин Multimedia
програмчлах бүлгийн хэсэгт хэрхэн Windows API -аар дуут файл
тоглуулах тухай үзнэ. Мөн та нар долгионт Audio тоглуулах, MIDI
болон AVI video тоглуулахад TMediaPlayer класс хэрхэн хэрэглэгдэх
тухай сурч мэдэх болно. Иймээс эхэлцгээе.
TextRect Clipping rectangle дотор текст бичих
Эдгээр properties ба methods нь Windows Device context –ийн үүргийн
бага хэсгийг төлөөлдөг. Гэхдээ та нарт хэлэхэд Graphics -тай ажиллаж
байхад эдгээр properties ба methods 80 хувийн үүргийг гүйцэтгэдэг.
Хэдийгээр ийм боловч би TCanvas –ийн тухай ярихаасаа өмнө
Graphic’s object –ийг яаж Windows програмчлалд хэрэглэх тухай ярих
хэрэгтэй болов уу.
GDI objects
GDI –д олон төрлийн обьектууд байдаг ба эдгээр нь хэрхэн device
context функцийг тодорхойлдог бол? GDI –ийн энгийн хэрэглэгддэг
обьектууд нь Pens, Brushes, Fonts. Бусад обьектуудад Palettes,
Bitmaps, regions багтдаг. Эхлээд Pens, Brushes, Fonts –ийг үзээд дараа
нь complex object -руу орцгооё.
Pens, Brushes, ба Fonts
Pens, Brushes, Fonts нь TCanvas класст яаж хэрэглэгдэж байгааг авч
үзье.
Pens
Pen нь обьектоор тодорхойлогдсон ба шугам зурахад хэрэглэгдэнэ.
Шугам нь шулуун байх ба нэг цэгээс эхлэлтэй нэг цэгт төгсгөлтэй эсвэл
тэгш өнцөгт, эллипс, олон өнцөгтийн хүрээ байна. TCanvas классын
Pen property –аар pen –ээ оруулах ба энэ нь TPen классын жишээ юм.
Хүснэгт 12.3 TPen-ийн property- нуудыг жагсаав.
Хүснэгт 12.3 TPen properties.
Эдгээр шинж чанаруудыг та хүссэнээрээ тохируулна. Доорх жишээнд
улаан өнгөөр Dashed line-р харуулав.
Canvas.Pen.Color:=clRed;
Canvas.Pen.Style:=psDash;
Canvas.MoveTo(20,20);
Canvas.LineTo(120,20);
Энэ кодчилолыг формынхаа товчинд OnClick handler дээр туршиж
үзээрэй. Таныг товчин дээрээ дарахад зурагдах шулуун нь form дээр
гарах болно.
Тэмдэглэл : Энэ сэдвийн бүх жишээнүүдийг ийм байдлаар туршиж
үзсэн байх хэрэгтэй. Хэрэв та нар дээрх жишээг туршиж үзсэн бол form
–оо дээш нь зөөхөд таны зурсан шулуун арилах болно. Иймээс үүнийг
байнгын болгохыг хүсвэл form –ийн OnPaint event –д дээр шулуун
зурдаг кодоо бичиж болно. OnPaint event нь form –ийн харагдах
байдал, байршил өөрчлөгдхөд үүсээдэг.
Dashed ба Dotted pen style зөвхөн pen width –ийн утга 1 байх үед
хэрэглэгдэнэ. PsClear pen style нь line –аа устгахад хэрэглэгдэнэ.
Тэгэхдээ энэ line нь Windows GDI draw –ийн обьект болох тэгш өнцөгт,
эллипс, олон өнцөгтүүдийн эргэн тойрны хүрээг хэлж байгаа юм.
Зөвлөмж: TPen –ийн олон property -нуудыг form дээрээ Shape
component ашиглан туршиж үзээрэй. Мөн Shape –ийнхаа pen -ийн
property –г өөрчилж сайжруулаарай. TPen классын Mode шинж чанар
нь effect -үүдийн гаднах харагдах байдалд онцгой хэрэгтэй байдаг.
Brushes
Энэ нь Graphical Shape -ийн дотрох хэсгийг буюу filled area –г
төлөөлдөг. Хэрвээ та нар эллипс, тэгш өнцөгт, олон өнцөгтүүдийг
зурсан бол Brush -г ашиглан дүүргэж болно. Ихэвчлэн энэ үед Brush нь
зөвхөн өнгө байдаггүй Bitmap эсвэл pattern –ийг агуулсан байдаг. Brush
нь TCanvas class -д байдаг ба нэг property юм. Brush –аар харагдах
хэлбэрийг өөрчилж туршиж үзээрэй. Brush нь Tbrush class -ийн нэг
объект юм. TPen, TBrush class -д бичиж тэмдэглэх event, method
ерөөсөө байдаггүй. Хүснэгт 12.4 –т шинж чанаруудыг жагсааж бичив.
Property Тайлбар
Хүснэгт12.4 TPen properties.
Доорх жишээнд форм дээрээ дугуй зураад 45 градусын налуутай
зураасаар дотрохыг нь будах хэлбэрийг ашиглалаа.
Canvas.Brush.Color:=clBlue;
Canvas.Brush.Style:=bsDiagCross;
Canvas.Ellipse(20,20,220,220);




Brush -ийн хэв маягийг ашиглаж байхад түүний Color property шугмын
өнгийг өөрчилдөг ба энэ шугам нь зургийнх юм. Зарим нэг VCL
automatically forces зэрэгт background mode -ийг transparent болгодог.
Гэхдээ энэ нь pattern fill үед болно. Background mode –ийг transparent
болгоно гэдэг нь дүрсийн дэвсгэрийг цонхны дэвсгэр өнгө, хэв маяг
хэлбэртэй адил болгохыг хэлж байгаа юм.
Өмнөхөөс арай өөрөөр харагдуулъя. Өөрөөр хэлбэл дугуй дүрсийн
дэвсгэр өнгийг формынхтай адил болгож . Энийг grayscale -дээр харах
тийм амар биш гэдгийг мэдэж байна. Хэрэв background –аа тус тусд нь
тодорхойлохыг хүсвэл VCL circumvent хэрэгтэй ба API –руу шууд очно.
Энд хэрэв цагаан дэвсгэр дээр хөхөөр зураас татах кодыг үзүүлэв :
Canvas.Brush.Color:=clBlue;
Canvas.Brush.Style :=bsdiagCross;
SetBkMode(Canvas.handle,OPAQUE);
SetBkColor(Canvas.Handle, clWhite);
Canvas.Ellipse(20,20,220,220);
Одоо дэвсгэр өнгө цагаан болохыг Figure12.2 т дээрх кодчилолоор
дугуй дүрсийг харуулав.




Brush -ийн өөр сонирхолтой өвөрмөц онцлог нь Bitmap background
option юм. Доор бичигдэх кодчилол нь bitmap brush -ийн тухай их
зүйлийг хэлж өгнө:
Canvas.Brush.Bitmap:=TBitmap.Greate;
Canvas.Brush.Bitmap.LoadFromFile(‘bkgnd.bmp’);
Canvas.Ellipse(20,20,220,220);
Canvas.brush.Bitmap.Free;
Эхний мөрөнд TBitmap обьектийн үүсэж буйг Brush -ийн Bitmap
property –руу гэж тодорхойлж байна. Bitmap property нь утгаа аваагүй
үүсэж байгаа маш өвөрмөц байна. Хоёр дах мөрөнд bitmap -аа
файлаас зөөж байна. Гурав дах мөрөнд эллипс зурж байна. Энэ
мөрний дараа эллипс зурагдсан байх учраас Brush property устгагдаж
байна. Энэ үйлдэл зайлшгүй чухал юм. Учир нь VCL танд үүнийг хийж
өгөхгүй. Хэрвээ brush property устгах нь бүтэлгүй болбол таны
програмд санах ой хүрэхгүй болох магадлалтай. Доорх зурагт Bitmap
brush -аар эллипс зурсныг харуулав. Танд зарим үед заавал hollow
Brush хэрэг болно. Үүгээр background -аа харуулах болно. Hollow Brush
-аа үүсгээд түүнийхээ brush style д зөвхөн bsClear гэж өгнө. Одоо
бүгдээрээ өмнөх жишээгээ авч түүн дээрээ 2 дахь дугуйгаа дотор нь
нэмж hollow brush aшиглая.

procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Width:=1;
Canvas.Brush.Bitmap:=TBitmap.Create;
Canvas.Brush.Bitmap.LoadFromFile('bkgnd.bmp');
Canvas.Ellipse(20,20,220,220);
Canvas.Brush.Style:=bsClear;
Canvas.Pen.Width:=5;
Canvas.Ellipse(70,70,170,170);
Canvas.brush.Bitmap.Free;
end;




Хэрвээ шууд API руу очвол та өөр зүйлүүдийг хийх боломжтой болно.
Хэдийгээр ийм боловч VCL Brush class –т ихэвчлэн эдгээрийг
гүйцэтгэдэг.
Fonts
Энд ямар нэгэн шинэ зүйл байхгүй. Fonts нь TCanvas class –тай
хэрэглэдэг ба Tcanvas -ийн Fonts -оос ялгаагүй форм эсвэл бусад
компонентуудад хэрэглэгддэг. TCanvas –ийн Font property нь бусад
компонентуудын Font property -тай ижил байдаг. Canvas -т font -ийг
солихдоо зөвхөн үүнийг хийгдэг:
Canvas.Font.Name:=’Courlier New’;
Canvas.Font.Size:=14;
Canvas.Font.Style:=Canvas.Font.Style+[fsBold];
Canvas.TextOut(20,20, ‘ Testing’);
Байна. Дараа бид текст зурах хэсэг дэх fonts нь юу хийдэг болохыг авч
үзье.
Bitmaps ба Palette
Ихэнхдээ bitmaps, palettes –ууд нь хамтдаа явдаг. TBitmap class -ийг
хэрэглэж байх үед Bitmap ачаалах ба дүрслэл хийхэд хялбар байдаг.
Та нар хэдийнээ VIII бүлэгийн хичээл дээр Jumping Jack програм дахь
TBitmap –ийн үйл ажиллагааг харсан. TBitmap class нэлээд хэд хэдэн
нөхцөл байдалд өргөн хэрэглэгддэг. Дараагийн бүлэгт bitmaps зурах
болон Memory Bitmaps –ийн талаар ярих үед зарим нөхцөл байдлыг
харах болно. TBitmap class нь нэг цогц учраас би method, property
бүрийг тайлбарлаагүй болно. Palette –ийн чухал ач холбогдлыг
тайлбарлахаар жишээ авч үзүүллээ. OnPaint event handler дээр
кодчилолыг эсвэл button click event дээр хэрэглэ.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap :TBitmap;
begin
Bitmap:=Tbitmap.Create;
{ Bitmap.IgnorePalette:=True;}
Bitmap.LoadFromFile('c:co.bmp');
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End;




Програм ажиллуулахад та гоё Bitmap –ийг формаасаа харах болно.
Эдгээр мөрнүүд ойлгомжтой тул тайлбаргүй. Харин 4 дах мөрөнд VCL
–ийн Palette -ийн мэдээллийг татгалзаарай. Тэгээд дахин програмаа
ажиллуулаарай. Ингэхэд bitmap-ийн өнгө бүгд буруу худал болно.
(хэрвээ video adapter –ийнхаа display –ийг more than 256 Colors гэж
тохируулбал та энэ үр нөлөөг анзаарч чадахгүй. ) Яагаад гэвэл palette
aшиглаж чадахгүй. Харин palette bitmap -ийнхаа зөв өнгөнүүдийг
palette system -д найдвартай хувиарлаж чаддаг. Bitmap, Palette
обьектууд нь Graphics боловсруулалтад чухал үүрэгтэй оролцдог
байна.
Clipping Regions
Regions нь Canvas –ийн дэлгэцэнд зурах хэсгийг хянаж байдаг муж
юм. TCanvas class –д ClipRect property байдаг. Харин энэ нь зөвхөн
уншдаг. Clipping Regions-ийг өөрчлөхөд Windows API –г хэрэглэх
хэрэгтэй. Одоо өмнөх жишээгээ авч хэрхэн Clipping Regions work –д
бага зэрэг зураг хавсаргаж түүнийгээ өөрчилж сайжруулахыг үзье.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
Rgn: HRGN;
begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
Rgn:=CreateRectRgn(100,50,250,250);
SelectClipRgn(Canvas.Handle ,Rgn);
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End;




Одоо програмаа ажиллуулахад та зөвхөн Bitmap -ийн харагдаж байгаа
хэмжээг харах болно. SelectClipRgn функц нь Canvas Clipping Region
(хайчлах муж) –ийг тэгш өнцөгттэй адилтгаж координатыг
100,50,250,250 гэж тогтоодог. Өмнө нь bitmap -ийг хөдөлгөөнгүй
байрлалд зурсан бол одоо зөвхөн Bitmap -ийн Clipping Region –оор
хэмжээг нь тодорхойлсон нь харагдаж байна. Clipping Region –аас
гаднахыг эс зөвшөөрсөн байна. Өмнөх жишээгээ авч олон сонирхолтой
зүйл хийж өөрчиллөө. Тэгш өнцөгт Region үүсгэж байгаа мөрийг авч
оронд нь доорх мөрийг тавилаа.
Rgn:=CreateEllipticRgn(30,30,170,170);




Одоо дахин програмаа ачааллаарай. Энэ үед Bitmap circular region -
аар хязгаарлагдана.
За одоо region –ний өөр нэг төрлийг авъя:
Const
Points: array [0..3] of Point = ((X:80,Y:0) ,(X:0,Y:80), (X:80,Y:160),
(X:160,Y:80));
Var
Bitmap: TBitmap;
Rgn: HRGN;
begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile(‘c:co.bmp’);
Rgn:=CreatePolygonRgn(Points,4,ALTERNATE);
SelectClipRgn(Canvas.Handle ,Rgn);
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
End
Энэ үед та олон өнцөгтийн region хэрэглэж region үүсгэж буй цэгүүдээр
массив тодорхойлнсон байна. CreatePolygonRgn функц нь цэгүүдийн
Region form цувааг үүсгэж байна. Үүн шиг хүссэнээрээ олон цэгүүдийг
хэрэглэж болно. Төгсгөлийнх нь хаагдах цэгийг онцгойлон зааж болохгүй
учир нь region автоматаар өөрөө эхлэлийн цэг төгсгөлийн цэгийг хооронд
нь холбож төгсгөдөг. Дахин програмаа ажиллуулж ямар үр дүн өгөхийг
хар.
Тэмдэглэл: Энд бичсэн кодчилолын хэсэгт хэрхэн массивын анхны утгыг
тогтоохыг харуулав. Кодчилол:
Const
Points: array [0..3] of Point
=((X:80,Y:0),(X:0,Y:80),(X:80,Y:160),(X:160,Y:80));
Энд Tpoint массивын хязгаарыг тогтоож анхны өгөгдлөөр хангаж байна.
Tpoint –д 2 талбар байдаг. X ба Y гэсэн. үүнд fieldname буюу талбарын
нэрийг жагсааж тодорхойлох цэгээр өгөгдлийг нь тогтоож өгөх . Жишээ
нь:
(X:80) Мөн X ба Y-ийн өгөгдлөөр хангагдсан биеийг хос хосоор нь
нийлүүлж бичнэ. Үүнийг 4 удаа бичсэн. Яагаад гэвэл массивт 4 элемент
байна. Массивыг зарлаж анхны утга тогтоохдоо зөвхөн ийм байдлаар
бичнэ. Та region –ийг дандаа хэрэглэхгүй ч гэсэн танд хэрэгтэй үед үнэлж
баршгүй чухал болно. Зураг боловсруулалтанд шаардлагатай зүйлүүдийг
хийж гүйцэтгэхэд хэрэг болно.
Зурах үндсэн ажиллагаа
Өмнө нь та номноос графикийн зарим үндсэн хэв маягтай тулгарч байсан
байх. Үүгээрээ та Rectangle method нь талбай ба тэгш өнцөгт зурахад
хэрэглэгддэг гэдгийг, харин Ellipse method нь дугуй ба зуйван дүрс
зурахад,
MoveTo ба LineTo -ээр хүрээ зурахдаа хэрэглэдгийг мэдсэн байгаа байх.
Мөн Arc method нум зурахад, Pie method pie-shaped objects зурахад
хэрэглэгддэг. Энэ бүгд чухамдаа үндсэн ойлголтууд юм.
Teкст зурах
Drawing text хийж сурах нь хэцүү дадлага юм. Нэмж хэлэхэд үүнд нилээд
хэдэн гоё өвөрмөц онцлогууд байдаг . Эдгээрийн талаар та нар мэдэж
авах хэрэгтэй .
TextOut ба TextRect функцууд
TextOut method canvas дээр бичих үндсэн арга болж өгдөг. Үүнд тийм ч
хэцүү юм байхгүй. Та нар зөвхөн X ба Y –ийнхаа байрлалыг зааж өгч
харагдах текстээ жишээн дээрхтэй ижил бичиж өгнө:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri');
End;




Энэ нь формын string –ийг 20,20 байрлалд гаргана. X ба Yнь гарах
текстийнхээ зүүн дээд булангаас нь байрлуулдаг. Үүнийг туршиж
үзээрэй.
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri');
Canvas.MoveTo(20,20);
Canvas.LineTo(100,20);
End;




Энэ кодчилол текстээ 20, 20 байрлалд үзүүлж, мөн шугам 100, 20 хүртэл
зурж байна. Шугам нь текстийнхаа оройноос хөндлөнгөөр зурагдсан.
TextRect method нь танд clipping rectangle -дээ текст нэмж харуулах
боломжийг олгодог. Энэ method -ийг хэрэглэж байх үедээ текстээ заавал
тодорхой хил хязгаар дотор нь багтаах хэрэгтэй. Хэрэв хязгаараас илүү
гарах юм бол хайчилдаг. Доорх жишээнд 100 -аас илүү гарсныг үзүүлж
баталж байна.
Зөвлөгөө: Хэрэв текстээ tab төгсгөлтэй бичвэл Windows API функц
TabbedTextOut-г хараарай.
TextBackground
Саарал форм дээр цагаан background –тай байсан нь сэтгэл татахгүй
байна. Text background -ийг цагаанаар тогтоосон brush -аас олж авсан. Уг
асуудлыг шийдэх 2 арга зам байна. Эхнийх нь canvas brush -ийн өнгийг
солих, дараагийнх нь text background –г transparent хийх. Text background
–
ийг өөрчлөх нь хялбар байна. Тэгэхдээ нэг асуулт байна. Ямар өнгөөр
текстийнхаа дэвсгэр өнгийг болгохоо мэдэж байна уу? Энэ нөхцөлд
текстийнхаа дэвсгэр өнгийг формынхтай ижил болгов. Үүний тулд:
Canvas.Brush.Color:=Color;
Гэж хийнэ. Энэ кодчилол нь олон нөхцөл байдалд ажиллана. Зарим үед
танд олон контрол байна. Харин та зөвхөн text transparent -ийнхаа
background -ийг өөрчлөх юм бол хялбар болно. Кодчилол нь ямар байхыг
харуулъя:
Var
OldStyle: TbrushStyle;
Begin
OldStyle:=Canvas.Brush.Style;
Canvas.Brush.Style:=bsClear;
Canvas.textOut(20,20, ‘www.csms.edu.mn/cheri’);
Canvas.brush.Style:=OldStyle;
End




Эхлээд одоогийн байгаа brush style -аа хадгална. Дараа нь brush style -
ийг
transparent дээр bsClear гэж тогтоож өгнө. Тэгээд текстээ харуулсныхаа
дараа Brush style -ийг эргээд урд нь ямар стиль байсныг тавилаа. Та
текстээ бичиж өгчихөөд өмнөх style -аа хадгалсан хэлбэрээр нь дахин
тогтоож өгнө. Энэ нь хуучин байсан brush style -ийг цаашид байх нь
зүгээр
гэж бодвол дахин тогтоож болохыг харуулав. Transparent background
хэрэглэх үед бас нэг өөр давуу тал бий. Энэ нь та хэсэг текстээ bitmap
background дээр гаргах боломжтой боллоо гэсэн үг. Харин энэ үед solid
дэвсгэр хэрэглэж болохгүй. Кодчилол нь зургийн хамт (factory.bmp file нь
Borland Shared Files 56 Color директоороор олдоно.)
procedure TForm1.Button1Click(Sender: TObject);
Var
OldStyle: TbrushStyle;
Bitmap:TBitmap;
Begin
Bitmap:=Tbitmap.Create;
Bitmap.LoadFromFile(‘factory.bmp’);
Canvas.Draw(0,0, Bitmap);
Canvas.Font.Name:=’Arial Bold’;
Canvas.Font.Size:=13;
Oldstyle:=Canvas.Brush.Style;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(20,5,’Transparent background’);
Canvas.brush.Style:=OldStyle;
Canvas.TextOut(20,30,’solid background’);
Bitmap.Free;
end;




Энэ код нь форм дээр bitmap зурна. Дараа нь текст формд зураг нь дээр
transparent background –аар бичигдэнэ. Үр дүнг харж байхад background
transparent нь танд таалагдана. Мөн transparent background текстэнд
зураг
хавсаргана. Үүнийг уг номны XIII бүлэгт “Owner Drawn Status panels”
хэсэгт
үзнэ.
Draw Text функц
Windows API DrawText функц нь canvas дээр TextOut -аас илүү өргөн
боломжтой юм. TCanvas class -д DrawText method байдаггүй учраас
DrawText –ийг хэрэглэхдээ шууд дуудна. Эхлээд DrawText -ийн жишээг
хараад дараа нь энэ функцын тухай авч үзье.
Var
R:TRect;
begin
R:=Rect(20,20,280,80);
Canvas.Rectangle(20,20,280,80);
DrawText(Canvas.Handle,’An example of drawetext.’,-
1,R,DT_SINGLELINE or DT_VCENTER DT_CENTER);
end;
Эхлээд Rect -ийг windows API Rect функцаар анхны утга тогтоосоон
байна.
Үүний дараах мөр нь Canvas дээр rectangle буюу тэгш өнцөгтийг зурж
байна. Ингэхдээ тэгш өнцөгтийн түүн дээр зурагдах хэмжээг нь зааж өгнө.
Сүүлийн мөрөнд текст бичихдээ Drawtext функцыг дуудан бичиж байна.
Харин одоо энэ функцынхээ хоорондоо ялгаатай параметрүүдийг нь авч
үзье.
• Эхний параметр нь тухайн зургаа буюу жишээн дээрх тэгш өнцөгтөө
юун дээр зурахаа зааж өгнө.
• Хоёрдах параметрт string утга авч харагдах текстээ бичиж өгнө.
• Гуравдах параметрт зурагдах хэсгийнх тоог зааж өгнө. –1 утгатай
байвал энэ нь string-ийг бүтэнээр нь гаргана.
• Drawtext -ийн 4 дөх параметр TRect хувьсагчийг авна. Яагаад гэвэл
зарим Drawtext -ийн боловсруулалт тэгш өнцөгтийг хийхдээ
өөрчилдөг учираас энэ параметр хувьсагч авна.
• DrawText хэрхэн ажиллахыг энэ параметрт бичнэ. Параметр нь
текстээ бичих үед хэрэглэгдэх flag-ийг заана. Энэ жишээнд
DT_SINGLELINE, DT_VCENTER, DT_CENTER flag-ийг хэрэглэсэн
байна. Энэ flags нь текстийг дан шугамаар, хөндлөнгөөр нь голлуулж
гаргахыг илэрхийлж байгаа юм. Drawtext -д бараг 20 flags байдаг ба
тэдгээрийг тус тусд нь тодорхойлж болно. Би тэр болгоныг
тайлбарламааргүй байна учир нь Win 32 API –ийн online help -д
гүйцэт жагсааж бичсэн байдаг .
Өмнөх жишээндээ Drawtext функцдээ текстээ голлуулж Horizontally,
Vertically, both зэргээс нэгийг нь сонгон авсан. Та яг одоо энэ функцын ач
холбогдлыг ухаарахгүй байж магадгүй. Гэвч та хэрвээ owner drawn
components хийж эхлэхээр эсвэл own graphical compoment -aa бичиж
эхлэхээрээ хэрэгцээг нь мэдрэх болно.
procedure TForm1.Button1Click(Sender: TObject);
Var
R: TRect;
begin
R:=Rect(20,100,120,150);
DrawText(Canvas.Handle,'This text is too long.',-1, R,
DT_END_ELLIPSIS);
end;




Дээрх код ажиллахад үүсэх үр дүнд текст ингэж харагдана.
Хэрвээ та тэгш өнцөгт дотор текстээ багтахгүй урт гэж мэдвэл flag -ийг
хэрэглэж чадах боллоо. DT_CALCRECT flag нь текстийн багтаахад
хэрэглэх өндрийг боддог. Энэ flag –ийг хэрэглэж байхад харин текстээ
бичиж өгөхгүй . Windows текстийг багтаахад хэр зэрэг өндөртэй тэгш
өнцөгт байхыг хэлж өгнө. Тэгээд Windows багтах өндрөөр нь тэгш
өнцөгтийн зүүнээс эхлэн өөрчилж гүйцэтгэдэг байна. Энэ flag олон мөр
текстийг бичихэд маш чухал ач холбогдолтой байдаг. Доорх жишээнд
windows -оос текстээ багтаах тэгш өнцөгтийнхөө өндрийг асууж, тэр
өндрөөр нь тэгш өнцөгтөө зураад дээр нь текстээ бичиж байгаа
кодчилолыг бичив.
procedure TForm1.Button1Click(Sender: TObject);
Var
R: TRect;
S: string;
begin
R:=Rect(20,150,150,200);
S:='This is very long string which will '+'run into multiple lines of text';
DrawText(Canvas.Handle, Pchar(s),-1,R,DT_CALCRECT or
DT_WORDBREAK);
Canvas.Brush.Style:=bsSolid;
Canvas.Rectangle(R.Left,R.Top,R.Right,R.Bottom);
Canvas.Brush.Style:=bsClear;
DrawText(Canvas.Handle, Pchar(s),-1,R, DT_WORDBREAK);
end;




DrawText -ийн 2 дах параметр string биш текст параметр болохоор
массивын заагчийг шаарддаг учираас Pchar(s) гэж бичсэн байна.
Тэмдэглэл: Хэрэв та Delphi 1.0 –ийг ашиглаж байгаа бол String –г Pchar
луу болгохдоо StrPCopy функцыг хэрэглээрэй.
Жишээ нь:
Var
Temp: array [0..3]of Char;
R : TRect;
S : string
begin
DrawText(Canvas.Handle, StrPCopy(Temp,S), -1, R,DT_CALCRECT or
DT_WORDBREAK);
Харин Delphi 1.0 –ээс дээших хувилбаруудад бол Pchar –г өмнөх
жишээтэй
адил хэрэглээрэй . Энэ кодчилолоо формынхоо OnPaint event дээр
тавиад
програмаа ажиллуулаарай. Мөн текстийнхаа уртыг өөрчлөөд үзээрэй.

Ингэхэд энэ нь ямар ч асуудалгүй та хичнээн ихийг нэмж бичсэн ч тэгш
өнцөгт таны текстийн гаднаар хүрээлэгдсэн байх болно.
Зөвлөгөө: Хэрэв танд текст бичих олон cонголт хэрэгтэй байгаа бол
DrawTextEx функцыг хэрэглээрэй. Win32API-ийн online help –с
мэдээллийг
аваарай.
Тэмдэглэл: DrawText дээр текст бичих нь TextOut -ийг хэрэглэхээс арай
удаан байдаг. Хэрвээ таны зургийн боловсруулалт хурдан байх
шаардлагатай бол TextOutм-ийг хэрэглэх нь зохимжтой. Гэхдээ энэ 2 нь
зарчмын хувьд хоорондоо ялгаагүй юм. DrawText нь маш өргөн
хэрэглээтэй.
Bitmap зурах
Bitmap зурах нь нилээн хэцүү юм шиг санагддаг. Харин та үүнийг
үзсэнийхээ дараа маш хялбархан зүйл байна гэж бодох болно. Тэгэхээр
TCanvas –д Btmap зурахад зориулагдсан хэдэн method –ууд байдаг.
Эдгээрээс хамгийн их хэрэглэгддэг method бол Draw. Энэ нь Canvas
дээрх
гарах байрлалыг зааж өгөхөд л хангалттай. Одоо хэдэн жишээ авъя.
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
end;




Энэ жишээнд өгөгдсөн зургийн файлаас TBitmap обьект үүсгэж формын
зүүн дээд буланд гаргаж үзүүлж байна. Bitmap –даа ямар ч өөрчлөлт
оруулахгүйгээр гаргаж үзүүлбэл Draw -ийг хэрэглээрэй. Хэрвээ хэмжээг
нь
өөрчилж гаргамаар байгаа бол StretchDraw method -ийг хэрэглээрэй.
Ингэхдээ Bitmap -ийнхаа гарах тэгш өнцөгтийн хэмжээг зааж өгнө. Хэрвээ
Bitmap -ийн өөрийнх нь хэмжээнээс томоор заавал зураг чинь stretched
болж гарна. Харин жинхэнэ хэмжээнээс нь багаар зааж өгвөл багасгаж
гаргах болно. Жишээ нь:
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap: TBitmap;
R: TRect;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('c:co.bmp');
R:=Rect(0,0,100,100);
Canvas.StretchDraw(R,Bitmap);
Bitmap.Free;
end;




Тэмдэглэл: StretchDraw –аар bitmap -ийн жинхэнэ харагдах харьцааг
өөрчлөх гэж оролдсоны ч хэрэггүй. Яагаад гэвэл Bitmap -ийнхаа жинхэнэ
өндөр өргөнийхөө харьцааг хадгалж хамгаалсан байдаг. Мөн өөр нэг
CopyRect method байдаг. Энэ method үндсэн гарах тэгш өнцөгтийнхөө
бие
ба хуваагдах тэгш өнцөгтийнхөө очих биеийг зааж өгөхөд болно. Нэг
ёсондоо bitmap -аа хэсэгт хувааж үзүүлэх боломж өгч байгаа юм. Жнь:
Var
Bitmap: TBitmap;
Src: TRect;
Dst: TRect;
I, X, Y :Integer;
Strips: Integer;
Stripsize: Integer;
OldPal: Hpalette;
Begin
Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile(‘factory.bmp’);
Strips :=6;
Stripsize:=(Bitmap.Height div Strips);
OlsPal:= SelectPalette(Canvas.Handle,Bitmap.Palette,True);
For I:=0 to Pred(Strips) do begin
Src:=Rect(0,I*Stripsize)     .
Энд зургаа оруулж ирээд зурааснуудад зүсч санамсаргүйгээр байрлалыг
үзүүлж байна. Энэ кодыг өөрөө үндсэн формынхоо OnPaint handler
оруулж
туршиж үзээрэй. Тэгэхээр илүү ойлгомжтой болно. Зураг onPaint event
ажиллах болгонд зурагдах болно.
Тэмдэглэл: Өмнөх жишээнд Palette функцыг ашиглаж байхад формын
palette -ийг Bitmap Palette property –д тогтоож өгсөн. Учир нь canvas –т
Palette байдаггүй. Иймээс формдоо API -г ашиглаарай. Хэрвээ Palette -аа
тогтоож өгөөгүй бол формдээр Bitmap -ийг гарч байхад өнгө буруу гарна.
CopyRect method bitmap -ийг гаргахад бүтэц хэрэглэгддэг. Иймээс уг
функцийг хэргэлж байхад нэмэлт алхам шаардлагатай. Бас нэг өөр
bitmap
drawing method байдаг тухай дурьдахыг хүсч байна. the BrushCopy
method
үндсэн тэгш өнцөгтийн очих тэгш өнцөгт, зураг, transparent color -ийг зааж
өгөх боломжийг олгодог. Online help BrushCopy –д энэ method -ийг
хэрэглэхээсээ илүү ImageList component -ийг хэрэглэхийг зөвлөдөг.
BrushCopy method нь ImageList –ийг бодвол хэрэглэхэд хялбар, гоё
харагдуулах боловч хугацаа илүү зарцуулдаг. Хэрвээ transparent
background –тай bitmap -ийг хэрэглэж байгаа бол заавал BrushCopy -г
хэрэглээрэй.
Offscreen Bitmap
Offscreen bitmaps, мөн bitmaps memory гэж дуудаж болдог. Энэ нь
Windows
програмчлалд энгийнээр хэрэглэгддэг. Offscreen bitmaps танд зургаа
санах
ойд хадгалчихаад дараа нь Draw method –оор үзүүлэх боломж олгодог.
Offsreen Bitmaps help богино хугацаанд дэлгэцэнд гаргахын тулд
ашиглагддаг. Энэ нь олон удаа шууд зурахад гардаг анивчих үзэгдлээс
зайлсхийдэг. Мөн complex Bitmap програмчлахад маш зүгээр байдаг.
Зургаа санах ойд хадгалаад дэлгэцэнд үзүүлэхад бэлэн болгож
бэлтгэдэг.
OffscreenBitmaps Microfofts DirectX SDK animation –д хамгийн өргөн
дэлгэрсэн шинэ технологи. Offscreen Bitmap -ийн процесс 3 алхамаас
бүрдэнэ. Үүнд:
1. Bitmap memory үүсгэнэ.
2. Bitmap memory дээр зурна.
3. Bitmap memory –г дэлгэц руу хуулах.
Memory Bitmap үүсгэх
Bitmap memory (санах ой ) үүсгэх нь хялбар байдаг. Memory Bitmap –аа
үүсгэж байхад цаг тутамд TBitmap объект үүсэж байх болно. Энэ үед
memory bitmap -д файлаа хадгална. Дараа нь memory bitmap үүсгээд,
хэмжээг зааж өгч гаргана.
Жишээ нь:
Form дээр нэг button авч түүнийхээ OnClick event –д туршиж үзээрэй.
Button
дарах бүрд тэгш өнцөгт санамсаргүйгээр зурагдан дэлгэцэнд харагдах
болно. Bitmap memory хялбархан зурагдах ба canvas –т Bitmap –аа
хуулдаг. Хэрэв 256 өнгөт video adapter хэрэглэж байгаа бол өнгөнүүд
dithered болно. Учир энь жишээнд Palette хийгээгүй болно.
Тэмдэглэл: Memory Bitmap үүсгэж байхдаа Bitmap ийн өнгө video үзүүлэх
өнгөний тохиргоотой ижил байх ёстой. Хэрвээ video display 256 өнгөн
дээр
сонгосон бол Bitmap 256 өнгөтэй байна. харин 24 - 32 bit video display -
тай
бол memory bitmap 32k, 64k эсвэл 16 сая өнгөтэй байх болно.
Memory Bitmap –г хадгалах
Memory Bitmap –г хадгалахдаа SaveToFIle процедурыг дуудна.
BITMAP.SAVETOFILE(‘TEST.BMP’); Та нар програмынхаа дэлгэцийг
амархан үүсгэж чаддаг. Энэ бүгдийг та үнэндээ memory Bitmap –д
дэлгэцийнхээ хэсгийг хуулж байгаа юм.
Multimedia Programming
Multimedia programming гэдэг үг нь олон утгыг илэрхийлдэг. Учир нь
multimedia program -д боломжийн бүх өргөн хүрээг өөртөө агуулсан
байдаг.
Multimedia нь ердийн wave audio, MIDI video clips, animation зэргийг
багтаадаг. Зарим хүмүүс multimedia програмчлалыг тоглоомын
програмчлалтай андуурдаг. Тоглоомын програмчлал нь multimedia –тай
гарцаагүй холбоотой болдог. Гэвч sound, video –той илүү холбоотой.
Одоо graphics эсвэл multimedia API -ийн тухай тодорхой хэлбэл OpenGL
эсвэл DierctDraw -ийн тухай авч үзье. Graphics програмчлалын тухай их
мэдээлэлтэй ном хэрэглэвэл сайн мэргэжих болно. Delphi 4.0 Unleased
(ISBN: 0-672-312-859) ном сайн сонголт байх болно.
TMediaPlayer компонент
VCL нь хялбарханаар Multimedia удирдах MediaPlayer компонентоор
хангадаг. Энэ компонент нь Component Palette –ийн System tab -д
байрладаг. Wave files, AVI video     -г тоглуулж чадна. TMediaPlayer –ийг
хэрэглэхэд маш амархан. Зөвхөн Wave file тоглуулахын тулд би
PlaySound
функцыг өмнөх жишээнд хэрэглэсэн. Энэ контролд Play, Pause, Stop,
Next,
Previous, Step, Back, Record, Eject гэсэн button -ууд байдаг.
MediaPlayer -ийн формыг үзүүллээ.




Энэ MediaPlayer-ийг хэрэглэх маш энгийн юм. FileName property –д
multimedia файлын нэрийг оноосноор товчин дээр дарахад тоглуулж
эхэлдэг. Ингэхдээ .wave, .mid, .avi file –уудыг сонгож болно. Та
MedioPlayer -аа илүү сонирхолтой хиймээр байгаа бол сайн ухаж төвхөж
үзээрэй. Зарим нөхцөлд MediaPlayer -ийн visual control bar их зүгээр
харагддаг. Магадгүй та MediaPlayer –аа control bar (Items –гүйгээр)
хиймээр байгаа бол MediaPlayer –ийн Play, Start, Stop, Rewind кодыг
нарийн аргаар хийгээрэй. Хэрвээ Media Player -ийн runtime үед
харагдуулахгүйг хүсвэл Visible –г False утгатай болгоорой.
Wave Audio ба Windows API
Windows API function –ний тухай энгийн зүйлүүдийг яримааргүй байна.
Wave файлыг тоглуулхад Win32API –ийн PlaySound функцийг ашиглаж
болно. Эхлээд та нар Mmsystem –ээ өөрийнхөө хэрэглэгчдийг list
болгохоор нэмнэ. Дараа нь PlaySound функцээ доорх байдлаар дуудна.
PlaySound(‘test.wav’,0,SND_FILENAME);
Амархан байгаа биз? PlaySound –н эхний параметрт ямар файл
тоглуулахаа зааж өгнө. Сүүлийн параметрт дуу хэрхэн тоглогдох flag -ийг
тогтоож өгнө. Дискнээс wave audio тоглуулж байхдаа сүүлчийн параметрт
та SND_FILENAME гэж тогтоож өгнө. Та өөр flag зааж өгч болно. Харин
энэ
тохиолдолд зөвхөн PlaySound функц нь мөн дискэндээр файлтай ижил
sounds system тоглуулж чадна. Cистемийн дууг тоглуулахдаа эхний
параметрт нь sound alies -ийг зааж өгнө. Харин flags параметрт
SND_ALIES
гэж жишээндээ зааж өгчээ.
PlaySound (‘SystemAsterisk’,0,SND_ALIES);
Энэ код нь системийн дуу Asterisk –ийг тоглуулна. Системийн дууны
жагсаалтыг олж авхыг тулд Сontrol Panel –ийн Sound аpplet –ийг
ажиллуул.
Хэрвээ системийн дуу олдохгүй бол windows default дууг тоглуулна.
Default
дуу нь ding байдаг.
Тэмдэглэл: Win32API MessageBeep функц мөн system sound -г
индексийн
дугаараар нь тоглуулдаг. Win32 online help –с MessageBeep -н тухай бүх
мэдээллийг хараарай. Play sound функц дуудах үед 2 өөр чухал flags
байна.
• SND_ASYNC flag нь дууг асинхрон тоглохыг зөвшөөрдөг. Энэ flag
хэрэглэгдэж байхад дуу тоглож эхлэхдээ шууд програмын тоолуурыг
програмруу буцаадаг. Энэ нь таны програм дараагийн командаа
ажилуулж байхад sound тоглосоор байх болно гэсэн үг.
• SND_SYNC flag нь дууг тоглож дуусах хүртэл програмын тоолуурыг
програмруу буцаахгүйгээр зааж өгдөг. SND_SYNC нь PlaySound –н
default учираас энэ flag-г тодорхойлж өгөх хэрэггүй. Энд маш олон
flag-ууд PlaySound -р дууг яаж тохируулахад хэрэглэгдэнэ. Бүрэн
мэдээллийг Win32 online help дээр PlaySound функц гэсэн хэсгээс
хараарай.
MediaPlayer –ийн Properties, Method, ба Event
TMediaPlayer –т маш олон property байдаг. Тэдгээрийн ихэнх нь
ойлгоход хялбар, харин зарим нь бага зэргийн төвөгтэй байдаг.
TmediaPlayer -ийн үндсэн гол шинж чанаруудыг жагсааж бичив.
Property Тайлбар
TMediaPlayer –т мөн олон method байдаг.
roperty Тайлбар
TMediaPlayer компонентод зөвхөн нэг event байдаг. OnNotify event нь
команд гүйцэтгэж дуусхад дуудагддаг. Харин зөвхөн Notify property -гийн
утга true үед та алдааг шалгаж болно. NotifyValue Property нь утгыг харах
үйлдлийг амжилттай эсэхийг заана.
Wave Audio
Multimedia -гийн олон үндсэн үйлдлүүдийн нэг нь Wave audio тоглуулах
юм.
энэ нь магадгүй ердийн үйлдэл юм. Wave file synchronously тоглуулж
байхад:
Play.wait:=true;
Player.filename:=’testwav.wav;
Player.open;
Player.play;
Энд wave property true wave файлын тоглох төлөв нь synchronously
байна.
Player.FileName := ‘test.wav’;
Player.Open;
Player.StartPos := 1000;
Player.EndPos := 3000;
Player.Play;
Тэмдэглэл: Хэрэв StartPos, EndPos –ийн утгууд буруу байвал wave
файлыг тоглуулж чадахгүй. Буруу өгөгдөл гэдэгт startPos, EndPos –ээсс
их
эсвэл EndPos –ийн утга Media файлын уртаас их зэрэг багтана.
Дууны хэмжээг тохируулах
Wave төхөөрөмжийн дууг тохируулах нь харьцангуй амархан зүйл юм.
Windows API үүнийг хийнэ. WaveOutgetvolume ба WaveOutsetvolume
функцүүд дууны цар хүрээг тохируулж чадна. Volume нь integer утга авна.
Өндрийг нь баруун, сулыг нь зүүн талын volume тохируулгаар хийнэ. Тэг
утга нь дуугүй ба $FFFF (hex) байвал хамгийн чанга гэх мэтчилэн өгнө.
waveOutSetVolume(0, $FFFFFFFF);
WaveOutsetVolume функц нь зөвхөн wave бүтээгдэхүүний дууг
тохируулна.
Master дууг зөвхөн multimedia mixer control -оор тохируулдаг.
Wave Audio бичлэг хийх
Уг сэдэв нь тийм амар зүйл биш. Яагаад гэвэл wave файл бичихдээ
эхлээд
бичигдэх wave файлаа нээнэ. Энэ нь бичихтэйгээ ижил параметртэй
шинэ
файл байна. Тэгээд дараа шинэ өгөглөө бичнэ. Filename property -ийн
name -ийг өөрчлөх ба түүндээ хадгална. Энэ бүгд бага зэрэг төвөгтэй.
Жишээ нь:
Filename DUMMY.wav энэ файл 22050kHz –ийн WaveFormat -тай болно.
Товчин дээр дарах үед та wave audio -оор бичиж эхэлнэ. Энэ үед бичих
үйл
явц эхэлчихсэн ба удирдлага таны application руу буцаана. Одоо зогсоох
хэрэгтэй . Доор жишээнд үзүүлэв.
procedure TForm1.StartBtnClick(Sender: TObject);
begin
with MediaPlayer do begin
FileName := ‘dummy.wav’;
Open;
Wait := False;
StartRecording;
end;
end;
procedure TForm1.StopBtnClick(Sender: TObject);
begin
with MediaPlayer do begin
{ Бичих процесийг зогсоож байна }
Stop;
{ файлын нэрийг өөрчилөн, хадгална}
FileName :=’new.wav’;
{ Хадгалах ба хаана }
Save;
Close;
end;
end;
Тэмдэглэл: Бичиж байх үед энэ алхамыг wave audio recording гүйцэтгэх
шаардлагатай. MediePlayer -ийн байрлалыг олохын тулд Record method
дууд. Бичлэг хийх үзүүлэлтүүд нь дараах байдалтай байна. Үүнд: хурд,
хоолойны тоо (mono, stereo) bits –н тоо, (ихэвчлэн 8 эсвэл 16) зэрэг хэв
маягууд байдаг. Ердийн wave form -ийн тоглуулах давтамж нь 8000kHz,
11025KHz, 22050kHz, 44150kHz байдаг. Хамгийн өндөр давтамжтай audio
бичлэг дээд зэргийн чанартай. Магадгүй та тоглоом хийгээгүй бол
stereorecord -ийг хэрэглэхгүй байх. Мөн bits -ийн тоо нь дуу бичлэгийн
чанарт нөлөөлдөг. Энэ нь ихэвчлэн 8 эсвэл 16 байдаг.
Тэмдэглэл: Өндөр чанартай дууг бичих дискны ихэнх зайг ихээр эзэлдэг.
Wave file -аа stereo -оор бичиж байхад нэг хоолойгоор бичсэн файлаас
хэмжээ нь 2 дахин их болдог. 16 bits –г хэрэглэх нь wave файлаа 8 bits
дээр
тавьж 2 дахин бичсэнтэй адил юм. Файлаа 22050kHz хурдтай, тоон ба 8
bits per -тай бичсэн бол энэ нь 200K. Үүний адилаар 22050kHz stereo 16
bits per-р бичсэн бол 800K болно. Ихэнхдээ stereo, 16 bits per -ээр бичих
нь
дискны зайг ихээр эзэлдэг. 22050kHz, тоо нь 8 bits per -ээр бичих нь
зүгээр
байдаг ба дууны чадал файлын хэмжээнд тохирдог.
MIDI Audio
MIDI audio –гийн талаар ихийг нурших хэрэггүй байх. Үүнийг та
MediePlayer
-ийн FileName property –д MIDI файл гэж сонгоод Play method –ийг
дуудахад болно. Ихэнх sound card нэг зэрэг 2 wave file –ийг тоглуулах
боломж өгдөггүй. Үүнтэй адил нэгэн зэрэг нэгээс олон file-ийг MIDI file –д
тоглуулах боломжгүй байдаг. Хэдийг ийм боловч MIDI file болон wave file
2
-ийг зэрэг тоглуулах боломжийг олгодог. Энэ нь тоглоом тоглож байхад
Music Track ба Sound effect нэгэн зэрэг тоглуулж байдгийг хэлж байгаа
юм. Та ингэж Wave, MiDI файлуудыг зэрэг тоглуулмаар байвал
MediaPlayer -ийн компоненттэй ажиллана. Тоглуулахдаа MediaPlayer –аа
MIDI файлд, PlaySound –аа wave файлд хэрэглээрэй. MIDI file ихэвчлэн
тоглоомын background дуунд хэрэглэгддэг. Хэрвээ MIDI file -аа ийм
байдлаар хэрэглэж байгаа бол дуу төгсгөлдөө хүрэх үед дахин эхлүүлж
байгаарай. TMediaPlayer –нь ийм дууг үргэлжилснээр нь тоглуулж
чаддаггүй. Ийм боловч та MideaPlayer-н OnNotify event –ийг давтах
эффект
болгож хэрэглээрэй.
Үүний дараа OnNotify event handler –аар хангах хэрэгтэй. Энэ event
handler –т амжилттай тоглож дууссаны дараа MIDI дахин эхлүүлэх
кодчилол хэрэгтэй. Жишээ нь:
procedure TForm1.MediaPlayerNotify(Sender: TObject);
begin
with MediaPlayer do
if NotifyValue = nvSuccessful then begin
Position := 0;
Play;
end;
end;
Энэ жишээ нь NotifyValue property -г nvSuccessfull утгатай эсэхийг шалгаж
байна. Position 0 байна. Энэ нь файл дахин тоглож эхэлснээр play method
дуудагдана гэсэн үг. Энэ бүгд маш энгийн байна. Хэдэн ярвигттай
асуудлууд бий. Тэдгээрийн талаар мэдэж авах ёстой. Эхнийх нь Position
property 0 гэж өгсөн.
Энэ нь файлыг дахин эхлэлд нь эргүүлэх нөлөөтөй. Хэвээ autoRewind
property true утгатай байвал энэ нь боломжгүй. Хоёр дах нь энд нилээд
хэдэн MediaPlayer үйл ажиллагаа байна. түүнийг мэдэж авах . Энд
OnNotify
event NotifyValue нь successful утгатайгаар дуудагдаж байгаа үйлдэл юм.
Жишээлбэл утга нь nvSuccesfull утгатай байвал команд дуусахаас
хамааран Stop командын үүрэг гарна.
CD Audio
CD тоглуулах нь харьцангуй амархан. CD тоглуулахдаа Device Type
property –г dtCDAudio -аар тогтоож мөн Play button дарагдахад эсвэл Play
method дуудаарай. CD Audio тоглуулахын тулд CDAudio –д Different
TimeFormat хэрэглэгддэгийг ойлгох хэрэгтэй. Та TMSF –ийг хэрэглэж
байгаа бол (цаг, минут, секунд, фрайм) TimeFormat тодорхой мөр эсвэл
current байрлалаас тодорхой мөр лүү гэсэн мэдээлэлтэй болно. Ямар нэг
минут , секунд эсвэл фраймын утгыг мөрийн дугаар болгож тавья.
Жишээнд current track дотрох playing position-г string –р зааж өгч байна.:
var
Time : Integer;
Track : Integer;
Minutes : Integer;
Seconds : Integer;
TimeStr : string;
begin
MediaPlayer.TimeFormat := tfTMSF;
Time := MediaPlayer.Position;
Track := mci_TMSF_Track(Time);
Minutes := mci_TMSF_Minute(Time);
Seconds := mci_TMSF_Second(Time);
TimeStr := Format(‘Track Time: %2.2d:%2.2d’, [Minutes, Seconds]);
Label1.Caption := ‘Track: ‘ + IntToStr(Track);
Label2.Caption := TimeStr;
end;
Эхлээд TimeFormat –ийг TMSF гэж өгч байна. Дараа нь Time дуудагдаж
current position -ний хэмжигдхүүн хадгалагдаж байна. Track, Minute,
Second
гэсэн өөр утгууд windows Time-ийн (mci_TMSF_Track ) гэсэн
өөрчлөлтйиг
авч байна. MM system unit –д macro -yудыг агуулагддаг. Хэрэв эдгээр
макронуудыг хэрэглэвэл энэ хэсгээ та өөрийнхөө uses List -д нэмээрэй.
Өөрсдийнхөө цагийн утгуудыг авч дууссаны дараа Time string мөрийн
цагийг үзүүлэхээр үүсгэнэ. Тэгээд мөрийн дугаар ба мөрийн цаг Label
component -д гарч ирнэ. MSF (minute,second,frames) –ийг гэсэн
TimeFormat
хэрэглэж байгаа CD global level авах болно. Жишээ нь MSF TimeFormat –
ийг current podition –г CD –ний эхлэл гэсэн хуучин хэвд оруулахад
хэрэглээрэй. Үүнтэй ижил MSF TimeFormat -ийг CD -ний current position -г
CD дээрх 30 минутын хэмжээтэй мөрд гэж зааж өгч болно. Доорх жишээ
нь мөрний тухайд биш яаж буцааж хуучин хэвд нь оруулан үзүүлж
байгааг
харуулав. CD дээрх минут ба секундийг current position :
var
Time : Integer;
Minutes : Integer;
Seconds : Integer;
TimeStr : string;
begin
MediaPlayer.TimeFormat := tfMSF;
Time := MediaPlayer.Position;
Minutes := mci_MSF_Minute(Time);
Seconds := mci_MSF_Second(Time);
TimeStr := Format(‘Total Time: %2.2d:%2.2d’, [Minutes, Seconds]);
Label3.Caption := TimeStr;
end;
Энэ жишээ нь СDPlayer тоглуулах програмыг агуулсан байна. Мөн
TMediaPlayer Audio CDPlayer -ийг үүсгэхэд хэрхэн хэрэглэгдэж байгааг
багтаасан байна.
AVI Video
TmediaPlayer -ээр AVI video тоглуулахын тулд AVI файлаа сонгоод Play
method –оо дуудна. (эсвэл Play button дарна.) Хэрэв default MediaPlayer –
ийн тохиргоо хэрэглэж байгаа бол тусдаа цонх нь pop up болж AVI
үүндээр
гарах болно. Мөн Display Property -г ямар нэг цонх төрлийн компонентийг
зааж өгснөөр video тэр компонентийн мужид тоглох болно.
Жишээ нь: Panel дээр AVI video -гоо тоглуулбал дараах хэлбэртэй бичнэ.
MediaPlayer.Display := AVIPanel;
Panel дээр AVI video тоглуулж байхад дүрс харагдах болно. Хэрэв video
нь
Panel -ийн тэгш өнцөгтөөс том тэр video Panel –д хайчлагдаж хэмжээг нь
бүрэн гаргахгүй болгоно. Үүнийг Strech эсвэл Shrink болгож video -гоо
харвал DisplayRect property -г Stretch эсвэл Shrink гэж зааж өгөөрөй.
MEDIAPLAYER.DISPLAYRECT := AVIPANEL.CLIENTRECT;
Үүнд AVI video –ны олон төрлийн format байна. Гэвч бүх AVI –г system
дүүрэн тоглохгүй. Хэрвээ баталгаатай тоглуулахыг хүсвэл standard
Microfoft AVI video type -ийг оруулаарай. Яагаад таны хэрэглэгч гарцаагүй
Microsoft AVI суулгасан байна.
 Тайлан бэлдэх ба QuickReport, Crystal Report

Тайланг маш олон хэлбэр янзаар тодорхойлж болно. Бидний зорилго бол
өгөгдөлийн сангаас шаардлагатай өгөгдөлийг боловсоруулан гаргаж
хэвлэж авах юм.

   -   -   TquickRep
   -   -   TpageHeaderBand
   -   -   TtitleBand
   -   -   TcolumnHeaderBand
   -   -   TdetailBand
   -   -   TsummaryBand
   -   -   TpageFooterBand

   TquickRep
   - - bands
   - - Dataset
   - - Frame
   - - Options
   - - Page
   - - PrinterSetings
   - - ReportTitle
   - - Unit
   - - Zoom

      Тайлан боловсоруулах хэргэсэлүүд нь өөрсдийн тогтсон бүтэц
   форматтай байдаг ч бүгдээрээ өгөгдөл дүрсэлж харуулах бараг ижил
   тогтсон дэс дарааласан групүүптэй байдаг. Харин тэдгээрийн боломж
өгөгдөлийн сантай хэр зохицон ажиллах, ашиглах үеийн, хэргэлэгчийн
орчин зэрэг хүчин зүйлүүдээр ялгаатай байдаг.

Хялбар тайлан
Дараах зүйлүүдээс тогтно.
TquickRep бол өгөгдөлийг бүлэглэн гарагч юм. Бүлэглэх гэдэг нь:
тайлан хэд хэдэн хэсгээс тогох бүрдэх бөгөөд тэдгээр дээр тайлангийн
хэсэг нь орших юм.
Энгийн халбар тайлан гаргахад дараах component шаардлагатай.
-Ttable
-Tquickrep
- деталчлан харуулах хэсэг(BANDs)
-QrdbText

1.   Ttable –д тайланд ашиглах өгөгдөлийн санг нээх
2.   Tquickrep –н Dataset –д Ttable-г зааж өгөх
3.   TquickRep-н Band’s –г нээж Has Detail –г true болгох
4.   TqrdbText –г Detail хэсэгт байрлуулж Dataset болон datafield-г зааж
     өгнө.


-    - TpageHeaderBand
     Хуудас бүрийн дээд хэсэгт харуулах зүйлийг байрлуулна.




-    - TtitleBand
     Тайлангийн гарчиг . Хэвлэгдэх зүйлийн эхэнд нэг удаа гарна.
-   - TcolumnHeaderBand
    Хуудас бүрийн эхэнд хэвлэгдэх зүйлийг




-   - TdetailBand
    Бичлэг бүрийг харуулах
-  - TsummaryBand
   Detail бүрийн талбаруудын нийлбэр олох, тооцоолох гм үйлдэл
хийдэг




-   -   TpageFooterBand
Хуудас бүрийн дор гарах өгөгдөлийг




Web Програмчлал
Вэб програмчлал нь 2 үндсэн хэсэгт хуваагддаг.
   1. Статик Вэб програмчлал
   2. Динамик Вэб програмчлал
Статик Вэб програмчлал нь үндсэн тагуудыг ашиглссан HTML (Hyper
Terminal Markup language) скрипт юм.
Вэб нь үндсэн(basic) HTML –ын тухайн таг эхэлсэн бол түүгийг заавал
дуусгах ёстой гэсэн дүрмийг баримталдаг.
Үндсэн HTML програмчлал нь 2 хэсгээс бүрддэг.
   1. Толгой
   2. Эх бие
Толгой хэсэгт зарлалт буюу тодорхойлолтууд байдаг.
Эх бие хэсэгт нь бидний нүдэнд харагдах мэдээлэл байралдаг.
Толгой болон эх бие нь тогтсон бүтэцтэй байдаг.
Жишээлбэл толгой нь хэсэг нь:
<HTML>
<HEAD>
<TITLE>My First Web Page< /TITLE >
<STYLE> …</STYLE>
<SCRIPT LANGUAGE=”JAVASCRIPT”>
</SCRIPT>
</HEAD>

байдаг бас бие хэсэг нь:
<BODY>
….
</BODY>
</html>

Статик вэб хуудасыг зарим талаар хөгжүүлж DHTML гаргасан.
Энэ нь үндсэн хэсэг дээрээс хэмэгдэж Layer … гэх мэтчлэн тагууд
нэмэгдсэн.

Динамик вэб програмчлал нь үндсэн HTML-тэй адил боловч ялгарах
онцлог нь тусгай програмчлалын хэл дээр үндэслэгдэж үүсдэгт оршно.
Динмамик HTML –д дараах хэлүүд хамаарна.
   - - PHP
   - - ASP
   - - JSP
   - - CFM
   - - CGI зэрэг орно.
   Яагаа эдгээр прогамчлалын хэлийг динамик нэрлэх болсон нь сервэр
   дээрх скрипрт нь боловсруулагдаж хэрэглэгчдэд зөвхөн үр дүн нь
   очдог.
   Жишээлхэд JavaScript програмчлал нь хэрэглэгчдэд ил, нууцлалтгүй
   байдаг.

   Жишээлбэл PHP прогамчлалыг хэл дээрх скриптыг үзие.
   <?
    Print(‘<html><head><title>My first web page</title></head>’);
   $too=5;
   $too=$too*$too;
   print(‘<body>Too=$too’);
   print(‘</body></hrml>’);
   ?>


Инээгд Delphi програмчлалын хэл дээр яаж Web application бичих талаар
үзие.


TABLE BD.1. NETMASTERS ACTIVEX INTERNET CONTROLS.

Control            Description
TNMDayTime         Obtains the date and time from Internet daytime servers.
TNMEcho            Sends text to and receives text from Internet echo servers.
TNMFinger          Obtains information about a user from an Internet finger server.
TNMFTP             Performs file transfers between networked machines using FTP
                   (File Transfer Protocol).
TNMHTTP            Performs file transfers using HTTP (Hypertext Transport
                   Protocol). Hypertext documents are normally viewed in a Web
                   browser. You use THTTP to retrieve Web documents that don't
                   need to be displayed in a Web browser.
TNMMsg             Sends simple ASCII text messages using TCP/IP.
TNMMSGServ         Receives messages sent with the TNMMsg control.
TNMNNTP            Sends messages to and receives messages from Internet news
                   servers using NNTP (Networking News Transfer Protocol).
TNMPOP3            Retrieves email messages from mail servers using POP3 (Post
                   Office Protocol).
TNMUUProcessor Encodes or decodes MIME or uuencoded files.
TNMSMTP            Sends email through SMTP (Simple Mail Transfer Protocol)
                   mail servers.
TNMStrm            Sends data streams to a network or Internet stream server.
TNMStrmServ        Receives streams sent by the TNMStrm control.
TNMTime            Obtains the date and time from Internet time servers.
TNMUDP             Transfers data across networks using UDP (User Datagram
                   Protocol).
TPowersock         Encapsulates the Winsock API.
TNMGeneralServer Used for general TCP/IP servers.
THTML              Displays HTML (Hypertext Markup Language) files. This is a
                   Web
                   browser component.
TNMURL             Converts URL data to a readable string and string data to URL
                   format.



TABLE BD.2. NATIVE VCL INTERNET COMPONENTS.

Component     Description
TClientSocket Manages a TCP/IP client socket connection.

Жишээ: Web Browser
  1. New Application үүсгэ
  2. Panel 60 өдөртэй дээд хэсэгт байрлуулах
  3. Panel дотроо combobox тавих (URL),3 button тавих
  4. Statusbar тавих
  5. HTML control-г Client-ээр тавих

   Дараа нь URL combobox –н ард
Onclick
if URLComboBox.Text <> `' then
  HTML.RequestDoc(URLComboBox.Text);


OnKeyPress




if Key = Char(VK_RETURN) then begin
  Key := #0;
  if URLComboBox.Text = '' then
    Exit;
  URLComboBoxClick(Sender);
   end;

   Progressbar гүйлгэх
procedure TWebMain.HTMLUpdateRetrieval(Sender: TObject);
var
 Total : Integer;
 Done : Integer;
 Percent : Integer;
begin
 Total := HTML.RetrieveBytesTotal;
 Done := HTML.RetrieveBytesDone;
 if (Total = 0) or (Done = 0) then
   Percent := 0
 else
   Percent := ((Done * 100) div Total);
 StatusBar.SimpleText := Format(
   `Getting Document: %d%% of %dK', [Percent, Total div 1024]);
end;

OnEndRetrieval

StatusBar.SimpleText := `Done';
Delphi

More Related Content

PDF
Sedev 1
PDF
Vizual programchilal cu lekts
PPTX
программын хэл гэж юу вэ
PPTX
шийдвэр гаргах номиналь бүлгийн арга
PDF
C cons
PPSX
бодлого C++
PDF
Diplom ep
PDF
4 дүрс боловсруулалт - р.оюун
Sedev 1
Vizual programchilal cu lekts
программын хэл гэж юу вэ
шийдвэр гаргах номиналь бүлгийн арга
C cons
бодлого C++
Diplom ep
4 дүрс боловсруулалт - р.оюун

Viewers also liked (20)

ODP
Лекц-1
PDF
For давталт ашиглах
PPTX
Lec1 pragraming language
ODS
тест нараа
PDF
Lec2 c++helnii undeslel
PPTX
Java lecture3
PDF
Лекц 2 (Блок схем)
PDF
Лекц 3 (Давталт)
DOC
10r angiin jishig daalgawar
PPT
Програмчлалын хэл
PDF
алгоритмчлалын үндэс
ODS
цахим тест
PPTX
лекц-1
DOCX
лекц 2
PDF
Lab3 it101
PDF
Лекц 7 (Давталтуудын Си хэлэнд)
PPT
тооллын сис 10т 2т
ODP
си хэл 10
PPTX
Business idea evaluation
PDF
Dev c хичээл
Лекц-1
For давталт ашиглах
Lec1 pragraming language
тест нараа
Lec2 c++helnii undeslel
Java lecture3
Лекц 2 (Блок схем)
Лекц 3 (Давталт)
10r angiin jishig daalgawar
Програмчлалын хэл
алгоритмчлалын үндэс
цахим тест
лекц-1
лекц 2
Lab3 it101
Лекц 7 (Давталтуудын Си хэлэнд)
тооллын сис 10т 2т
си хэл 10
Business idea evaluation
Dev c хичээл
Ad

Similar to Delphi (20)

PDF
C++ суулгах
PPTX
лекц-2
PPTX
Лекц 2
PDF
C# hicheelin lekts
PPT
Lecture1
DOC
Sw206 lec
PDF
Lecture13,14
PPTX
Андройд үйлдлийн системийн аппликейшний суурь ухагдахуунууд
PPTX
Windows1
PDF
Lekts1
PDF
Lekts1
PDF
Lekts1
PPTX
PDF
PPTX
Lekts 3
PPTX
Windows1
PPTX
Windows1
PPT
004 компьютерын програм хангамж
DOCX
203lab1
PDF
Lekts4
C++ суулгах
лекц-2
Лекц 2
C# hicheelin lekts
Lecture1
Sw206 lec
Lecture13,14
Андройд үйлдлийн системийн аппликейшний суурь ухагдахуунууд
Windows1
Lekts1
Lekts1
Lekts1
Lekts 3
Windows1
Windows1
004 компьютерын програм хангамж
203lab1
Lekts4
Ad

Delphi

  • 1. Windows үйлдлийн системийн ерөнхий зохион байгуулалтын талаар товчхон Windows-н өмнөх хувилбарууд MS-DOS үйлдлийн системтэй сайн зохицон ажилладаг боловч үйлдлийн систем гэсэн утгандаа бүрэн хүрч чадахгүй байсан бол өнөөгийн Windows95 өөрөө 1 цогц үйлдлийн системийг илэрхийлж чадах болжээ. Windows95 үйлдлийн систем нь ерөнхийдөө 3 дэд системд хуваагддаг. 1. Win KERNEL 2. Win GDI 3. Win USER Windows95 нь 16 болон 32 битийн программуудыг ажиллуулахдаа системийн виртуаль машин болон дээрхи 3 дэд системийн тусламжтайгаар зохион байгуулдаг. Системийн виртуаль машин гэдэг нь Windows-н бүх ажлыг дэмжиж байдаг Windows95-н бүрэлдхүүнд ордог үйлдлийн орчин юм. Мөн дээрхи 3 дэд системийн ажлыг дэмжиж байдаг. 32 битийн win гэдэг нь санах ойн 32 битийн моделийг ашиглаж байдаг windows-н шинэ хэрэглээ юм. Харин 16 битийн win гэдэг нь бидний урьд өмнө хэрэглэж байсан windows-н хуучин хувилбарууд юм. Тэдгээр нь санах ойн сегментийн хаяглалтийг буюу чухамдаа 80286 процессорын санах ойн моделийг ашигладаг. Тэдгээр нь Windows 3.x –нх шиг ажиллахдаа Windows95 нх шиг нэгдмэл нэг орон зайг хуваан эзэмшдэг бөгөөд олон бодлогын зарчимтай зохицодоггүй. Windows95-н хэрэглээний программийн төвшинд Windows 3.x –н API бүрэн тохирч ажилладаг. Win32 API нь Microsoft –н WinNT, Win32S, Win3.1-н өргөтгөл win32 битийн интерфейс юм. Windows95 үйлдлийн систем нь олон бодлогын аргад үндэслэн дээрх application-уудыг жолооддог. Бүрхүүл гэдэг нь хэрэглэгчийг системтэй харилцах үйлдлийг хангаж байдаг 32 битийн Windows application юм. Windows95-н бүрхүүл нь windows3.x-н программ менежер, файл менежер зэргийг нэгтгэсэн application юм. KERNEL KERNEL нь windows-н доод түвшиний динамик санах ойн функцүүдээр хангаж өгч байдаг үйлдлийн системийн цөм юм. Энэ нь 16 ба 32 битийн windows-н үйлдлүүд тохирох үйлчилгээг хангадаг. GDI GDI нь graphic device interface гэсэн товчилсон үг. Энэ нь Windows95-н график боломж болон дэлгэцэнд харуулах өнгө, хэлбэр дүрс, resolution-г хангаж байдаг. Win32 –т байдаг бүх шинэ боломжуудыг агуулна. USER USER нь дэлгэцийн диспетчер юм. Windows-н интерфейсийг үүсгэх, удирдах функцүүдийн цргц юм. Жишээ нь Хэрэглэгч хэд хэдэн MS-DOS –н Prompt гарган ашиглаж болно. Хэрэглэгч арай илүү виртуалчилах боломжийг хангадаг хэд хэдэн давуу тал гарч ирлээ. Системийн виртуаль машин Windows-н API функцийн төвшин Дээр харлуулсан орон зайг хамтарч эзэмшинэ. Энэдээс Windows95 нь 16 битийн программуудад тусад нь орон зай гарган өгч орчинийг нь бүрдүүлж өгдөг нь харагдаж байна. Windows 32 bit Windows 32 bit 16 bit 16 bit Бүрхүүл
  • 2. Windows-н дэд систем Win KERNEL KERNEL Win USER Win GDI Файл удирдах дэд систем Сүлжээ удирдах дэд систем Үйлдлийн системийн үйлчилгээ Виртуал машин удирдах дэд систем Хөтлөгч хэрэгслүүд Бүрхүүл Энэ нь хэд хэдэн системийн удирдлагыг хэрэглэх нөөцүүдийн боломжуудаар хангах программ юм. Windows95-үйлдлийн системийн бүрхүүл нь дэлгэц системийн нөөцүүдтэй харилцан ажиллахыг удирдан зохион байгуулдаг. API Хэд хэдэн зуун API функцүүд windows-н бүх системийн хийх үйлдчилгээг хангаж өгдөг. Windows-н орчин бол интерфейс баазын дуудалтаар ханддаг. Үүнийг API гэдэг. Системийн виртуаль машин Windows-н бүх application ситемийн виртуаль машины тухайн хил хязгаарт үйлдлээ гүйцэтгэдэг. 16 битын application –ууд өөрийн нэгдмэл хаяглалын орон зайд ажилладаг. Энэ нь application бүрийн өөрийн орон зайн хаяглалтыг 32 битын хаяглалтаар хангаж дэмжиж өгдөг. MS-DOS-н виртуаль машин Windows95 олон тооны MS-DOS-н программыг хамгаалалтын горим эсвэл 8086 виртуаль үйл ажиллагаа ажиллуулж дэмжиж байдаг. MS-DOS-н виртуаль машин хэд хэдийг үүсгэж болно. Виртуаль машины диспетчер Виртуаль машины диспетчер нь үнэндээ үйлдлийн системийн зүрх юм. Энэ нь доод түвшиний санах ойн удирдлага болон драйверуудын виртуаль зохион байгуулалтын үйлчилгээг хянаж ажилллаж байдаг. | Windows95 –н диспетчерүүд Windows95 –н виртуаль машины диспетчер дотор хоёр диспетчер ажиллаж байдаг. Үүнд: Үндсэн диспетчер. (primary scheduler) Энэ нь thread-дын приоретитүүдийг тооцоолж хариу өгнө. Квантын диспетчер (timeslice scheduler) Энэ нь хугацааны квантуудад хувааж хэсэгчлэн ажилуулана. Үнэн хэрэгтээ квантын диспитчер аль thread-н ямар хувийг нь ямар хугацаанд процессороор үйлчлүүлэхийг тооцоолно. Процесс 0-31 хүртэл приоритеттой байдаг ба үүнийг үндсэн диспетчер бодоод квантын диспетчер лүү гаргана. Хэрвээ процессийн хугацааны квант 100 хувь болсон бол VMStat_Background эсвэл VMStat_High_Pri_Background гэдэг төлвийг үлдээдэг. DELPHI ДЭЭР АНХНЫ АЛХАМ ХИЙЦГЭЭЕ Та мэдэж байгаа Delphi бол Borland пүүсийн Windows-ийн орчны програмыг бичдэг дээд түвшний програм юм. Delphi -ээр та Windows -ийн орчны программыг урьд байгаагүйгээр хялбар бөгөөд хурдан бичих боломжтой. Win32 эсвэл Win32 graphical user interface (GUI) -ийг та нээж ажиллуулж болно. Win32 GUI -ийг ажиллуулснаар та дээд түвшний програмчлалын хэлний үнэн хүч чадлыг мэдрэх болно. Мөн та Web browsers –ийг минутийн дотор үүсгэдэг шигээ form дээрх ActiveX control -оор тусгай програмуудыг үүсгэж болно. Энэ мэт олон зүйлийн давуу талууд Delphi -д байдаг ба Delphi нь өөрөө кодоо үүсгэдэг тул програмын биелэлт хурдан байдаг. Танд л гэж хэлэхэд Pascal -ын программчлалыг жаахан судлах хэрэгтэй. Delphi нь Windows програмчлалын доод түвшний нарийн зүйлүүдийг нуудаг ба энэ нь танд чухал биш. Эцэст нь та програмист л болохыг хүсч байгаа
  • 3. бол энэ нь бүгдийг судлах хэрэгтэй. Delphi нь танд урьд байгаагүй хөгжил таашаалыг авчрах болно. Ингээд ханцуйгаа шамлан бүх ажилдаа орогтун. Delphi сэтгэлийн таашаалыг авчрах агуу программ юм. Delphi IDE -ийг өнгөц харъя Энэ хэсэг нь Delphi integrated development environment (IDE) -ийг агуулна. Windows програмчлалыг судлах бүхэнд энэ нь хэрэгтэй юм. Та одоо Delphi -ийг эхлэх урам зоригтой байгаа гэж бодож байна. Программыг эхлүүлэхэд та хоосон form ба IDE -ийг харах болно. Delphi IDE нь 3 хэсэгт хуваагдана. Дээд хэсгийг нь үндсэн цонх гэдэг. Энэ нь toolbars болон Component palette -ийг агуулдаг. Delphi toolbars нь compiling project, хадгалах, нээх үйлдлүүдийг нэг товшилтоор гүйцэтгэх боломжийг танд олгоно. Component palette нь wide array of components агуулдаг ба түүнийг form дээр чирч тавьж болно. Component -ууд нь text labels, edit controls, list boxes, buttons ба бусад болно. . Componentууд нь бүлгүүдэд хуваагдсан байна. Component palette -ийн дээд талын tab -ыг харав уу? Дээр нь очоод click хийвэл өөр өөр component гарч ирнэ. Form дээрээ component -оо байрлуулахын тулд Component palette -ийн компонентын button дээр click хийж component -оо харагдах хэсэгт нь очоод click хийх хэрэгтэй. Яаж хэрэглэх үр дүнд юу болох бол гэж санаа зовох хэрэггүй. Эдгээр нь хормын дотор болно. Шинэ нэр томъёо: Component гэдэг бол software -ийн 2 хэсгийг агуулсан ба тусгай урьдчилан тодорхойлогдсон функц үйлдлийг нь гүйцэтгэж байдаг. Жишээ нь: text label, edit control, list box. Обьектийн инспектор Үндсэн цонхны доор дэлгэцийн зүүн талд Object Inspector байна. Энэ нь component -ийн properties ба events -үүдийг өөрчлөхөд ашиглагддаг. Delphi -тэй ажиллах явцдаа үргэлж Object Inspector -ийг та хэрэглэх болно. Object Inspector нь 2 хэсэгтэй. Properties tab ба Events. Component -ийн properties нь component -ийг яаж ажиллуулахыг удирдана. Жишээ нь : Color property - ийг өөрчлөхөд background color -нь өөрчлөгддөг. Шинэ нэр томъёо: property –нь component -ийн үйл ажиллагааг тодорхойлдог. Events хэсэг нь component -ын event -уудын жагсаалтуудаас бүрдэнэ. Component дотор үйлдэл хийхэд event -ийг ашигладаг. Жишээ нь component дарагдахад event нь component дарагдсан байна шүү гэж танд хэлнэ.Та component -д хамаарах код бичиж болох ба тусгай үйлдлийг гүйцэтгэхэд хэрэглэж болно. Шинэ нэр томъёо: event бол цонх ба хэрэглэгчтэй ажиллах component -
  • 4. ийн харилцан ажиллагааны үр дүн юм. Delphi –ийн ажлын талбар Delphi IDE -ийн үндсэн хэсэг нь ажлын талбар юм. Ажлын талбар нь Form Designer -ийг үүсгэнэ. Энэ нь гайхмаар юм биш Form Designer нь өөрөө form үүсгэдэг. Delphi -д form гэдэг нь программын цонхыг хэлнэ. Form нь программын үндсэн цонх байж болно, dialog box эсвэл цонхны янз бүрийн хэлбэртэй байж болно. Form Designer -ийг, form -ийг үүсгэх процессийн хэсэгт component -уудыг нь байрлуулах, зөөх зэргээр ашиглаж болно. Form Designer -ийн ард Code Editor байдаг. Программын кодыг Code Editor дээр бичдэг. Application -ийг үүсгэн ажиллах явцад Object Inspector, Form Designer, Code Editor, ба Component palette -ууд нь харилцан уялдаатай байдаг. Та Delphi IDE-ийг мэддэг боллоо одоо ямар нэг зүйлийг хийж үзье. Таны эхний програм: Hello World Дэлгэцэнд Hello World гэж хэвлэх нь бүх програмчлалын хэлний сурах бичигт байдаг уламжлалт програм юм. Заавал ийм байх албагүй гэж би боддог. Pascal хэлийг өмнө нь судалсан бол сайн юм. Та гайхаж магадгүй юм, Delphi танд одоогийн Windows program -ийн Hello World -д хүрэх хамгийн хялбар замыг зааж өгнө. Програм бичих Та яг одоо Delphi -ийг ажиллуулж байгаа бол blank form -ийг харсан байх ёстой. Form нь Form1 гэж нэрлэгдсэн байдаг. Form -ийн зүүн хэсэгт Object Inspector form -ийн properties -үүдийг харуулна. Object Inspector -ийн title bar дээр товш. Caption property нь идэвхжих ба cursor нь тэнд юу хийхийг хүлээнэ. Hello World! гэж бичин form -ийн caption -ийг өөрчил. Санамж: Properties -ийг өөрчлөх бол Delphi шууд өөрчлөлтийг нь гаргадаг. Caption -ийг өөрчлөх үед form -ийн window caption нь өөрчлөгдөж байгааг ажигла. Toolbar дахь Run товчийг товш. Form нь гарахдаа caption нь Hello World!. - ийг гаргана. Энэ тохиолдолд ажиллаж байгаа программ нь бараг л blank form шиг харагдана. Програмыг өөрчлөх Одоо программаа жаахан өөрчилье. Hello World чинь байгаа бол Close button дээр товшин хаах хэрэгтэй. Form Designer дахин гарч ирэх ба form- ийг өөрчлөх боломжтой. Программыг илүү сайжруулахын тулд цонхны төвд текст нэмэх хэрэгтэй. Үүнийг хийснээр form -доо text label -ийг та нэмж өгнө. 1. Эхлээд Component palette -ийн Standard хэсэгт товш. 2. Label button -ийг товшоод form -ийн хаа нэгтээ товш. Label component нь form -ийн дотор байна. 3. Object Inspector дээр буцаад оч. Label1 -ийн properties -ууд гарч ирсэн байгаа. Caption property нь бас идэвхжсэн байгаа. 4. Object Inspector эсвэл Caption property -ийн titlebar дээр товш тэгээд Hello World! гэж бич. Form -дээрх label нь Hello World!. гэж гаргана. 5. Үүнийг хийсэн бол label -ийн text -ийн хэмжээг өөрчилж чадна. Font property дээр 2 товш. Property нэмэлт font attribute -ийг харуулахын тулд өргөн болно. 6. Font -ийн Size property -ийг 24 болгоод form -дээрээ товш. Label шинэ хэмжээтэй болно.
  • 5. Програмаа хаах Delphi -д жаахан дурласан бол энэ нь бүхнээс илүү таны сонирхлыг татна. Дараа нь юу хийх вэ гэвэл одоогийн прожектийг хаах хэрэгтэй. File цэсний Close All -ыг сонго. Project1 -ийн өөрчлөлтийг хадгалах бол No -ийг сонго. Таны 2 дахь программ: Hello World, II хэсэг Pascal -ийг судлахаасаа өмнө Delphi хэрхэн ажиллдаг талаар мэдэх хэрэгтэй. Танд Pascal –ийн олон төрөл дээр ажиллахад энэ нь хэрэг болно. Энэ хэсэг нь Delphi -ийн үнэн хүчийг хальт агуулна. Санамж: Компонентийн properties -ийг өөрчилсөн бол design-time өөрчлөлт хийсэн гэсэн үг. Харин кодоор property -ийг нь өөрчилсөн бол runtime өөрчлөлт гэж нэрлэгддэг. Ажиллах үед нь Caption property -ийг өөрчлөхийн тулд: 1. Form дээрх button –ийг 2 товш. Ингэхэд Delphi нь event handler -ийг
  • 6. button -ийн OnClick event дээр үүсгэнэ. Үүсгэсэн код нь дараах байдалтай байна procedure TForm1.Button1Click(Sender: TObject); begin end; 2. Засварлагч курсор нь begin ба end гэсэн зарлагааны хооронд байдаг ба таныг код бичихийг хүлээж байдаг. procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := `Hello World, Part II'; end; Энэ код маш энгийн юм. Энэ нь Hello World, Part II гэсэн өгүүлбэрийг Caption property -руу шилжүүлдэг. 3. Одоо toolbar -т байгаа Run товчин дээр дарж программыг ажиллуул. Программыг ажиллуулахад label -ийн caption нь Label1 гэж хэвээр байгааг анхаарна уу. Form -ийн button дээр дарж label -ийн гарчгийг өөрчил. Гайхамшигтай байгаа биз. Зүгээр л Delphi ажиллаж байгаа юм. Иймэрхүүгээр олон дасгалыг ойрын хэд хоногт хийж form -ийн бусад компонент labels, button –уудын талаар их туршлагатай болно. Би үйл явдлын ард нь юу болдгийг бүхэлд нь тайлбарлах гээгүй харин дараа нь бүх тайлбар хийхийг л хүсэхггүй байна. Object Pascal хэлийг нягтлан харах нь Delphi -ийн RAD онцлогийг суралцахаасаа өмнө обьект Паскал хэлний үндсийг судлах хэрэгтэй. Энэ ном магадгүй хамгийн сайн нь биш юм шиг танд санагдаж болох юм гэхдээ та юуны өмнө обьект Паскалийг судал. Обьект Паскалийг дараалаар нь судалбал сайн хэрэг. III бүлгийн хичээлийн дараа та обьект Паскалийн бүрэн дүр зурагтай болсон байна. Хоромхон зуурын ухвар ойлголтонд бүү хуурт. Зарим нь обьект Паскалийг бүрэн ойлгохыг шаарддаг ба энэ нь бодит туршлага юм. Ойрын хэдэн өдрийн турш та зарим кодын хэсгийг харах ба энэ нь обьект Паскалийн зарим онцлогийг дүрслэн үзүүлдэг. Та зарим дасгал хийх ба таны олсон шинэ мэдлэгийг бататгана .Эхний хэдэн өдөр та зөвхөн Delphi application -ийг жаахан хэсэгт харна. Юун түрүүнд би Delphi IDE болон Visual Component Library (VCL) -ийг судалмааргүй байна. Та бүрэн ойлголттой болсныхоо дараа эхлэх хүртлээ бага багаар ахих хэрэгтэй. Түүхийн шар хуудас 1994 онд Borland пүүс нь RAD хэрэгсэл дээр ажиллаж эхэлсэн ба энэ код нь Delphi гэж нэрлэгдсэн байна. RAD -ийг хэрэгжүүлэх хамгийн шилдэг зам нь компонентийн загвар архитектур байна гэж шийдэгдсэн байсан. Энэ нь системийн гол цөм байх програмын хэлний асуудлыг шийдсэн байв. Тэр үед Borland пүүс нь Pascal –ийн зах зээл дэх ганц борлуулагч байв. Borland нь Pascal -ийн хэрэгсэлийг үйлдвэрлэдэг хамгийн сайн компани байв. Та Pascal -ийн програмист байсан бол Borland -ийн TurboPascal -ийг хэрэглэн амтанд нь орох байсан биз. Borland пүүс Pascal хэлийг хуулийн хүрээнд бүрэн эзэмшдэггүй боловч Pascal -ийн ертөнцөд том байр эзэлдэг гэдэгт эргэлзээ байдаггүй. Энэ нь Pascal хэлний онцлогийг нэмэгдүүлэх тал дээр том байр эзэлдэг. Энд хэлэхэд Pascal -ийн стандарт хороо байдаггүй ба Pascal хэлийг тодорхойлон бичигдсэн стандарт байдаггүй. Borland пүүс Delphi -ийг Pascal -ийн үндсэн дээр бичсэн юм. (Borland -ийн нэр нь програмын хэлний нэр болсон) Delphi хэрэглээнд гарахаас өмнө Borland пүүс Pascal хэлийг өөрчилсөн. Жишээлбэл : Pascal -ийг обьект Pascal болгон өөрчилсөн байв. Энэ нь обьект Pascal нь Pascal -ийн хувьд C++ нь C -ээс ямар ялгаатай байдаг шиг обьект Pascal нь классийг Pascal -д нэмсэн ба үүгээр обьект хандлагат програмчлалд Pascal орж ирсэн. Delphi хөгжихийн хирээр шинэ хэлний онцлог ба түлхүүр үг нэмэгдэн орж ирэн компонент загвартай зохицож эхэлсэн. Түлхүүр үгүүд ба property өөр бусад нэмэгдэн орж ирсэн.
  • 7. Энэ нь Borland -д компонент загварын бүрэн хүчийг хэрэгжүүлэх боломжийг олгосон. Компонентод тохируулан Паскал хэлийг өөрчилснөөрөө Borland нь RAD - ийг хэрэгжүүлэх боломжтой болсон. Гол нь обьект Паскал хэл нь өөрчлөгдсөнөөрөө Delphi -ийн боломжуудыг нээж өгсөн. Үр дүнд нь компонент загвар ажиллаж эхэлсэн. Хэдийгээр Паскалийг өөрчилсөнөөрөө Borland нь том алхам хийсэн боловч урьдах зүйлтэй холбоотой. Microsoft компани BASIC хэлийг авч өөрчлөн Visual Basic хэлийг гаргасан байдаг. Энэ шинэ хэл нь баазад ажилладаг эх Basic хэлнээсээ ялгагдахгүй шахам байсан. Borland пүүс Паскал өөрчилснөөрөө эрсдэлтэй алхам хийсэн. Бүх юмны дараа хэрэглэгчид таатай бус хүлээн авсан. Одоог хүртэл Borland нь Паскалийн зах зээл дээр хатуу байр суурьтай байгаа ба энэ хэвээрээ байгаа билээ. Үүнд алдаа хийхгүй бол обьект Паскал хүчирхэг хэл ба би зарлалтыг нь тэгж хөнгөн хийхгүй байхсан. Обьект Паскал нь сургалтанд бол хамгийн хүчирхэг байгаа билээ. Би Обьект Паскалийг бүх онцлогийг агуулсан гэж хэлэхгүй. Паскал бол програмчлалд түгээмэл хэрэглэгддэг. Санамж: Юу хийхийг тодорхойлохдоо Delphi нь хэд хэдэн нэр томъёог хуулан авсан. Delphi -ийн үндсэн хэл бол мэдээж обьект Паскал ба зарим хүмүүс үүнийг Паскал гэж хэлдэг. Зарим Паскал дээр хийж байна хэлдэг. Эцэст нь юу гэж хэлэхээ та шийд. Обьект Паскал нь обьект хандлагат програмчлалд бүрэн зохицсон болно. Шинэ нэр томъёо: Обьект - урьд нь компонентыг тодорхойлж байсан шиг тусгай програмчлалын хоёр тал юм. (Компонент бол обьект юм, харин бүх обьект нь компонент биш) Pascal Unit -ууд Програмчлал бол код бичихээс илүү ажил юм. Эцсийн эцэст энэ бол програмын цогц бөгөөд код бичих нь програмчлах зорилгыг нь биелүүлж байгаа болно. Таны бичсэн код бол зөвхөн текст файл руу ордог. Компьютер тэр текст файлыг аван машины кодод хөрвүүлэлт хийн ойлгодог. Delphi -ийн код агуулдаг текст файлыг unit гэдэг. Шинэ нэр томъёо: unit бол кодын модульд хөрвүүлэгдэх боломжтой текст файл юм. Unit -ийн төрлүүд Delphi GUI application нь багадаа хоёр unit -ийг агуулдаг. Project source unit нь project source кодыг агуулдаг. Project source код нь DPR өргөтгөл байдаг. Та project source unit -ийг Project | View Source -ийг үндсэн цэсээс сонгон үзэж болно. Project source unit -ийг өөрчлөх хэрэгцээ нэг их байдаггүй. Үнэндээ project source unit -ийг юу хийхээ мэдэхгүйгээр хийх хэрэггүй. Та хэрэв project source unit -ийг санамсаргүй өөрчилсөн бол application тань ажиллахгүй болно. Delphi GUI application -ийн хоёр дахь төрөл нь үндсэн form -ийн unit байдаг. Form unit гэдэг бол тухайн form -тай хамтардаг source code unit байдаг. Unit -ийн энэ төрөл нь PAS өргөтгөлтэй файл байдаг. Delphi -д та энэ төрлийг нь голлон хэрэглэнэ. Delphi GUI application нь голдуу нэг form unit -тэй байдаг. (Үндсэн form -ийн хувьд) Харин энэ нь нэгээс илүү form unit -тэй байж болно. Жишээ нь: About box -ийг гаргадаг application нь үндсэн form unit -тэй байх ба About box -ийн unit байна. Тэмдэглэл: "Delphi GUI application." нь console mode application -ийн GUI application -ээс ялгаатай байдаг. Console mode application бол console window (DOS box) -ийг ажиллуулдаг 32-bit Windows application юм. Console application -д үндсэн form байдаггүй ба өөр form -уудыг агуулж ч болно, агуулахгүй ч байж болно. Хэдий ийм боловч console application нь нэг эсвэл түүнээс илүү unit -тэй байж болно. Delphi application -д та 3 дахь unit -ийг хэрэглэж болно. Энэ төрлийн unit нь source кодыг агуулдаг. Зөвхөн unit -ийг агуулдаг код нь project -ийн бусад unit гэж дуудагддаг. Delphi Unit –ийн бүтэц
  • 8. Delphi unit нь урьд тодорхойлогдсон форматыг дагах ёстой. Unit урьд тодорхойлогдсон форматанд байх ба энэ нь хөрвүүлэгч unit -ийг уншиж чадах ба unit -ийн кодыг компиляц хийж чадна. Delphi project unit нь unit - ийн нэртэй програмын түлхүүр үгийг агуулдаг ба кодын хэсэг нь begin ба end гэсэн түлхүүр үгээр тэмдэглэгддэг. Та үндсэн unit -ийг Delphi -ийн үндсэн цэсээс View | Project Source -ийг сонгон харж болох ба default Delphi project -ийн project source unit -нь дараах байдалтай байна. Тэмдэглэгээ: Доорх мөрийн дугаарууд нь unit -ийн өөрийнх нь хэсэг биш болно. Үүнийг зөвхөн дарааллыг заахад ашигласан. Заримд нь ийм дугаар байгаа ба заримд нь байхгүй болно. Аль алинд нь Паскал хэл нь бусад хэлүүд шиг мөрийн дугаар авдаггүй гэдгийг ойлгох хэрэгтэй. (онцолбол, BASIC). Cтандарт DELPHI PROJECT –ийн PROJECT SOURCE 01: program Project1; 02: 03: uses 04: Forms, 05: Unit1 in ‘Unit1.pas’ {Form1}; 06: 07: {$R *.RES} 08: 09: begin 10: Application.Initialize; 11: Application.CreateForm(TForm1, Form1); 12: Application.Run; 13: end. / 1 мөрөнд програмын түлхүүр үг програмын үндсэн source unit -ээр энэ unit -ийг тодорхойлсон. Үүнийг та unit -ийн нэр Project1 нь програмын түлхүүр үгээ даган яваагаас харж болно. (Delphi таныг нэр өгөх хүртэл өөрөө нэрийг нь автоматаар өгдөг) 3 мөрөөс эхлэн түлхүүр үгээр тодорхойлогдсон хэсгийг харж байна. Ямар ч unit -ийн нэр нь цэгтэй таслалтай түлхүүр үгийг дагадаг ба компиляци энэ дарааллаар хийгдэнэ. 7 мөрөнд компиляцийн директив нь Delphi нь project -ийн resource file -ийг агуулдгийг харна. Resource файлууд нь VIII бүлгээр яригдана. “Creating Applications in Delphi." 9 мөрөнд begin түлхүүр үг ба 13 мөрөнд end түлхүүр үгийг агуулсан. Сүүлийн түлхүүр үг цэгээр төгссөн байгааг ажигла. (unit нь олон түлхүүр үгтэй байж болох ба харин ганц төгсгөлийн end –тэй байна.) 10, 11, 12 -р мөрүүдэд код нь application -ийг үүсгэж байгаа ба application - ийн үндсэн form -ийг үүсгэх ба application -ийн биелэлтийг эхлүүлнэ. Та энэ кодын нарийн хэсэгт анхаарах хэрэггүй. Тэмдэглэгээ: begin ба end нь кодыг блоклоно. Кодын блок нь кодын хэдэн мөрийг агуулж болох ба мөн хэдэн зуун мөрийн кодыг ч агуулж болно. Номонд ч бас ийм байгааг та харж болно. Та ном хэрэглэдэг бол яаж, хэзээ хэрэглэхийг мэдэх болно. Паскал unit -ийн өөр хэсэгт харцгаая. Үндсэн цэсээс File | New -ийг сонгоно. New Items гарч ирэхэд icon -ийг байрлуулан 2 товшилт хий. Delphi шинэ unit -ийг нээх ба харуулахдаа Code Editor -д unit код нь үүснэ. Хоосон UNIT 01: unit Unit2; 02: 03: interface 04: 05: implementation 06: 07: end.
  • 9. Цөөн байгаа биз? Энэ unit нь 2 зүйлтэй. Эхнийх нь unit нь нэр нь түлхүүр үгтэйгээ байгаа. Түлхүүр үгтэй программ эхэлж байгаа ба код нь unit түлхүүр үгтэй ба харин хэдхэн ерөнхий элементтэй байна. Pascal unit нь unit нэртэйгээ байгаа түлхүүр үгээр эхлэх ба end нь хоёулангийнх нь сүүлд байдаг. Энд end түлхүүр үг нь бас сүүлдээ цэгтэй байгаа. Програмын main source unit -ийнх биш unit нь interface ба implementation - уудыг агуулдаг. Энэ хоёр түлхүүр үг нь The interface Section" and "Implementation Section," зэрэг хэсгүүдэд нарийн тодорхойлогдсон байгаа болно. Программын үндсэн unit нь begin and end -ийг хоёуланг нь авч явах ба харин source unit -нь төгсгөлдөө л end -тэй байна. Дараагийн хэсэг нь Pascal unit дотор хэрэглэгддэг түлхүүр үгийг тодорхойлно. Uses жагсаалт Шинэ нэр томъёо: uses жагсаалт бол гаднах unit -уудын жагсаалт. 3 мөрөнд uses түлхүүр үгийг хэрэглэсэн байгаа. Uses нь бусад unit -уудын жагсаалтыг агуулсан хэсгийн эхлэлтийг тодорхойлж байгаа бөгөөд энэ unit нь түлхүүр үгээсээ хамаарна. Application.CreateForm(TForm1, Form1); Кодын энэ мөр нь бусад unit -уудад байрлах мэдээллийг агуулах ба энэ unit -д олдохгүй. Application.CreateForm гэж тодорхойлогдсон процедур нь Forms.pas гэгдэх Delphi unit -д байх ба TForm1 ба Form1 идентификаторууд нь прожектийн main form unit-д байрлах ба Unit1.pas гэж хэлэгдэнэ. Та холболтыг нь харав уу? Uses жагсаалт нь unit -ийг компиляци хийхэд хэрэгтэй нэмэлт мэдээллийг агуулдаг гэж үзнэ. Энд uses жагсаалтийг харуулав. uses Forms, Unit1 in ‘Unit1.pas’ {Form1}; Uses жасгаалт нь 2 unit нэртэй байна. Forms ба Unit1. Заримдаа энэ нь сайн жишээ биш байдаг. Яагаад гэвэл 2 -р unit жагсаалт нь нэмэлт текстийг агуулсан байдаг. (Unit1 in ‘Unit1.pas' {Form1}). Энэ текст нь form -ийг онцлоход хэрэглэгдэх ба unit -дээ байдаг бөгөөд прожектийн main source unit -ээр л хэрэглэгддэг. (Угалзан хаалтанд байх текст нь кодын бусад хэсэгт байх тайлбар) Uses жагсаалтыг байгуулахад мэдвэл зохих 2 зарчим байдаг: • Эхлээд жагсаалт дахь unit бүр дараах unit -ээсээ таслалаар тусгаарлагдах ёстой. • Дараа нь сүүлийн unit-ийн жагсаалт нь цэг таслалтай байх. Цэг таслал нь uses жагсаалтыг төгссөнийг заана. Ерөнхийдөө жагсаалт нь идэвхтэй unit -ийн нэрсийг агуулах ёстой. Uses жагсаалт нь uses түлхүүр үг, цэг таслалтай end -ээр тодорхойлогдох ёстой. Тэрнээс гадна uses жагсаалт нь яаж зохион байгуулагдсанаасаа хамаарахгүй. Жишээ: Дараах 2 uses жагсаалтууд ижил: uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Unit нь uses жагсаалт нь ямар ч тоотой байж болно. Тэмдэглэгээ: Зарим тохиолдолд Delphi нь танд uses жагсаалтанд unit -ийг нэмж өгдөг. Энэ нь File | Use Unit цэсээр хийгддэг. Энэ онцлог нь IV бүлгээр нарийвчлан яригдана. Интерфейс хэсэг
  • 10. Өмнөх кодонд интерфейс түлхүүр үг байгааг анзаарсан болов уу. Интерфейс хэсэг бол идентификатор нь unit -ээсээ авч ирэн зарлагдсан unit –ийн хэсэг юм. Ихэнх unit -ууд нь өөр unit –уудад хэрэглэгдэх кодыг агуулсан байдаг. Энэ код нь класс, процедур, функц, хувьсагчаар хангагдсан байж болно. Аль ч обьект нь интерфейс хэсгээрээ нэг unit -ээс нөгөө unit -руу зарлагдах боломжтой. Та интерфейс хэсэг нь жагсаалтыг агуулдаг гэдгийг хэлж чадна. Интерфейс хэсэг нь интерфейс түлхүүр үгээр эхэлдэг ба implementation түлхүүр үгээр дуусдаг. Implementation хэсэг Шинэ нэр томъёо: implementation хэсэг бол тухайн unit -ийн кодыг агуулдаг хэсэг юм. Implementation хэсэг implementation түлхүүр үгээр эхэлдэг ба дараагийн unit -ийн түлхүүр үгээр дуусдаг. Дараагийн unit -ийн түлхүүр үг нь голдуу unit - ийн төгсгөл end түлхүүр үг байдаг. Паскалийн тал байгаа учир илүү юм ярих боломжгүй байна. Хэдий ийм боловч интерфейс ба implementation - ийн жишээ нь танд ойлголтыг жаахан төрүүлэх болно. DoSomething гэж нэрлэгдэх процедур нь unit -ийг үүсгэнэ. Та бусад unit - уудад DoSomething –ийг дуудагдахыг хүсч байна уу? Энэ тохиолдолд DoSomething процедурыг интерфейс хэсэгт зарлах ба implementation хэсэгт тодорхойлох хэрэгтэй. Доорх хэлбэртэй байна. PUBLIC функцтэй unit unit Unit2; interface procedure DoSomething; implementation procedure DoSomething; begin { Code for DoSomething goes here. } end; end. DoSomething процедур нь interface section -д зарлагдсан байгааг анзаар. Тэгээд implementation section -д тодорхойлогдсон байгаа. Initialization ба finalization хэсэг Initialization ба finalization хэсэг нь unit -ийн шаардлагатай кодыг цэвэрлэх, эхлэл хийх, гүйцэтгэх боломжтой. Initialization section -д ямар ч код unit санах ойд ачаалагдах үед биелэгддэг. Finalization section -д unit санах ойгоос ачаалагдаагүй байхаас өмнө биелэгддэг. Initialization section - гүйгээр та finalization section -тай байх боломжгүй. Энэ хоёр нь хоёул сонголт юм. Unit –д хэрэглэгддэг түлхүүр үгүүд Pascal unit бусдыг агуулж болдог ба сонголтын түлхүүр үг нь өөр өөр зорилгоор нь хэсгүүдийг ангилдаг. Эдгээр түлхүүр үгүүдийн зарим нь олон хэрэглээтэй. Дараах хэсэг нь unit –д хамаарагдах түлхүүр үгийг л тодорхойлсон байгаа. Const түлхүүр үг Ер нь unit нь нэг түүнээс илүү const хэсгийн сонголттой байх боломжтой. Const хэсэг бол түлхүүр үгээр тодорхойлогдсон байдаг. Тогтмолоор зарлагдсан хувьсагчаар const хэсэг нь тодорхойлогдоно. Constant бол өөрчилж болохгүй идентификатор юм. Жишээ нь таны програмд олон хэмжигдэхүүн байдаг гэе. Үүндээ та тогтмол хувьсагчийг ашиглах боломжтой. Const section -ийг доорх програмд нэмье гээд төсөөлөөд үзье. Та const хэсэгт нэг тогтмолыг нэмэх ба өөр const хэсэг нь 2 тогтмолыг нэмсэн. unit Unit2; interface const AppCaption = ‘My Cool Program 1.0’; procedure DoSomething; implementation
  • 11. const BaseX = 20; BaseY = 200; procedure DoSomething; begin { Code for DoSomething goes here. } end; end. AppCaption Тогтмол нь interface section -д зарлагдсан учир unit -ийн аль ч хэсэгт энэ нь хэрэглэгдэж болох ба uses жагсаалтанд байгаа аль ч unit - ийн хувьд мөн адил байна. BaseX and BaseY хувьсагчууд нь unit дотроо боломжтой яагаад гэвэл тэд implementation section -д зарлагдсан. Тогтмол түлхүүр үг нь нэгээс илүү хэрэглээтэй байж болно. Type түлхүүр үг Шинэ нэр томъёо: Type түлхүүр үг нь таны програм хэрэглэх шинэ төрлийг зарлахад хэрэглэгддэг. Шинэ төрлийг зарлах нь esoteric програмчлалын технологи бөгөөд энд тайлбарлах нь хэцүү болно. Доор 20 байтын массив таны application -д хэрэгтэй байгаа ба энэ төрөл нь дахин дахин хэрэглэгдэнэ. Та доорх шиг зарлаж болно. Type TMyArray = array [0..19] of Byte; Та одоо array [0..19] гэж бичихийн оронд TMyArray гэсэн төрлийг ашиглах боломжтой. “Var “Түлхүүр үг Шинэ нэр томъёо: Энэ түлхүүр үг нь хувьсагчууд байдаг кодын хэсгийн зарлалтын үед хэрэглэгддэг. Энэ түлхүүр үгийг та элдэв хувьсагчуудыг зарлахад хэрэглэж болно. Var - ийг зарлах хэдэн байрлал байдаг. Unit -ийн түвшинд var -ийг та зарлаж болно. Мөн процедур, функцийн түвшинд var -ийн хэсэг байж болно. unit Unit2; http://www.csms.edu.mn/cheri/ interface type TMyArray = array [0..19] of Byte; const AppCaption = ‘My Cool Program 1.0’; var X : Integer; MyArray : TMyArray; procedure DoSomething; implementation const BaseX = 20; BaseY = 200; procedure DoSomething; begin { Code for DoSomething goes here. } end; end. Const түлхүүр үг шиг, var -т бас олон хэрэглээ байдаг. Энэ нь бас функц, процедурын параметр, хувьсагч параметруудыг зарлахад хэрэглэгддэг. Тэмдэглэгээ: var -аар тодорхойлогдсон хэсэг нь түлхүүр үгээр эхэлж, дараагийн unit -ийн түлхүүр үгээр дуусна. Кодын тайлбар Паскал хэл рүү нарийвлан орохын өмнө кодын тайлбарын тухай товч танилцуулъя. Тайлбар нь таны source кодод текст хэлбэрийн тайлбар өгөх зорилготой байна. Тайлбар нь код юу хийхийг тодорхойлоход хэрэглэгдэх ба зохиогчийн эрхийн мэдээллийг хангах, өөртөө эсвэл бусдад тэмдэглэл хийхэд л ашиглагддаг. Тайлбар нь ялгаатай 3 аргаар тодорхойлогддог. Дараах зүйлүүд нь бүгд
  • 12. шугмын хувьд хүчинтэй байна. { Don't forget to free this memory! } { ADTAPI.PAS 2.50 Copyright (c) TurboPower Software 1996-98 } (* Оюутнуудаа энэ кодыг засах хэрэгтэй *) // Энэ үнэн зэрлэг код { Энэ код дээр дараа тухтай ажиллана } Магадгүй Delphi –д ихэнх тайлбарын төрөл нь угалзан хаалтыг хэрэглэдэг. “{“ нь эхлэх үед тайлбарыг, ”}” –нь тайлбарын төгсгөлд хэрэглэгдэнэ. Тайлбарын өөр нэг нь (*тайлбар эхлэх,ба *) байдаг. Энд бас нэг тайлбарын тэмдэг байдаг: (*/*) тайлбарын тэмдэглэгээ нь том хэмжээний тайлбарыг хийхэд болно. Эдгээр тайлбарын төрлүүд нь нэг эсвэл олон мөрт тайлбарыг хийхэд ашиглагдана. Тэмдэглэгээ: Угалзан хаалт нь Паскалд өөр хэрэглээтэй байдаг. $ -ийг хэрэглэх үед хаалт нь компиляторын директорыг заадаг. Компиляторт compiler hints үүсгэхгүй гэж зааж өгөн source коддоо {$HINTS OFF} гэж бичих хэрэгтэй. Компилятор энэ мөрийг хараад unit -д дохио өгөхөө {$HINTS ON} –тэй тулаад зогсооно. Тайлбарын 3 дахь хэлбэр нь давхар зураас байдаг. Энэ нь голдуу С - хэлбэрийн тайлбар гэгддэг яагаад гэвэл С ба С++ үүнийн хэрэглэдэг. Энэ хэлбэр нь нэг мөрөнд хэрэглэгддэг. Delphi -д энэ хэлбэр ажилладаггүй гэдгийг хэлье. Тэмдэглэгээ: Энд угалзан хаалт хэрэглэсэн байгаа. ”//” -ийг богино тайлбарт болон тестийн зорилгоор ашигласан . Аль ч тайлбарлагдсан текст нь компиляторт хамааралгүй байдаг. Хэрэв та default Delphi IDE settings -ийг ашиглаж байгаа бол бүх тайлбар мөр нь бичмэл хөх текст байгаа. Энэ нь тайлбарыг хурдан ялгахад дөхөм байдаг. Тэмдэглэгээ: Хэрэв та багийн бүрэлдэхүүнтэй програмчлалын ажил хийдэг бол та хамтран ажиллагчдынхаа код, бичлэгийг уншдаг байх. Кодонд товч тайлбар хийх нь аль ч програмистад цагийг нь хэмнэнэ. Та ганцаараа ажилладаг гэсэн ч тайлбар бичих нь чухал. Та бичсэн кодоо ямар амархан мартаж байгаагаа хараад л гайхна. Сайн кодын тайлбар нь таны хамтрагчийн цагийг хэмнээд зогсохгүй таныг ч бас аварна. Кодын тайлбар бичихээ бүү март! Хувьсагчид Хувьсагчид нь хэрэглэгдэхээсээ өмнө зарлагдсан байдаг. Та хувьсагчдыг кодын тусгай хэсэгт зарлах ба var түлхүүр үгээр тодорхойлох хэрэгтэй. Жишээ нь: var X : Integer; { X хувьсагч нь integer төрөлтэй } Y : Integer; { Байршлын y утга } Өмнө нь “var” түлхүүр үгийн тухай Паскалийн unit -ийн нэр томъёонд дурдсан билээ. Тэр хэсэгт unit -д хувьсагчуудыг хэрэглэдэг ба unit -ийн var хэсэгт зарладаг гэж үзсэн билээ. Тэр нь үнэн ч та бас функц, процедуруудыг энэ хэсэгт зарлаж болно. Функц, процедурт хувьсагчуудыг зарлах боломжийг энэ нь танд олгож байгаа болно. Доорх жишээ нь процедурт var хэсэг байна. procedure TForm1.Test; var S : string; begin S := ‘Hello World!’; Label1.Caption := S; end; Та хувьсагчаа зарласны дараа үүнийгээ санах ойд өгөгдлийг зохицуулахад хэрэглэж болно. Энэ мэдээж танд нэг их сэтгэгдэл төрүүлэхгүй байх гэхдээ хэдэн жишээг танд танилцуулъя. Дараах кодын хэсэг нь X, Y гэж зарлагдсан хувьсагчуудыг хэрэглэсэн. Мөр болгоны эцэст байгаа тайлбар
  • 13. нь юу биелж байгааг тайлбарлана. X := 100; { ‘X’ нь одоогийн утга нь: 100 } X := X + 50; { ‘X’ нь одоогийн утга нь: 150 } Y := 150; { ‘Y’ нь одоогийн утга нь: 150 } X := X + Y; { ‘X’ нь одоогийн утга нь: 300 } Inc(X); { Нэмэгдүүлж байна. ‘X’ нь одоогийн утга нь: 301 } Хувьсагч бол компьютерийн санах ойд байрласан хэсэг утга юм. Эрхэм уншигч та энэ кодны тухай зарим зүйлсийг тэмдэглэж аваарай. Юуны түрүүнд Х хувьсагчийн өөрчлөлт (Бид дараа Object Pascal хэлний хувьсагчийг удирдах оператор, функц, процедурын тухай үзэх болно.) Дараах хувьсагчууд нь нэмэлт, сонгогдсон утга юм. Програмын кодын мөр бүрийн төгсгөлд цэг таслал (;) тавидаг. САНАМЖ: Паскаль хэлийг эхлэн суралцагчид програмын кодуудын хоорондын ялгааг мэддэг байх хэрэгтэй. (зарлагдсан өгөгдөл, утга, хувьсагч, илэрхийлэл г.м) c := a + b; Дээрх жишээнд с хувьсагчид a болон b хувьсагчдийн нийлбэрийн утгыг олгож байгаа үйлдэл болно. Энд a + b нь илэрхийлэл юм. Нэг мөрөнд олон илэрхийлэл бичигдэж болох бөгөөд төгсгөлд нь цэг таслал тавигдана. Зарим тохиолдолд цэг таслал тавигдахгүй байж болдог. Үүнийг бид дараа нь үзнэ. Хувьсагчийн нэрийн ард хувьсагчийг тодорхойлсон төрөл бичигдэнэ. Функц болон процедурт хувьсагч, хувьсагчийг тодорхойлсон төрлийг зарлаж өгдөг. Мөн хувьсагчийн нэрэнд том жижиг үсэг болон доод зураас, тоог хольж хэрэглэж болно. Ихэнхдээ том үсгээр эхэлдэг ба харин доод зураасаар эхлэхийг зөвшөөрдөггүй. Хэдийгээр хувьсагчийн нэр нь 255 хүртлэх тэмдэгтээс тогтож болох боловч яг үнэндээ 20 тэмдэгт ч гэсэн ашиглахад хэцүү байдаг. МашУртХувьсагчийнНэр : Integer; { урт хувьсагчийн нэр } Миний_хувьсагч : Integer; { доогуур зураас ашигласан } x : Integer; { нэг тэмдэгт ашигласан } X : Integer; { нэг тэмдэгт ашигласан} Тэмдэглэгээ2 : string; { үсэг болон тоо ашигласан } САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй. Жишээ нь: var XPos : Integer; { ...later } XPos := 20; XPOS := 200; xpos := 110; XpoS := 40; Паскаль хэл нь С ба С++ хэлтэй харьцуулахад ойлгомж муутай байж болох юм. Гэхдээ та удахгүй үүний ялгааг олж, ашиглаж сурах болно. САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй боловч та програмдаа тэмдэгт мөртэй ажиллахдаа том үсэг ашиглаж сурах хэрэгтэй. Обьект Паскал хэлний Өгөгдлийн төрөл Шинээр: Объект Паскалийн өгөгдлийн төрөл нь санах ойд мэдээллийг хадгалдаг хөрвүүлэгч /compiler/ аргыг тодорхойлсон. Зарим програмчилалын хэлэнд хувьсагч олон төрлийн утгатай байж болдог. Жишээ нь доорх BASIC код юм. X = -1; X = 1000; X = 3.14; BASIC хэлэнд тооны төрөл хэмжээг тааруулахын тулд санах ойн зохицуулалтад анхаарах хэрэгтэй. Хувьсагчийг зарлах Паскал хэлэнд хувьсагчийг програмд ашиглахаасаа өмнө төрлийг нь
  • 14. зарлаж өгөх ёстой. var X1 : Integer; X : Integer; Y : Double; Z : Byte; { ...ө.х } X1 := -1; X := 1000; Y := 3.14; Z := 27; Өгөгдлийн төрлөө зөв сонгосноор програмын үр дүн зөв гарна гэсэн үг. Тиймээс програмаа ажиллуулахаас өмнө өгөгдлийн төрлөө сайн нягтлаж шалгах хэрэгтэй. Зарим өгөгдлийг signed, unsigned –аар өргөтгөж болдог. Өгөгдлийн signed төрөл нь эерэг ба сөрөг утгыг авдаг бол unsigned төрөл нь зөвхөн эерэг утгыг авдаг. Хүснэгт 1.1 д Паскалийн үндсэн өгөгдлийн төрлүүдийн санах ойд эзлэх хэмжээ болон авч болох утгын хязгаарыг үзүүлэв. Хүснэгтэд "String" буюу тэмдэгт мөрийг оруулаагүй. Харин "Strings" гэсэн дараагийн бүлэгт авч үзнэ. ХҮСНЭГТ 1.1. ОБЪЕКТ ПАСКАЛД АШИГЛАДАГ ӨГӨГДЛИЙН ТӨРЛҮҮД (32-BIT).
  • 15. Дээрх хүснэгтэд үзүүлснээр 32 битийн орчинд Integer, LongInt төрлүүд нь санах ойд ижил 4 байт эзлэж байна. Энэ нь Delphi 4.0 -ийн орчинд нийцэж байна. Харин 16 битийн орчинд Integer нь 2 байт эзлэж байхад Longint нь 4 байт эзлэдэг. Ихэнх програмистууд LongInt –ээс илүү Integer –г өргөн хэрэглэдэг. Мөн Int64, Comp (computational) төрөлүүд нь авч болох утгын хэмжээ ижил байна. Харин ялгаатай тал нь өөрсдийн дотоод хөрвүүлэлт хийдэг арга юм. Int64 нь integer төрөл, харин Comp нь real төрөл юм. Real ба Double төрлүүд нь ижил юм. Delphi програмын өмнөх хувилбарт Real төрөл нь 6 байт байсан бол одоо 8 байт болсон. Энэ өөрчлөлт нь Real төрлийг өнөөгийн хэв маягт ашиглах нөхцлийг бүрдүүлж өгсөн хэдий ч Delphi програмд ашиглагдахдаа Double төрлөөс багаар ашиглагддаг буюу хуучирсанд тооцогддог. САНАМЖ: Windows нь 2,147,483,647 (integer –н maximum утга) – аас илүү утга буцааж чадах GetDiskFreeSpaceEx функцыг агуулдаг. САНАМЖ: Single, Double, Extended, Currency өгөгдлийн төрлүүд нь float төрөлд хамаарагдана.(10 -тийн тооллын систем). Харин бусад төрөлтэй integer –ээр холбогддог. integer нь бутархай тоон утгыг илэрхийлдэггүй. Жишээ нь дараахь кодод буруу зарласан байна. var X : Integer; { Дараа нь... } X := 3.75; Энэ үед алдааг тань Паскал хэл тэр дор нь танд хэлж өгнө. Харин та үүнийг мэдсэнээр float төрөл нь Windows орчинд ямар их ашиглагдахыг анзаарах болно. Өгөгдлийн төрлүүдийн хоорондох хөрвүүлэлт Объект Паскаль нь өгөгдлийн төрлүүдийн хооронд хөрвүүлэлт хийж чаддаг. Жишээ нь: var Res : SmallInt; Num1 : Integer; Num2 : Integer; { Дараа нь... } Num1 := 200; Num2 := 200; Res := Num1 * Num2;
  • 16. SmallInt дэх Integer төрөлтэй хоёр өгөгдлийг хооронд нь үржүүлж үр дүнг нь гаргаж байна. Энэ томъёо нь хоёр өгөгдлийн төрлийг холисон хэдий ч Обьъект Паскаль хөрвүүлэлт хийж чадаж байна. Хариу буюу үр дүн нь - 25,536 гарна. Хүснэгт 1.1 -д үзүүлснээр SmallInt нь хамгийн ихдээ 32,767 утга авдаг. Тэгвэл энэ 32,767 дээр нэгийг нэмбэл хариу нь -32,768 болно. Та үүнийг туршихын тулд доорхи зааврын дагуу ажилларай. 1. Шинэ проект нээж form -д label ба button -г байрлуул. 2. button дээр Double-click хийж OnClick event -ийг сонго. 3. Дараахь байдлаар бичнэ. procedure TForm1.Button1Click(Sender: TObject); var X : SmallInt; begin X := 32767; X := X + 1; Label1.Caption := IntToStr(X); end; 4. Run хийж button товчоо дар. Label -ийн caption дээр -32768 болж өөрчлөгдснийг та харах болно. /IntToStr функц нь integer -ийн утгыг string болгон хөрвүүлнэ./ Дээрх дасгал 32767 нэмэх 1 тэнцүү 32768. Дээрх жишээ нь overflow ба wrapping гэж юу болохыг харуулж байгаа юм. Хувсагчдын утгын хувьд overflow буюу орон халилт үүсэхээргүй /ө.х maximum -аас бага/ байх ёстой. Integer төрөл нь ойролцоогоор –2 -оос +2 тэрбумын алслалттай байдаг. Зарим тохиолдолд Object Pascal нь хөрвүүлэлт хийж чаддаггүй. Сompiler error нь Integer Real хоёр хоорондоо хамааралгүй төрлүүд гэж мэдээлнэ. Сompiler error нь тодорхой төрлүүдэд хадгалагддаггүй утгуудыг зааж өгнө. Жишээ болгон доорх кодыг авч үзье. var X : Byte; begin X := 1000; end; Тогтмолыг зарлах Сompiler error –г харуулж байна. Танд Х хувьсагчийн утгыг 1000 гэж сонгож болохгүйг Сompiler нь мэдээллэх бөгөөд учир нь Х хувьсагч нь Byte хэмжээтэй ба Byte нь 0 - 255 хүртэл хэмжээтэй байдаг. Зөвлөгөө: Сompilе хийхдээ санамж анхааруулга алдааны мэдээлэл зэргийг сайтар дагах хэрэгтэй. Тэдгээр нь програмын кодын алдаа хэрэгцээтэй зарим мэдээллүүдийг хэлж өгдөг. Обьект Паскалийн Оператор Хүснэгт 1.2 Түгээмэл ашиглагддаг операторууд.
  • 18. Операторуудын хувьд байнга хэрэглэгдэж байдаг хэсэг нь байхад бас хааях ашиглагддаг операторууд ч байдаг. Аnd, or, not зэрэг түлхүүр үгс нь логикийн болон битийн гэсэн төрөлтэй байдаг. Жишээ нь if (Started = True) and (X > 20) then Z := X and Y; Дээрх жишээнд and үйлдэл нь хоёр янзаар хэрэглэгдэнэ. Тогтмол Өмнө хэлсэнчлэн тогтмол нь утгын хувьд өөрчлөгдлөггүй. Хувьсагчийн утгыг програм бичигч өөрчилж чаддаг бол тогтмолын утгыг чаддаггүй. Тогтмолыг зарлахдаа const түлхүүр үгийг ашигладаг. const DefaultWidth = 400; DefaultHeight = 200; Description = ‘Something really cool.’; Тогтмолыг зарлахдаа (:=) тэмдэг бус = тэмдэгийг ашигладаг. Мөн ямар ч өгөгдлийн төрлийг онцолж заадаггүй. Массив
  • 19. Массив буюу array нь бүлэг утгын цогц гэж хэлж тодорхойлж болно. Өөрөөр хэлбэл нэг төрөлтэй хэсэг элемент юм. Зарлах үед түүнийг санах ойн тодорхой зайд байрлуулдаггүй ба зөвхөн заагчийн эхлэх утга тогтоогддог. Массивыг дараах хэлбэрээр зарладаг. var MyArray : array[0..4] of Integer; Integer нь 4 байтын санах ойтой учраас дээрх массивын хувьд 5 индекстэй тул санах ойд 20 байт эзлэж байна. MyArray массив 5 гишүүн буюу индекстэй. Индексээ дугаарлаж тэмдэглэхдээ [ ] хаалтад бичиж өгнө. Массивийн гишүүн тус бүрд доорх жишээнд анхны утга олгов. MyArray[0] := -200; MyArray[1] := -100; MyArray[2] := 0; MyArray[3] := 100; MyArray[4] := 200; Дараагийн жишээнд 3 ба 4 –р индексуудын утгуудыг хооронд нь нэмж Х хувьсагчид олгож байна. X := MyArray[3] + MyArray[4]; { үр дүн 300 } Олон хэмжээст массив Массив нь олон хэмжээст байж болно. Өөрөөр хэлбэл санах ойд мөр мөрөөрөө дараалж ажилладаг. Хоёр хэмжээст integer төрөлтэй массив үүсгэхийн тулд кодыг дараахь хэлбэрээр бичнэ. var MdArray : array[0..2, 0..4] of Integer; Энэ массив санах ойг 60 байтаар ачаалж байна. Массивын утга нь урд нь санах ойд байрлаж байсан санамсаргүй өгөгдөл юм. Мөн индекс нь тэгээс эхэлдэг. Массивийн элементүүдийг энгийн масив хэлбэрээр ашиглаж болох ба [ ] хаалтын тусламжтай дараахь хоёр байдлаар ашиглаж болно. Үр дүн нь ижил гарна. X := MdArray[1][1] + MdArray[2][1]; X := MdArray[1, 1] + MdArray[2, 1]; САНАМЖ: Массивийн элементийн тооны хязгаарт байхгүй индекс гарч ирвэл алдаа заана. Доорхи жишээнд үзүүлэв. var MyArray : array[0..4] of Integer; X : Integer; begin X := MyArray[3] + MyArray[5]; { 5 дугаартай индекс байхгүй. } end; Тэгэхээр массивийн элементийн хязгаарыг анх зарлаж өгөх хэрэгтэй. Жишээ нь 10*20 хэмжээтэй массив үүсгэе. var MyArray : array[10..20] of Integer; 10 баганатай 20 мөртэй хүснэгт мэтээр төсөөлье. const myArray : array[0..4] of Integer = ( -200, -100, 0, 100, 200 ); Их ба бага функц Эдгээр функцуудыг массивт олон дахин ашиглаж болно. Хувьсагчийн утгын дээд доод хязгаарыг массивт энгийн байдлаар зарлаж өгдөг. Бага /Low/ функц нь доод хязгаараас буцах үйлдэл /return/ хийдэг. Харин Их /High/ функц нь мөн адил массивын дээд хязгаараас буцдаг. var X, I, Lower, Upper : Integer; MyArray : array[10..20] of Integer; begin { MyArray массивын эхний хэсэг } Lower := Low(MyArray); { Lower нь 10 } Upper := High(MyArray); { Upper now contains 20 } X := 0;
  • 20. for I := Lower to Upper do X := X + MyArray[I]; { Х хувьсагч дээр ямар нэг зүйл хийнэ. } end; Массивийн хязгаарын гаднах утга нь ойртоход их ба бага функц тодорхой биш хэрэглэгддэг. Динамик Массив Delphi 4 -т массивийг динамикаар оруулдаг. A динамикийн массивийн эхний хэмжээг гаднаас зарласан ба массивийг зарлах цагт хэмжээг нь тавьж агуулдаггүй. Дараа нь SetLength -ийн хэмжээг заан хэрэглэдэг. Жишээ нь: var BigArray : array of Integer; { хэмжээ олгоогүй байна } X : Integer; begin X := GetArraySize; { хэрэгтэй хэмжээг тодорхойлогч функц } SetLength(BigArray, X); { динамикаар хэмжээ тогтоож байна } { одоо BigArray –г хэргэлнэ} end; Шинээр : A динамик массив нь массиваа санах ойд ачаалдаг. A динамик массив нь програмд их бага хэмжээгээр хэрэглэгддэг. Массивийн индекс бүрд элемент харгалзуулан байрлуулах нь ач холбогдолтой. Санах ойд 10 integer хангалттай байлгах хэрэгтэй гэвч бусад нь магадгүй 1000 integer хангалттай хэрэглэдэг. Массиваа Copy функцээр байрлуулан хэрэглэж чадна. Жишээ нь массив нь 100 ба 200 хэмжээтэй элемент хэрэглэдэг : Copy(BigArray, 200); Массивдаа утгыг нь хадгалсан ба массивийн хэмжээ нь 100 -с 200 элемент болон өссөн. Олон хэмжээст dynamic массивыг үүсгэх нь нэг хэмжээст массивыг үүсгэхтэй бараг адилхан байдаг. Доор 2 хэмжээст массивыг үүсгэв. Код нь: var BigArray : array of array of Integer; begin SetLength(BigArray, 20, 20); BigArray[0][0] := 200; end; Strings Програмд String -тэй ажиллахад хэцүү. Object Pascal нь 3 string төрөлтөй: long string, short string, ба wide string. Нэмэлт string төрөлтөй, энэ нь төгсгөлгүй string-briefly ба stringmanipulation функцтэй. Short String Богино string төрлийн урт нь тогтмол, тэмдэгтүүдийн хамгийн их хэмжээ нь 255 тэмдэгт байдаг. Богино string нь 1 -ээс 2 замтай ба 1 зам нь 255 byte хэмжээтэй ShortString -д зарлагддаг. var S1 : ShortString; { 255 тэмдэгт } S2 : string[20]; { 20 тэмдэгт } String manipulation нь short төрөлтөй учир нь санах ой дахь string -ийн хэмжээг өөрчлөхгүй. Богино string хуучин төрлийг нь бодох ба урт string оруулна. Богино strings нь урт byte -тай учир нь string -ийн анхны элемент нь уртаа агуулдаг. (тоо болон тэмдэгт). Short string -ийн анхны элементийн утга нь string -ийнхээ уртыг тодорхойлдог. Жишээ нь : var S : ShortString; { 255 тэмдэгт } Len : Integer; begin S := ‘Hello’; Len := Ord(S[0]);
  • 21. end; Дээрх жишээнд string -ийн уртыг S[0] утга тодорхойлж байна. Мөн функцын уртыг тодорхойлж чадна. Функцын урт нь bit байна. Санамж : Ord функцын утгыг Char төрөл, integer утгаар хувиргаж хэрэглэнэ. (дараалсан утга) Мөн Ord функц нь жагсаалттай хамт хэрэглэгддэг. Хэрэв та short string -ийн эхний элементийг хэрэглэх бол түүний урт нь string байна. Тэгэхлээр програмын орчинд түүнийг хэрэглэх шаардлага гарч ирж байна. Эхлэн суралцагч таны хувьд програм техникийн дэвшилтэт технологид 0 байтын short string -ийг нэмж судлахыг санал болгож байна. Long String long string төрөл нь string объектэд динамик байдлаар байрладаг. Хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. Объект Паскал нь санах ойд string -ийг байршуулж бас устгаж хэрэглэдэг. Long strings нь харин маш их уян хатан чанартай бөгөөд заримдаа short string шиг удаан болхи мэт нарийн төвөгтэй тэмдэгтүүдээ ачаалдаг. Хэрэв үр дүн тань шүүмжлэлтэй санагдвал long string-ийг ашиглаарай. Динамикаар санах ойд байрлуулснаар long string нь тэмдэгт мөрийн гарчгийг өөрчлөх боломжтой болсон Доорх жишээнд string нь түлхүүр үг, параметрийн хэмжээгүй зарлагдсан байна. var S : string; { динамикаар байрласан long string } Учир нь string нь динамикаар байрласанд оршино. Харин танд одоо үйлдлийн хэсэгт өөрчлөлт хийж чадах боломж үлдсэн шүү. Ер нь long string нь хэрэглэхэд маш энгийн ба өөрөөр хэлбэл тэмдэгт мөрөө санах ойгоос ачаалах үед зай завсар гэх мэтийн санаа зовоосон асуудал гарахгүй. Учир нь энэ бүгд илүүчгүй дутуучгүй бүгд автомат юм. Long string нь 0 элементийг зөвшөөрдөггүй бөгөөд хэрэв түүнд хандвал үр дүн тань compiler error буюу алдаатай гарна гэсэн үг. SetLength функцийг ашиглавал зохистой. Wide String Unicode төлөв байдалтай double-byte хэрэглэдэг. Windows API функцэд хэрэглэгддэг. long string -ийн адилаар авах утгын хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. string объектэд динамик байдлаар байрладаг. Үүнээс илүү деталчилсан мэдээллийг та олж авч чадахгүй болов уу. Учир нь OLE function -той дуудуулах хязгаартай байдаг. Null /хоосон/ - Төгсгөгч Strings: PChar ба Char -ын Массив Объект Паскал нь С ба C++ хэлнүүдээс string өгөгдлийн төрлөөрөө ялгаатай. C ба C++ -д string нь 0 нь төгсгөлийг заадаг. Мөн массивын урт нь байтаар биш байдаг. PChar төрлийг дүүргэж хэрэглэх хэрэгтэй ба массивын бүх төрлийг ашиглаж болдог. Жишээ нь Windows MessageBox функц юм. Энэ функц нь Windows -ийн стандарт message мэдээллүүдийг дэлгэц дээр гаргадаг. function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; Хоёр дахь ба гурав дахь параметрүүд нь массивын элементийг заагчаар харуулж байна.(message box текст, message box caption). Эдгээр функцуудыг та Delphi програмаас дуудан ажиллуулж болно. PChar type - ийн жишээ код: var Text : string; Caption : string; begin Text := ‘Шалгаж байна.’; Caption := ‘Текст мэдээлэл’; MessageBox(0, PChar(Text), PChar(Caption), 0); end; Дээрх жишээнд Pchar -ыг Pascal -ын long string, null-terminated string ашиглан үзүүллээ. Харин та өөрөө Pchar -ыг үргэлжүүлж судлаарай.
  • 22. var Text : PChar; begin Text := ‘Шалгаж байна.’; MessageBox(0, Text, ‘Message’, 0); end; Pascal -ын string нь хүчирхэг төдийгүй хялбарханаар хэрэглэгдэж байна. Та үүнээс олон удаа хэрэглэх боломж байхгүй. Pchar -ыг long string, nullterminated string руу хөрвүүлж болдгийг дээрх жишээ харууллаа. Төгсгөлд нь та массивт Char төрлийн өгөгдлийг Pchar ашиглан байршуулж үйлдэл хийж сурлаа. var Text : array [0..20] of Char; begin Text := ‘Шалгаж байна.’; MessageBox(0, Text, ‘Message’, 0); end; Windows API функцийг дуудахдаа null-terminated string -ийг параметраар ашиглавал илүү тохиромжтой. Үндсэн Тэмдэгт мөр /String Basics/ Pascal нь нилээн хэдэн string төрлийн элементүүдтэй. + Operator var S1 : string; S2 : string; begin S1 := ‘SW210 Kim’; S2 := ‘Reisdorph’; Label1.Caption := S1 + ‘ ‘ + S2; end; Дээрх кодод S1, S2 хувьсагчдийн үр дүнг label -ын Caption property –ээр дамжуулан харууллаа. Одоо арай өөр жишээ үзье: var X : Integer; begin X := 199; Label1.Caption := ‘The result is: ‘ + IntToStr(X); end; Энд IntToStr функц ашиглан 199 гэсэн тоог тэмдэгт мөр болгон хувиргалаа. Subscript Oператор Тэмдэгт мөрөөс subscript ([ ]) –г ашиглан элемент бүрийг нь салган авч болдог. var S1 : string; S2 : Char; begin S1 := ‘Hello World!’; S2 := S1[1]; Label1.Caption := S2; end; Дээрх жишээнд S2 хувьсагч нь Char төрлийн байна. Үр дүнд Н гэж Label1.Caption дээр гарна. S[0] -ийг эхний элемент гэж long string, wide string -үүд үздэггүй. String -ийн контрол буюу тохируулга Object Pascal нь String -ийн контрол буюу тохируулгыг шинээр нэвтрүүлж өгсөн. Ихэвчлэн хэвлэдэггүй тэмдэгт мөрд ашигладаг. Та control character хийхдээ # тэмдэг ашиглах ёстой. Доорх жишээнд (ASCII 27) гэж тэмдэглэжээ.
  • 23. S := ‘This is a test. Escape follows.’#27’ Finished.’; S1 := ‘This is a test. Escape follows.’; S2 := ‘Finished.’; S3 := S1 + #27 + S2; Эндээс та хялбархан онол гаргаж болно. Form дээрээ button, label үүсгэ. button дээрээ Double-click /хулганаа товших/ хийж event -ийг нь OnClick болго: Label1.Caption := ‘Line 1’ + #10 + ‘Line 2’; Run хийж button товч дээрээ дар. Label 2 шугамаар мэдээллээ гаргадаг гэдгийг та одоо мэдэж авлаа. Дээрх кодын хувьд (ASCII 10) -ыг 2 шугамаар үзүүлхэд ашиглаж байна. Том хэмжээний текстэн мэдээлэлийг нэг шугамаар авч болно. (ойролцоогоор 200 орчим тэмдэгт орсон үед) Delphi Code Editor нь хамгийн ихдээ буюу 1,024 тэмдэгтээс тогтож болдог. Ийм хэмжээний мэдээллийн унших бүрэн бололцоотой гэж үздэг. Тэмдэгт мөрийн олон шугаман хэлбэрийг + operator -той жишээг доор үзүүлэв. MessageBox(0, ‘Энд маш урт message ‘ + ‘that seems to go on and on forever. In order ‘ + ‘to make the code more readable the message has ‘ + ‘been split across several lines of code.’, ‘Message’, 0); Тэмдэгт мөрийн харьцуулах үйлдэл String нь харьцуулах операторын тусламжтай харьцуулалт хийж чаддаг. Хүснэгт 1.3 их ашиглагддаг операторуудыг жагсаан бичив. ХҮСНЭГТ 1.3. ТЭМДЭГТ МӨРИЙН ХАРЬЦУУЛАХ ОПЕРАТОР. Эдгээр операторууд нь ASCII кодоор харьцдаг. Мөн үйлдэлд биелэгдэх дарааллаараа ялгагдана. Тэнцүү үйлдлийн буруу ашигласан жишээ: if FileName = ‘TEST.TXT’ then OpenFile(FileName) else ReportError; String-Manipulation ФУНКЦ Ихэвчлэн ашиглагддаг функцуудын тайлбарыг доорх 1.4 хүснэгтэд үзүүлэв. ХҮСНЭГТ 1.4. ТЭМДЭГТ МӨРИЙН ФУНКЦ БА ПРОЦЕДУРУУД
  • 24. САНАМЖ: Нэмэлт функцуудын талаар мэдээллийг Delphi програмын help руу орж additional дотроос олж аварай. Одоо жишээн дээр StrToInt function туршиж үзье. Value := StrToInt(Edit1.Text); Өөр StrToXXX функц (StrToFloat, StrToDate гэх мэт) дээрх замын дагуу ажиллана. Format function нь тэмдэгт мөр ба нэмэлт аргументэд хэвшүүлэлт хийдэг. Доорх жишээн дээр үр дүнг нь үзье. var S : string; X : Integer; begin X := 10 * 20; S := Format(‘Үр дүн: %d’, [X]); Label1.Caption := S;
  • 25. end; Үр дүн: 200 Энэ жишээнд %d тэмдэгт нь integer утгыг илэрхийлж байна. Мөн бусад тэмдэгтэй хувьсагчаар дамжуулан ажиллана. Жишээ нь: var X : Integer; Y : Integer; begin X := 20; Y := 5; Label1.Caption := Format(‘%d + %d = %d’, [X, Y, X + Y]); end; Дэлгэцэнд үр дүн нь гарахдаа дараах байдалтай байна. 20 + 5 = 25 Энэ жишээнд label -ын Caption property –г ашиглалаа. Өмнөх болон дараа дараагийн жишээнд ашиглаж бас болно. "Format Strings" –н талаар илүү их мэдээлэл үзье гэвэл Delphi help -ээс аварай. Windows үйлдлийн системийн ерөнхий зохион байгуулалтын талаар товчхон Windows-н өмнөх хувилбарууд MS-DOS үйлдлийн системтэй сайн зохицон ажилладаг боловч үйлдлийн систем гэсэн утгандаа бүрэн хүрч чадахгүй байсан бол өнөөгийн Windows95 өөрөө 1 цогц үйлдлийн системийг илэрхийлж чадах болжээ. Windows95 үйлдлийн систем нь ерөнхийдөө 3 дэд системд хуваагддаг. 1. Win KERNEL 2. Win GDI 3. Win USER Windows95 нь 16 болон 32 битийн программуудыг ажиллуулахдаа системийн виртуаль машин болон дээрхи 3 дэд системийн тусламжтайгаар зохион байгуулдаг. Системийн виртуаль машин гэдэг нь Windows-н бүх ажлыг дэмжиж байдаг Windows95-н бүрэлдхүүнд ордог үйлдлийн орчин юм. Мөн дээрхи 3 дэд системийн ажлыг дэмжиж байдаг. 32 битийн win гэдэг нь санах ойн 32 битийн моделийг ашиглаж байдаг windows-н шинэ хэрэглээ юм. Харин 16 битийн win гэдэг нь бидний урьд өмнө хэрэглэж байсан windows-н хуучин хувилбарууд юм. Тэдгээр нь санах ойн сегментийн хаяглалтийг буюу чухамдаа 80286 процессорын санах ойн моделийг ашигладаг. Тэдгээр нь Windows 3.x –нх шиг ажиллахдаа Windows95 нх шиг нэгдмэл нэг орон зайг хуваан эзэмшдэг бөгөөд олон бодлогын зарчимтай зохицодоггүй. Windows95-н хэрэглээний программийн төвшинд Windows 3.x –н API бүрэн тохирч ажилладаг. Win32 API нь Microsoft –н WinNT, Win32S, Win3.1-н өргөтгөл win32 битийн
  • 26. интерфейс юм. Windows95 үйлдлийн систем нь олон бодлогын аргад үндэслэн дээрх application-уудыг жолооддог. Бүрхүүл гэдэг нь хэрэглэгчийг системтэй харилцах үйлдлийг хангаж байдаг 32 битийн Windows application юм. Windows95-н бүрхүүл нь windows3.x-н программ менежер, файл менежер зэргийг нэгтгэсэн application юм. KERNEL KERNEL нь windows-н доод түвшиний динамик санах ойн функцүүдээр хангаж өгч байдаг үйлдлийн системийн цөм юм. Энэ нь 16 ба 32 битийн windows-н үйлдлүүд тохирох үйлчилгээг хангадаг. GDI GDI нь graphic device interface гэсэн товчилсон үг. Энэ нь Windows95-н график боломж болон дэлгэцэнд харуулах өнгө, хэлбэр дүрс, resolution-г хангаж байдаг. Win32 –т байдаг бүх шинэ боломжуудыг агуулна. USER USER нь дэлгэцийн диспетчер юм. Windows-н интерфейсийг үүсгэх, удирдах функцүүдийн цргц юм. Жишээ нь Хэрэглэгч хэд хэдэн MS-DOS –н Prompt гарган ашиглаж болно. Хэрэглэгч арай илүү виртуалчилах боломжийг хангадаг хэд хэдэн давуу тал гарч ирлээ. Системийн виртуаль машин Windows-н API функцийн төвшин Дээр харлуулсан орон зайг хамтарч эзэмшинэ. Энэдээс Windows95 нь 16 битийн программуудад тусад нь орон зай гарган өгч орчинийг нь бүрдүүлж өгдөг нь харагдаж байна. Windows 32 bit Windows 32 bit 16 bit 16 bit Бүрхүүл Windows-н дэд систем Win KERNEL KERNEL Win USER Win GDI Файл удирдах дэд систем
  • 27. Сүлжээ удирдах дэд систем Үйлдлийн системийн үйлчилгээ Виртуал машин удирдах дэд систем Хөтлөгч хэрэгслүүд Бүрхүүл Энэ нь хэд хэдэн системийн удирдлагыг хэрэглэх нөөцүүдийн боломжуудаар хангах программ юм. Windows95-үйлдлийн системийн бүрхүүл нь дэлгэц системийн нөөцүүдтэй харилцан ажиллахыг удирдан зохион байгуулдаг. API Хэд хэдэн зуун API функцүүд windows-н бүх системийн хийх үйлдчилгээг хангаж өгдөг. Windows-н орчин бол интерфейс баазын дуудалтаар ханддаг. Үүнийг API гэдэг. Системийн виртуаль машин Windows-н бүх application ситемийн виртуаль машины тухайн хил хязгаарт үйлдлээ гүйцэтгэдэг. 16 битын application –ууд өөрийн нэгдмэл хаяглалын орон зайд ажилладаг. Энэ нь application бүрийн өөрийн орон зайн хаяглалтыг 32 битын хаяглалтаар хангаж дэмжиж өгдөг. MS-DOS-н виртуаль машин Windows95 олон тооны MS-DOS-н программыг хамгаалалтын горим эсвэл 8086 виртуаль үйл ажиллагаа ажиллуулж дэмжиж байдаг. MS-DOS-н виртуаль машин хэд хэдийг үүсгэж болно. Виртуаль машины диспетчер Виртуаль машины диспетчер нь үнэндээ үйлдлийн системийн зүрх юм. Энэ нь доод түвшиний санах ойн удирдлага болон драйверуудын виртуаль зохион байгуулалтын үйлчилгээг хянаж ажилллаж байдаг. | Windows95 –н диспетчерүүд Windows95 –н виртуаль машины диспетчер дотор хоёр диспетчер ажиллаж байдаг. Үүнд: Үндсэн диспетчер. (primary scheduler) Энэ нь thread-дын приоретитүүдийг тооцоолж хариу өгнө. Квантын диспетчер (timeslice scheduler) Энэ нь хугацааны квантуудад хувааж хэсэгчлэн ажилуулана. Үнэн хэрэгтээ квантын диспитчер аль thread-н ямар хувийг нь ямар хугацаанд процессороор үйлчлүүлэхийг тооцоолно. Процесс 0-31 хүртэл приоритеттой байдаг ба үүнийг үндсэн диспетчер бодоод
  • 28. квантын диспетчер лүү гаргана. Хэрвээ процессийн хугацааны квант 100 хувь болсон бол VMStat_Background эсвэл VMStat_High_Pri_Background гэдэг төлвийг үлдээдэг. DELPHI ДЭЭР АНХНЫ АЛХАМ ХИЙЦГЭЭЕ Та мэдэж байгаа Delphi бол Borland пүүсийн Windows-ийн орчны програмыг бичдэг дээд түвшний програм юм. Delphi -ээр та Windows -ийн орчны программыг урьд байгаагүйгээр хялбар бөгөөд хурдан бичих боломжтой. Win32 эсвэл Win32 graphical user interface (GUI) -ийг та нээж ажиллуулж болно. Win32 GUI -ийг ажиллуулснаар та дээд түвшний програмчлалын хэлний үнэн хүч чадлыг мэдрэх болно. Мөн та Web browsers –ийг минутийн дотор үүсгэдэг шигээ form дээрх ActiveX control -оор тусгай програмуудыг үүсгэж болно. Энэ мэт олон зүйлийн давуу талууд Delphi -д байдаг ба Delphi нь өөрөө кодоо үүсгэдэг тул програмын биелэлт хурдан байдаг. Танд л гэж хэлэхэд Pascal -ын программчлалыг жаахан судлах хэрэгтэй. Delphi нь Windows програмчлалын доод түвшний нарийн зүйлүүдийг нуудаг ба энэ нь танд чухал биш. Эцэст нь та програмист л болохыг хүсч байгаа бол энэ нь бүгдийг судлах хэрэгтэй. Delphi нь танд урьд байгаагүй хөгжил таашаалыг авчрах болно. Ингээд ханцуйгаа шамлан бүх ажилдаа орогтун. Delphi сэтгэлийн таашаалыг авчрах агуу программ юм. Delphi IDE -ийг өнгөц харъя Энэ хэсэг нь Delphi integrated development environment (IDE) -ийг агуулна. Windows програмчлалыг судлах бүхэнд энэ нь хэрэгтэй юм. Та одоо Delphi -ийг эхлэх урам зоригтой байгаа гэж бодож байна. Программыг эхлүүлэхэд та хоосон form ба IDE -ийг харах болно.
  • 29. Delphi IDE нь 3 хэсэгт хуваагдана. Дээд хэсгийг нь үндсэн цонх гэдэг. Энэ нь toolbars болон Component palette -ийг агуулдаг. Delphi toolbars нь compiling project, хадгалах, нээх үйлдлүүдийг нэг товшилтоор гүйцэтгэх боломжийг танд олгоно. Component palette нь wide array of components агуулдаг ба түүнийг form дээр чирч тавьж болно. Component -ууд нь text labels, edit controls, list boxes, buttons ба бусад болно. . Componentууд нь бүлгүүдэд хуваагдсан байна. Component palette -ийн дээд талын tab -ыг харав уу? Дээр нь очоод click хийвэл өөр өөр component гарч ирнэ. Form дээрээ component -оо байрлуулахын тулд Component palette -ийн компонентын button дээр click хийж component -оо харагдах хэсэгт нь очоод click хийх хэрэгтэй. Яаж хэрэглэх үр дүнд юу болох бол гэж санаа зовох хэрэггүй. Эдгээр нь хормын дотор болно. Шинэ нэр томъёо: Component гэдэг бол software -ийн 2 хэсгийг агуулсан ба тусгай урьдчилан тодорхойлогдсон функц үйлдлийг нь гүйцэтгэж байдаг. Жишээ нь: text label, edit control, list box. Обьектийн инспектор Үндсэн цонхны доор дэлгэцийн зүүн талд Object Inspector байна. Энэ нь component -ийн properties ба events -үүдийг өөрчлөхөд ашиглагддаг. Delphi -тэй ажиллах явцдаа үргэлж Object Inspector -ийг та хэрэглэх болно. Object Inspector нь 2 хэсэгтэй. Properties tab ба Events. Component -ийн properties нь component -ийг яаж ажиллуулахыг удирдана. Жишээ нь : Color property - ийг өөрчлөхөд background color -нь өөрчлөгддөг. Шинэ нэр томъёо: property –нь component -ийн үйл ажиллагааг тодорхойлдог. Events хэсэг нь component -ын event -уудын жагсаалтуудаас бүрдэнэ. Component дотор үйлдэл хийхэд event -ийг ашигладаг. Жишээ нь component дарагдахад event нь component дарагдсан байна шүү гэж танд хэлнэ.Та component -д хамаарах код бичиж болох ба тусгай үйлдлийг гүйцэтгэхэд хэрэглэж болно. Шинэ нэр томъёо: event бол цонх ба хэрэглэгчтэй ажиллах component - ийн харилцан ажиллагааны үр дүн юм. Delphi –ийн ажлын талбар Delphi IDE -ийн үндсэн хэсэг нь ажлын талбар юм. Ажлын талбар нь Form Designer -ийг үүсгэнэ. Энэ нь гайхмаар юм биш Form Designer нь өөрөө form үүсгэдэг. Delphi -д form гэдэг нь программын цонхыг хэлнэ. Form нь программын үндсэн цонх байж болно, dialog box эсвэл цонхны янз бүрийн хэлбэртэй байж болно. Form Designer -ийг, form -ийг үүсгэх процессийн хэсэгт component -уудыг нь байрлуулах, зөөх зэргээр ашиглаж болно. Form Designer -ийн ард Code Editor байдаг. Программын кодыг Code Editor дээр бичдэг. Application -ийг үүсгэн ажиллах явцад Object Inspector, Form Designer, Code Editor, ба Component palette -ууд нь харилцан уялдаатай байдаг. Та Delphi IDE-ийг мэддэг боллоо одоо ямар нэг зүйлийг хийж үзье.
  • 30. Таны эхний програм: Hello World Дэлгэцэнд Hello World гэж хэвлэх нь бүх програмчлалын хэлний сурах бичигт байдаг уламжлалт програм юм. Заавал ийм байх албагүй гэж би боддог. Pascal хэлийг өмнө нь судалсан бол сайн юм. Та гайхаж магадгүй юм, Delphi танд одоогийн Windows program -ийн Hello World -д хүрэх хамгийн хялбар замыг зааж өгнө. Програм бичих Та яг одоо Delphi -ийг ажиллуулж байгаа бол blank form -ийг харсан байх ёстой. Form нь Form1 гэж нэрлэгдсэн байдаг. Form -ийн зүүн хэсэгт Object Inspector form -ийн properties -үүдийг харуулна. Object Inspector -ийн title bar дээр товш. Caption property нь идэвхжих ба cursor нь тэнд юу хийхийг хүлээнэ. Hello World! гэж бичин form -ийн caption -ийг өөрчил. Санамж: Properties -ийг өөрчлөх бол Delphi шууд өөрчлөлтийг нь гаргадаг. Caption -ийг өөрчлөх үед form -ийн window caption нь өөрчлөгдөж байгааг ажигла. Toolbar дахь Run товчийг товш. Form нь гарахдаа caption нь Hello World!. - ийг гаргана. Энэ тохиолдолд ажиллаж байгаа программ нь бараг л blank form шиг харагдана. Програмыг өөрчлөх Одоо программаа жаахан өөрчилье. Hello World чинь байгаа бол Close button дээр товшин хаах хэрэгтэй. Form Designer дахин гарч ирэх ба form- ийг өөрчлөх боломжтой. Программыг илүү сайжруулахын тулд цонхны төвд текст нэмэх хэрэгтэй. Үүнийг хийснээр form -доо text label -ийг та нэмж өгнө. 1. Эхлээд Component palette -ийн Standard хэсэгт товш. 2. Label button -ийг товшоод form -ийн хаа нэгтээ товш. Label component нь form -ийн дотор байна. 3. Object Inspector дээр буцаад оч. Label1 -ийн properties -ууд гарч ирсэн байгаа. Caption property нь бас идэвхжсэн байгаа. 4. Object Inspector эсвэл Caption property -ийн titlebar дээр товш тэгээд Hello World! гэж бич. Form -дээрх label нь Hello World!. гэж гаргана. 5. Үүнийг хийсэн бол label -ийн text -ийн хэмжээг өөрчилж чадна. Font property дээр 2 товш. Property нэмэлт font attribute -ийг харуулахын тулд өргөн болно. 6. Font -ийн Size property -ийг 24 болгоод form -дээрээ товш. Label шинэ хэмжээтэй болно.
  • 31. Програмаа хаах Delphi -д жаахан дурласан бол энэ нь бүхнээс илүү таны сонирхлыг татна. Дараа нь юу хийх вэ гэвэл одоогийн прожектийг хаах хэрэгтэй. File цэсний Close All -ыг сонго. Project1 -ийн өөрчлөлтийг хадгалах бол No -ийг сонго. Таны 2 дахь программ: Hello World, II хэсэг Pascal -ийг судлахаасаа өмнө Delphi хэрхэн ажиллдаг талаар мэдэх хэрэгтэй. Танд Pascal –ийн олон төрөл дээр ажиллахад энэ нь хэрэг болно. Энэ хэсэг нь Delphi -ийн үнэн хүчийг хальт агуулна.
  • 32. Санамж: Компонентийн properties -ийг өөрчилсөн бол design-time өөрчлөлт хийсэн гэсэн үг. Харин кодоор property -ийг нь өөрчилсөн бол runtime өөрчлөлт гэж нэрлэгддэг. Ажиллах үед нь Caption property -ийг өөрчлөхийн тулд: 1. Form дээрх button –ийг 2 товш. Ингэхэд Delphi нь event handler -ийг button -ийн OnClick event дээр үүсгэнэ. Үүсгэсэн код нь дараах байдалтай байна procedure TForm1.Button1Click(Sender: TObject); begin end; 2. Засварлагч курсор нь begin ба end гэсэн зарлагааны хооронд байдаг ба таныг код бичихийг хүлээж байдаг. procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := `Hello World, Part II'; end; Энэ код маш энгийн юм. Энэ нь Hello World, Part II гэсэн өгүүлбэрийг Caption property -руу шилжүүлдэг. 3. Одоо toolbar -т байгаа Run товчин дээр дарж программыг ажиллуул. Программыг ажиллуулахад label -ийн caption нь Label1 гэж хэвээр байгааг анхаарна уу. Form -ийн button дээр дарж label -ийн гарчгийг өөрчил. Гайхамшигтай байгаа биз. Зүгээр л Delphi ажиллаж байгаа юм. Иймэрхүүгээр олон дасгалыг ойрын хэд хоногт хийж form -ийн бусад компонент labels, button –уудын талаар их туршлагатай болно. Би үйл явдлын ард нь юу болдгийг бүхэлд нь тайлбарлах гээгүй харин дараа нь бүх тайлбар хийхийг л хүсэхггүй байна. Object Pascal хэлийг нягтлан харах нь Delphi -ийн RAD онцлогийг суралцахаасаа өмнө обьект Паскал хэлний үндсийг судлах хэрэгтэй. Энэ ном магадгүй хамгийн сайн нь биш юм шиг танд санагдаж болох юм гэхдээ та юуны өмнө обьект Паскалийг судал. Обьект Паскалийг дараалаар нь судалбал сайн хэрэг. III бүлгийн хичээлийн дараа та обьект Паскалийн бүрэн дүр зурагтай болсон байна. Хоромхон зуурын ухвар ойлголтонд бүү хуурт. Зарим нь обьект Паскалийг бүрэн ойлгохыг шаарддаг ба энэ нь бодит туршлага юм. Ойрын хэдэн өдрийн турш та зарим кодын хэсгийг харах ба энэ нь обьект Паскалийн зарим онцлогийг дүрслэн үзүүлдэг. Та зарим дасгал хийх ба таны олсон шинэ мэдлэгийг бататгана .Эхний хэдэн өдөр та зөвхөн Delphi application -ийг жаахан хэсэгт харна. Юун түрүүнд би Delphi IDE болон Visual Component Library (VCL) -ийг судалмааргүй байна. Та бүрэн ойлголттой болсныхоо дараа эхлэх хүртлээ бага багаар ахих хэрэгтэй. Түүхийн шар хуудас 1994 онд Borland пүүс нь RAD хэрэгсэл дээр ажиллаж эхэлсэн ба энэ код
  • 33. нь Delphi гэж нэрлэгдсэн байна. RAD -ийг хэрэгжүүлэх хамгийн шилдэг зам нь компонентийн загвар архитектур байна гэж шийдэгдсэн байсан. Энэ нь системийн гол цөм байх програмын хэлний асуудлыг шийдсэн байв. Тэр үед Borland пүүс нь Pascal –ийн зах зээл дэх ганц борлуулагч байв. Borland нь Pascal -ийн хэрэгсэлийг үйлдвэрлэдэг хамгийн сайн компани байв. Та Pascal -ийн програмист байсан бол Borland -ийн TurboPascal - ийг хэрэглэн амтанд нь орох байсан биз. Borland пүүс Pascal хэлийг хуулийн хүрээнд бүрэн эзэмшдэггүй боловч Pascal -ийн ертөнцөд том байр эзэлдэг гэдэгт эргэлзээ байдаггүй. Энэ нь Pascal хэлний онцлогийг нэмэгдүүлэх тал дээр том байр эзэлдэг. Энд хэлэхэд Pascal -ийн стандарт хороо байдаггүй ба Pascal хэлийг тодорхойлон бичигдсэн стандарт байдаггүй. Borland пүүс Delphi -ийг Pascal -ийн үндсэн дээр бичсэн юм. (Borland -ийн нэр нь програмын хэлний нэр болсон) Delphi хэрэглээнд гарахаас өмнө Borland пүүс Pascal хэлийг өөрчилсөн. Жишээлбэл : Pascal -ийг обьект Pascal болгон өөрчилсөн байв. Энэ нь обьект Pascal нь Pascal -ийн хувьд C++ нь C -ээс ямар ялгаатай байдаг шиг обьект Pascal нь классийг Pascal -д нэмсэн ба үүгээр обьект хандлагат програмчлалд Pascal орж ирсэн. Delphi хөгжихийн хирээр шинэ хэлний онцлог ба түлхүүр үг нэмэгдэн орж ирэн компонент загвартай зохицож эхэлсэн. Түлхүүр үгүүд ба property өөр бусад нэмэгдэн орж ирсэн. Энэ нь Borland -д компонент загварын бүрэн хүчийг хэрэгжүүлэх боломжийг олгосон. Компонентод тохируулан Паскал хэлийг өөрчилснөөрөө Borland нь RAD - ийг хэрэгжүүлэх боломжтой болсон. Гол нь обьект Паскал хэл нь өөрчлөгдсөнөөрөө Delphi -ийн боломжуудыг нээж өгсөн. Үр дүнд нь компонент загвар ажиллаж эхэлсэн. Хэдийгээр Паскалийг өөрчилсөнөөрөө Borland нь том алхам хийсэн боловч урьдах зүйлтэй холбоотой. Microsoft компани BASIC хэлийг авч өөрчлөн Visual Basic хэлийг гаргасан байдаг. Энэ шинэ хэл нь баазад ажилладаг эх Basic хэлнээсээ ялгагдахгүй шахам байсан. Borland пүүс Паскал өөрчилснөөрөө эрсдэлтэй алхам хийсэн. Бүх юмны дараа хэрэглэгчид таатай бус хүлээн авсан. Одоог хүртэл Borland нь Паскалийн зах зээл дээр хатуу байр суурьтай байгаа ба энэ хэвээрээ байгаа билээ. Үүнд алдаа хийхгүй бол обьект Паскал хүчирхэг хэл ба би зарлалтыг нь тэгж хөнгөн хийхгүй байхсан. Обьект Паскал нь сургалтанд бол хамгийн хүчирхэг байгаа билээ. Би Обьект Паскалийг бүх онцлогийг агуулсан гэж хэлэхгүй. Паскал бол програмчлалд түгээмэл хэрэглэгддэг. Санамж: Юу хийхийг тодорхойлохдоо Delphi нь хэд хэдэн нэр томъёог хуулан авсан. Delphi -ийн үндсэн хэл бол мэдээж обьект Паскал ба зарим хүмүүс үүнийг Паскал гэж хэлдэг. Зарим Паскал дээр хийж байна хэлдэг.
  • 34. Эцэст нь юу гэж хэлэхээ та шийд. Обьект Паскал нь обьект хандлагат програмчлалд бүрэн зохицсон болно. Шинэ нэр томъёо: Обьект - урьд нь компонентыг тодорхойлж байсан шиг тусгай програмчлалын хоёр тал юм. (Компонент бол обьект юм, харин бүх обьект нь компонент биш) Pascal Unit -ууд Програмчлал бол код бичихээс илүү ажил юм. Эцсийн эцэст энэ бол програмын цогц бөгөөд код бичих нь програмчлах зорилгыг нь биелүүлж байгаа болно. Таны бичсэн код бол зөвхөн текст файл руу ордог. Компьютер тэр текст файлыг аван машины кодод хөрвүүлэлт хийн ойлгодог. Delphi -ийн код агуулдаг текст файлыг unit гэдэг. Шинэ нэр томъёо: unit бол кодын модульд хөрвүүлэгдэх боломжтой текст файл юм. Unit -ийн төрлүүд Delphi GUI application нь багадаа хоёр unit -ийг агуулдаг. Project source unit нь project source кодыг агуулдаг. Project source код нь DPR өргөтгөл байдаг. Та project source unit -ийг Project | View Source -ийг үндсэн цэсээс сонгон үзэж болно. Project source unit -ийг өөрчлөх хэрэгцээ нэг их байдаггүй. Үнэндээ project source unit -ийг юу хийхээ мэдэхгүйгээр хийх хэрэггүй. Та хэрэв project source unit -ийг санамсаргүй өөрчилсөн бол application тань ажиллахгүй болно. Delphi GUI application -ийн хоёр дахь төрөл нь үндсэн form -ийн unit байдаг. Form unit гэдэг бол тухайн form -тай хамтардаг source code unit байдаг. Unit -ийн энэ төрөл нь PAS өргөтгөлтэй файл байдаг. Delphi -д та энэ төрлийг нь голлон хэрэглэнэ. Delphi GUI application нь голдуу нэг form unit -тэй байдаг. (Үндсэн form -ийн хувьд) Харин энэ нь нэгээс илүү form unit -тэй байж болно. Жишээ нь: About box -ийг гаргадаг application нь үндсэн form unit -тэй байх ба About box -ийн unit байна. Тэмдэглэл: "Delphi GUI application." нь console mode application -ийн GUI application -ээс ялгаатай байдаг. Console mode application бол console window (DOS box) -ийг ажиллуулдаг 32-bit Windows application юм. Console application -д үндсэн form байдаггүй ба өөр form -уудыг агуулж ч болно, агуулахгүй ч байж болно. Хэдий ийм боловч console application нь нэг эсвэл түүнээс илүү unit -тэй байж болно. Delphi application -д та 3 дахь unit -ийг хэрэглэж болно. Энэ төрлийн unit нь source кодыг агуулдаг. Зөвхөн unit -ийг агуулдаг код нь project -ийн бусад unit гэж дуудагддаг. Delphi Unit –ийн бүтэц Delphi unit нь урьд тодорхойлогдсон форматыг дагах ёстой. Unit урьд тодорхойлогдсон форматанд байх ба энэ нь хөрвүүлэгч unit -ийг уншиж
  • 35. чадах ба unit -ийн кодыг компиляц хийж чадна. Delphi project unit нь unit - ийн нэртэй програмын түлхүүр үгийг агуулдаг ба кодын хэсэг нь begin ба end гэсэн түлхүүр үгээр тэмдэглэгддэг. Та үндсэн unit -ийг Delphi -ийн үндсэн цэсээс View | Project Source -ийг сонгон харж болох ба default Delphi project -ийн project source unit -нь дараах байдалтай байна. Тэмдэглэгээ: Доорх мөрийн дугаарууд нь unit -ийн өөрийнх нь хэсэг биш болно. Үүнийг зөвхөн дарааллыг заахад ашигласан. Заримд нь ийм дугаар байгаа ба заримд нь байхгүй болно. Аль алинд нь Паскал хэл нь бусад хэлүүд шиг мөрийн дугаар авдаггүй гэдгийг ойлгох хэрэгтэй. (онцолбол, BASIC). Cтандарт DELPHI PROJECT –ийн PROJECT SOURCE 01: program Project1; 02: 03: uses 04: Forms, 05: Unit1 in ‘Unit1.pas’ {Form1}; 06: 07: {$R *.RES} 08: 09: begin 10: Application.Initialize; 11: Application.CreateForm(TForm1, Form1); 12: Application.Run; 13: end. / 1 мөрөнд програмын түлхүүр үг програмын үндсэн source unit -ээр энэ unit -ийг тодорхойлсон. Үүнийг та unit -ийн нэр Project1 нь програмын түлхүүр үгээ даган яваагаас харж болно. (Delphi таныг нэр өгөх хүртэл өөрөө нэрийг нь автоматаар өгдөг) 3 мөрөөс эхлэн түлхүүр үгээр тодорхойлогдсон хэсгийг харж байна. Ямар ч unit -ийн нэр нь цэгтэй таслалтай түлхүүр үгийг дагадаг ба компиляци энэ дарааллаар хийгдэнэ. 7 мөрөнд компиляцийн директив нь Delphi нь project -ийн resource file -ийг агуулдгийг харна. Resource файлууд нь VIII бүлгээр яригдана. “Creating Applications in Delphi." 9 мөрөнд begin түлхүүр үг ба 13 мөрөнд end түлхүүр үгийг агуулсан. Сүүлийн түлхүүр үг цэгээр төгссөн байгааг ажигла. (unit нь олон түлхүүр үгтэй байж болох ба харин ганц төгсгөлийн end –тэй байна.) 10, 11, 12 -р мөрүүдэд код нь application -ийг үүсгэж байгаа ба application - ийн үндсэн form -ийг үүсгэх ба application -ийн биелэлтийг эхлүүлнэ. Та энэ кодын нарийн хэсэгт анхаарах хэрэггүй. Тэмдэглэгээ: begin ба end нь кодыг блоклоно. Кодын блок нь кодын хэдэн мөрийг агуулж болох ба мөн хэдэн зуун мөрийн кодыг ч агуулж болно.
  • 36. Номонд ч бас ийм байгааг та харж болно. Та ном хэрэглэдэг бол яаж, хэзээ хэрэглэхийг мэдэх болно. Паскал unit -ийн өөр хэсэгт харцгаая. Үндсэн цэсээс File | New -ийг сонгоно. New Items гарч ирэхэд icon -ийг байрлуулан 2 товшилт хий. Delphi шинэ unit -ийг нээх ба харуулахдаа Code Editor -д unit код нь үүснэ. Хоосон UNIT 01: unit Unit2; 02: 03: interface 04: 05: implementation 06: 07: end. Цөөн байгаа биз? Энэ unit нь 2 зүйлтэй. Эхнийх нь unit нь нэр нь түлхүүр үгтэйгээ байгаа. Түлхүүр үгтэй программ эхэлж байгаа ба код нь unit түлхүүр үгтэй ба харин хэдхэн ерөнхий элементтэй байна. Pascal unit нь unit нэртэйгээ байгаа түлхүүр үгээр эхлэх ба end нь хоёулангийнх нь сүүлд байдаг. Энд end түлхүүр үг нь бас сүүлдээ цэгтэй байгаа. Програмын main source unit -ийнх биш unit нь interface ба implementation - уудыг агуулдаг. Энэ хоёр түлхүүр үг нь The interface Section" and "Implementation Section," зэрэг хэсгүүдэд нарийн тодорхойлогдсон байгаа болно. Программын үндсэн unit нь begin and end -ийг хоёуланг нь авч явах ба харин source unit -нь төгсгөлдөө л end -тэй байна. Дараагийн хэсэг нь Pascal unit дотор хэрэглэгддэг түлхүүр үгийг тодорхойлно. Uses жагсаалт Шинэ нэр томъёо: uses жагсаалт бол гаднах unit -уудын жагсаалт. 3 мөрөнд uses түлхүүр үгийг хэрэглэсэн байгаа. Uses нь бусад unit -уудын жагсаалтыг агуулсан хэсгийн эхлэлтийг тодорхойлж байгаа бөгөөд энэ unit нь түлхүүр үгээсээ хамаарна. Application.CreateForm(TForm1, Form1); Кодын энэ мөр нь бусад unit -уудад байрлах мэдээллийг агуулах ба энэ unit -д олдохгүй. Application.CreateForm гэж тодорхойлогдсон процедур нь Forms.pas гэгдэх Delphi unit -д байх ба TForm1 ба Form1 идентификаторууд нь прожектийн main form unit-д байрлах ба Unit1.pas гэж хэлэгдэнэ. Та холболтыг нь харав уу? Uses жагсаалт нь unit -ийг компиляци хийхэд хэрэгтэй нэмэлт мэдээллийг агуулдаг гэж үзнэ. Энд uses жагсаалтийг харуулав. uses Forms, Unit1 in ‘Unit1.pas’ {Form1}; Uses жасгаалт нь 2 unit нэртэй байна. Forms ба Unit1. Заримдаа энэ нь
  • 37. сайн жишээ биш байдаг. Яагаад гэвэл 2 -р unit жагсаалт нь нэмэлт текстийг агуулсан байдаг. (Unit1 in ‘Unit1.pas' {Form1}). Энэ текст нь form -ийг онцлоход хэрэглэгдэх ба unit -дээ байдаг бөгөөд прожектийн main source unit -ээр л хэрэглэгддэг. (Угалзан хаалтанд байх текст нь кодын бусад хэсэгт байх тайлбар) Uses жагсаалтыг байгуулахад мэдвэл зохих 2 зарчим байдаг: • Эхлээд жагсаалт дахь unit бүр дараах unit -ээсээ таслалаар тусгаарлагдах ёстой. • Дараа нь сүүлийн unit-ийн жагсаалт нь цэг таслалтай байх. Цэг таслал нь uses жагсаалтыг төгссөнийг заана. Ерөнхийдөө жагсаалт нь идэвхтэй unit -ийн нэрсийг агуулах ёстой. Uses жагсаалт нь uses түлхүүр үг, цэг таслалтай end -ээр тодорхойлогдох ёстой. Тэрнээс гадна uses жагсаалт нь яаж зохион байгуулагдсанаасаа хамаарахгүй. Жишээ: Дараах 2 uses жагсаалтууд ижил: uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Unit нь uses жагсаалт нь ямар ч тоотой байж болно. Тэмдэглэгээ: Зарим тохиолдолд Delphi нь танд uses жагсаалтанд unit - ийг нэмж өгдөг. Энэ нь File | Use Unit цэсээр хийгддэг. Энэ онцлог нь IV бүлгээр нарийвчлан яригдана. Интерфейс хэсэг Өмнөх кодонд интерфейс түлхүүр үг байгааг анзаарсан болов уу. Интерфейс хэсэг бол идентификатор нь unit -ээсээ авч ирэн зарлагдсан unit –ийн хэсэг юм. Ихэнх unit -ууд нь өөр unit –уудад хэрэглэгдэх кодыг агуулсан байдаг. Энэ код нь класс, процедур, функц, хувьсагчаар хангагдсан байж болно. Аль ч обьект нь интерфейс хэсгээрээ нэг unit -ээс нөгөө unit -руу зарлагдах боломжтой. Та интерфейс хэсэг нь жагсаалтыг агуулдаг гэдгийг хэлж чадна. Интерфейс хэсэг нь интерфейс түлхүүр үгээр эхэлдэг ба implementation түлхүүр үгээр дуусдаг. Implementation хэсэг Шинэ нэр томъёо: implementation хэсэг бол тухайн unit -ийн кодыг агуулдаг хэсэг юм.
  • 38. Implementation хэсэг implementation түлхүүр үгээр эхэлдэг ба дараагийн unit -ийн түлхүүр үгээр дуусдаг. Дараагийн unit -ийн түлхүүр үг нь голдуу unit - ийн төгсгөл end түлхүүр үг байдаг. Паскалийн тал байгаа учир илүү юм ярих боломжгүй байна. Хэдий ийм боловч интерфейс ба implementation - ийн жишээ нь танд ойлголтыг жаахан төрүүлэх болно. DoSomething гэж нэрлэгдэх процедур нь unit -ийг үүсгэнэ. Та бусад unit - уудад DoSomething –ийг дуудагдахыг хүсч байна уу? Энэ тохиолдолд DoSomething процедурыг интерфейс хэсэгт зарлах ба implementation хэсэгт тодорхойлох хэрэгтэй. Доорх хэлбэртэй байна. PUBLIC функцтэй unit unit Unit2; interface procedure DoSomething; implementation procedure DoSomething; begin { Code for DoSomething goes here. } end; end. DoSomething процедур нь interface section -д зарлагдсан байгааг анзаар. Тэгээд implementation section -д тодорхойлогдсон байгаа. Initialization ба finalization хэсэг Initialization ба finalization хэсэг нь unit -ийн шаардлагатай кодыг цэвэрлэх, эхлэл хийх, гүйцэтгэх боломжтой. Initialization section -д ямар ч код unit санах ойд ачаалагдах үед биелэгддэг. Finalization section -д unit санах ойгоос ачаалагдаагүй байхаас өмнө биелэгддэг. Initialization section - гүйгээр та finalization section -тай байх боломжгүй. Энэ хоёр нь хоёул сонголт юм. Unit –д хэрэглэгддэг түлхүүр үгүүд Pascal unit бусдыг агуулж болдог ба сонголтын түлхүүр үг нь өөр өөр зорилгоор нь хэсгүүдийг ангилдаг. Эдгээр түлхүүр үгүүдийн зарим нь олон хэрэглээтэй. Дараах хэсэг нь unit –д хамаарагдах түлхүүр үгийг л тодорхойлсон байгаа. Const түлхүүр үг Ер нь unit нь нэг түүнээс илүү const хэсгийн сонголттой байх боломжтой. Const хэсэг бол түлхүүр үгээр тодорхойлогдсон байдаг. Тогтмолоор зарлагдсан хувьсагчаар const хэсэг нь тодорхойлогдоно. Constant бол өөрчилж болохгүй идентификатор юм. Жишээ нь таны програмд олон хэмжигдэхүүн байдаг гэе. Үүндээ та тогтмол хувьсагчийг ашиглах боломжтой. Const section -ийг доорх програмд нэмье гээд төсөөлөөд үзье. Та const хэсэгт нэг тогтмолыг нэмэх ба өөр const хэсэг нь 2 тогтмолыг нэмсэн. unit Unit2; interface const AppCaption = ‘My Cool Program 1.0’;
  • 39. procedure DoSomething; implementation const BaseX = 20; BaseY = 200; procedure DoSomething; begin { Code for DoSomething goes here. } end; end. AppCaption Тогтмол нь interface section -д зарлагдсан учир unit -ийн аль ч хэсэгт энэ нь хэрэглэгдэж болох ба uses жагсаалтанд байгаа аль ч unit - ийн хувьд мөн адил байна. BaseX and BaseY хувьсагчууд нь unit дотроо боломжтой яагаад гэвэл тэд implementation section -д зарлагдсан. Тогтмол түлхүүр үг нь нэгээс илүү хэрэглээтэй байж болно. Type түлхүүр үг Шинэ нэр томъёо: Type түлхүүр үг нь таны програм хэрэглэх шинэ төрлийг зарлахад хэрэглэгддэг. Шинэ төрлийг зарлах нь esoteric програмчлалын технологи бөгөөд энд тайлбарлах нь хэцүү болно. Доор 20 байтын массив таны application -д хэрэгтэй байгаа ба энэ төрөл нь дахин дахин хэрэглэгдэнэ. Та доорх шиг зарлаж болно. Type TMyArray = array [0..19] of Byte; Та одоо array [0..19] гэж бичихийн оронд TMyArray гэсэн төрлийг ашиглах боломжтой. “Var “Түлхүүр үг Шинэ нэр томъёо: Энэ түлхүүр үг нь хувьсагчууд байдаг кодын хэсгийн зарлалтын үед хэрэглэгддэг. Энэ түлхүүр үгийг та элдэв хувьсагчуудыг зарлахад хэрэглэж болно. Var - ийг зарлах хэдэн байрлал байдаг. Unit -ийн түвшинд var -ийг та зарлаж болно. Мөн процедур, функцийн түвшинд var -ийн хэсэг байж болно. unit Unit2; http://www.csms.edu.mn/cheri/ interface type TMyArray = array [0..19] of Byte; const AppCaption = ‘My Cool Program 1.0’; var X : Integer; MyArray : TMyArray; procedure DoSomething; implementation const BaseX = 20; BaseY = 200; procedure DoSomething; begin { Code for DoSomething goes here. }
  • 40. end; end. Const түлхүүр үг шиг, var -т бас олон хэрэглээ байдаг. Энэ нь бас функц, процедурын параметр, хувьсагч параметруудыг зарлахад хэрэглэгддэг. Тэмдэглэгээ: var -аар тодорхойлогдсон хэсэг нь түлхүүр үгээр эхэлж, дараагийн unit -ийн түлхүүр үгээр дуусна. Кодын тайлбар Паскал хэл рүү нарийвлан орохын өмнө кодын тайлбарын тухай товч танилцуулъя. Тайлбар нь таны source кодод текст хэлбэрийн тайлбар өгөх зорилготой байна. Тайлбар нь код юу хийхийг тодорхойлоход хэрэглэгдэх ба зохиогчийн эрхийн мэдээллийг хангах, өөртөө эсвэл бусдад тэмдэглэл хийхэд л ашиглагддаг. Тайлбар нь ялгаатай 3 аргаар тодорхойлогддог. Дараах зүйлүүд нь бүгд шугмын хувьд хүчинтэй байна. { Don't forget to free this memory! } { ADTAPI.PAS 2.50 Copyright (c) TurboPower Software 1996-98 } (* Оюутнуудаа энэ кодыг засах хэрэгтэй *) // Энэ үнэн зэрлэг код { Энэ код дээр дараа тухтай ажиллана } Магадгүй Delphi –д ихэнх тайлбарын төрөл нь угалзан хаалтыг хэрэглэдэг. “{“ нь эхлэх үед тайлбарыг, ”}” –нь тайлбарын төгсгөлд хэрэглэгдэнэ. Тайлбарын өөр нэг нь (*тайлбар эхлэх,ба *) байдаг. Энд бас нэг тайлбарын тэмдэг байдаг: (*/*) тайлбарын тэмдэглэгээ нь том хэмжээний тайлбарыг хийхэд болно. Эдгээр тайлбарын төрлүүд нь нэг эсвэл олон мөрт тайлбарыг хийхэд ашиглагдана. Тэмдэглэгээ: Угалзан хаалт нь Паскалд өөр хэрэглээтэй байдаг. $ -ийг хэрэглэх үед хаалт нь компиляторын директорыг заадаг. Компиляторт compiler hints үүсгэхгүй гэж зааж өгөн source коддоо {$HINTS OFF} гэж бичих хэрэгтэй. Компилятор энэ мөрийг хараад unit -д дохио өгөхөө {$HINTS ON} –тэй тулаад зогсооно. Тайлбарын 3 дахь хэлбэр нь давхар зураас байдаг. Энэ нь голдуу С - хэлбэрийн тайлбар гэгддэг яагаад гэвэл С ба С++ үүнийн хэрэглэдэг. Энэ хэлбэр нь нэг мөрөнд хэрэглэгддэг. Delphi -д энэ хэлбэр ажилладаггүй гэдгийг хэлье. Тэмдэглэгээ: Энд угалзан хаалт хэрэглэсэн байгаа. ”//” -ийг богино тайлбарт болон тестийн зорилгоор ашигласан . Аль ч тайлбарлагдсан текст нь компиляторт хамааралгүй байдаг. Хэрэв та default Delphi IDE settings -ийг ашиглаж байгаа бол бүх тайлбар мөр нь бичмэл хөх текст байгаа. Энэ нь тайлбарыг хурдан ялгахад дөхөм байдаг. Тэмдэглэгээ: Хэрэв та багийн бүрэлдэхүүнтэй програмчлалын ажил хийдэг бол та хамтран ажиллагчдынхаа код, бичлэгийг уншдаг байх. Кодонд товч тайлбар хийх нь аль ч програмистад цагийг нь хэмнэнэ. Та
  • 41. ганцаараа ажилладаг гэсэн ч тайлбар бичих нь чухал. Та бичсэн кодоо ямар амархан мартаж байгаагаа хараад л гайхна. Сайн кодын тайлбар нь таны хамтрагчийн цагийг хэмнээд зогсохгүй таныг ч бас аварна. Кодын тайлбар бичихээ бүү март! Хувьсагчид Хувьсагчид нь хэрэглэгдэхээсээ өмнө зарлагдсан байдаг. Та хувьсагчдыг кодын тусгай хэсэгт зарлах ба var түлхүүр үгээр тодорхойлох хэрэгтэй. Жишээ нь: var X : Integer; { X хувьсагч нь integer төрөлтэй } Y : Integer; { Байршлын y утга } Өмнө нь “var” түлхүүр үгийн тухай Паскалийн unit -ийн нэр томъёонд дурдсан билээ. Тэр хэсэгт unit -д хувьсагчуудыг хэрэглэдэг ба unit -ийн var хэсэгт зарладаг гэж үзсэн билээ. Тэр нь үнэн ч та бас функц, процедуруудыг энэ хэсэгт зарлаж болно. Функц, процедурт хувьсагчуудыг зарлах боломжийг энэ нь танд олгож байгаа болно. Доорх жишээ нь процедурт var хэсэг байна. procedure TForm1.Test; var S : string; begin S := ‘Hello World!’; Label1.Caption := S; end; Та хувьсагчаа зарласны дараа үүнийгээ санах ойд өгөгдлийг зохицуулахад хэрэглэж болно. Энэ мэдээж танд нэг их сэтгэгдэл төрүүлэхгүй байх гэхдээ хэдэн жишээг танд танилцуулъя. Дараах кодын хэсэг нь X, Y гэж зарлагдсан хувьсагчуудыг хэрэглэсэн. Мөр болгоны эцэст байгаа тайлбар нь юу биелж байгааг тайлбарлана. X := 100; { ‘X’ нь одоогийн утга нь: 100 } X := X + 50; { ‘X’ нь одоогийн утга нь: 150 } Y := 150; { ‘Y’ нь одоогийн утга нь: 150 } X := X + Y; { ‘X’ нь одоогийн утга нь: 300 } Inc(X); { Нэмэгдүүлж байна. ‘X’ нь одоогийн утга нь: 301 } Хувьсагч бол компьютерийн санах ойд байрласан хэсэг утга юм. Эрхэм уншигч та энэ кодны тухай зарим зүйлсийг тэмдэглэж аваарай. Юуны түрүүнд Х хувьсагчийн өөрчлөлт (Бид дараа Object Pascal хэлний хувьсагчийг удирдах оператор, функц, процедурын тухай үзэх болно.) Дараах хувьсагчууд нь нэмэлт, сонгогдсон утга юм. Програмын кодын мөр бүрийн төгсгөлд цэг таслал (;) тавидаг. САНАМЖ: Паскаль хэлийг эхлэн суралцагчид програмын кодуудын хоорондын ялгааг мэддэг байх хэрэгтэй. (зарлагдсан өгөгдөл, утга, хувьсагч, илэрхийлэл г.м) c := a + b; Дээрх жишээнд с хувьсагчид a болон b хувьсагчдийн нийлбэрийн утгыг
  • 42. олгож байгаа үйлдэл болно. Энд a + b нь илэрхийлэл юм. Нэг мөрөнд олон илэрхийлэл бичигдэж болох бөгөөд төгсгөлд нь цэг таслал тавигдана. Зарим тохиолдолд цэг таслал тавигдахгүй байж болдог. Үүнийг бид дараа нь үзнэ. Хувьсагчийн нэрийн ард хувьсагчийг тодорхойлсон төрөл бичигдэнэ. Функц болон процедурт хувьсагч, хувьсагчийг тодорхойлсон төрлийг зарлаж өгдөг. Мөн хувьсагчийн нэрэнд том жижиг үсэг болон доод зураас, тоог хольж хэрэглэж болно. Ихэнхдээ том үсгээр эхэлдэг ба харин доод зураасаар эхлэхийг зөвшөөрдөггүй. Хэдийгээр хувьсагчийн нэр нь 255 хүртлэх тэмдэгтээс тогтож болох боловч яг үнэндээ 20 тэмдэгт ч гэсэн ашиглахад хэцүү байдаг. МашУртХувьсагчийнНэр : Integer; { урт хувьсагчийн нэр } Миний_хувьсагч : Integer; { доогуур зураас ашигласан } x : Integer; { нэг тэмдэгт ашигласан } X : Integer; { нэг тэмдэгт ашигласан} Тэмдэглэгээ2 : string; { үсэг болон тоо ашигласан } САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй. Жишээ нь: var XPos : Integer; { ...later } XPos := 20; XPOS := 200; xpos := 110; XpoS := 40; Паскаль хэл нь С ба С++ хэлтэй харьцуулахад ойлгомж муутай байж болох юм. Гэхдээ та удахгүй үүний ялгааг олж, ашиглаж сурах болно. САНАМЖ: Паскал хэл нь тохиолдлыг нарийн мэдэрч чаддаггүй боловч та програмдаа тэмдэгт мөртэй ажиллахдаа том үсэг ашиглаж сурах хэрэгтэй. Обьект Паскал хэлний Өгөгдлийн төрөл Шинээр: Объект Паскалийн өгөгдлийн төрөл нь санах ойд мэдээллийг хадгалдаг хөрвүүлэгч /compiler/ аргыг тодорхойлсон. Зарим програмчилалын хэлэнд хувьсагч олон төрлийн утгатай байж болдог. Жишээ нь доорх BASIC код юм. X = -1; X = 1000; X = 3.14; BASIC хэлэнд тооны төрөл хэмжээг тааруулахын тулд санах ойн зохицуулалтад анхаарах хэрэгтэй. Хувьсагчийг зарлах Паскал хэлэнд хувьсагчийг програмд ашиглахаасаа өмнө төрлийг нь зарлаж өгөх ёстой. var X1 : Integer; X : Integer; Y : Double;
  • 43. Z : Byte; { ...ө.х } X1 := -1; X := 1000; Y := 3.14; Z := 27; Өгөгдлийн төрлөө зөв сонгосноор програмын үр дүн зөв гарна гэсэн үг. Тиймээс програмаа ажиллуулахаас өмнө өгөгдлийн төрлөө сайн нягтлаж шалгах хэрэгтэй. Зарим өгөгдлийг signed, unsigned –аар өргөтгөж болдог. Өгөгдлийн signed төрөл нь эерэг ба сөрөг утгыг авдаг бол unsigned төрөл нь зөвхөн эерэг утгыг авдаг. Хүснэгт 1.1 д Паскалийн үндсэн өгөгдлийн төрлүүдийн санах ойд эзлэх хэмжээ болон авч болох утгын хязгаарыг үзүүлэв. Хүснэгтэд "String" буюу тэмдэгт мөрийг оруулаагүй. Харин "Strings" гэсэн дараагийн бүлэгт авч үзнэ. ХҮСНЭГТ 1.1. ОБЪЕКТ ПАСКАЛД АШИГЛАДАГ ӨГӨГДЛИЙН ТӨРЛҮҮД (32-BIT).
  • 44. Дээрх хүснэгтэд үзүүлснээр 32 битийн орчинд Integer, LongInt төрлүүд нь санах ойд ижил 4 байт эзлэж байна. Энэ нь Delphi 4.0 -ийн орчинд нийцэж байна. Харин 16 битийн орчинд Integer нь 2 байт эзлэж байхад Longint нь 4 байт эзлэдэг. Ихэнх програмистууд LongInt –ээс илүү Integer –г өргөн хэрэглэдэг. Мөн Int64, Comp (computational) төрөлүүд нь авч болох утгын хэмжээ ижил байна. Харин ялгаатай тал нь өөрсдийн дотоод хөрвүүлэлт хийдэг арга юм. Int64 нь integer төрөл, харин Comp нь real төрөл юм. Real ба Double төрлүүд нь ижил юм. Delphi програмын өмнөх хувилбарт Real төрөл нь 6 байт байсан бол одоо 8 байт болсон. Энэ өөрчлөлт нь Real төрлийг өнөөгийн хэв маягт ашиглах нөхцлийг бүрдүүлж өгсөн хэдий ч Delphi програмд ашиглагдахдаа Double төрлөөс багаар ашиглагддаг буюу хуучирсанд тооцогддог. САНАМЖ: Windows нь 2,147,483,647 (integer –н maximum утга) – аас илүү утга буцааж чадах GetDiskFreeSpaceEx функцыг агуулдаг. САНАМЖ: Single, Double, Extended, Currency өгөгдлийн төрлүүд нь float төрөлд хамаарагдана.(10 -тийн тооллын систем). Харин бусад төрөлтэй integer –ээр холбогддог. integer нь бутархай тоон утгыг илэрхийлдэггүй. Жишээ нь дараахь кодод буруу зарласан байна. var X : Integer; { Дараа нь... } X := 3.75; Энэ үед алдааг тань Паскал хэл тэр дор нь танд хэлж өгнө. Харин та үүнийг мэдсэнээр float төрөл нь Windows орчинд ямар их ашиглагдахыг анзаарах болно.
  • 45. Өгөгдлийн төрлүүдийн хоорондох хөрвүүлэлт Объект Паскаль нь өгөгдлийн төрлүүдийн хооронд хөрвүүлэлт хийж чаддаг. Жишээ нь: var Res : SmallInt; Num1 : Integer; Num2 : Integer; { Дараа нь... } Num1 := 200; Num2 := 200; Res := Num1 * Num2; SmallInt дэх Integer төрөлтэй хоёр өгөгдлийг хооронд нь үржүүлж үр дүнг нь гаргаж байна. Энэ томъёо нь хоёр өгөгдлийн төрлийг холисон хэдий ч Обьъект Паскаль хөрвүүлэлт хийж чадаж байна. Хариу буюу үр дүн нь - 25,536 гарна. Хүснэгт 1.1 -д үзүүлснээр SmallInt нь хамгийн ихдээ 32,767 утга авдаг. Тэгвэл энэ 32,767 дээр нэгийг нэмбэл хариу нь -32,768 болно. Та үүнийг туршихын тулд доорхи зааврын дагуу ажилларай. 1. Шинэ проект нээж form -д label ба button -г байрлуул. 2. button дээр Double-click хийж OnClick event -ийг сонго. 3. Дараахь байдлаар бичнэ. procedure TForm1.Button1Click(Sender: TObject); var X : SmallInt; begin X := 32767; X := X + 1; Label1.Caption := IntToStr(X); end; 4. Run хийж button товчоо дар. Label -ийн caption дээр -32768 болж өөрчлөгдснийг та харах болно. /IntToStr функц нь integer -ийн утгыг string болгон хөрвүүлнэ./ Дээрх дасгал 32767 нэмэх 1 тэнцүү 32768. Дээрх жишээ нь overflow ба wrapping гэж юу болохыг харуулж байгаа юм. Хувсагчдын утгын хувьд overflow буюу орон халилт үүсэхээргүй /ө.х maximum -аас бага/ байх ёстой. Integer төрөл нь ойролцоогоор –2 -оос +2 тэрбумын алслалттай байдаг. Зарим тохиолдолд Object Pascal нь хөрвүүлэлт хийж чаддаггүй. Сompiler error нь Integer Real хоёр хоорондоо хамааралгүй төрлүүд гэж мэдээлнэ. Сompiler error нь тодорхой төрлүүдэд хадгалагддаггүй утгуудыг зааж өгнө. Жишээ болгон доорх кодыг авч үзье. var X : Byte; begin X := 1000; end; Тогтмолыг зарлах Сompiler error –г харуулж байна. Танд Х хувьсагчийн утгыг 1000 гэж сонгож болохгүйг Сompiler нь мэдээллэх бөгөөд учир нь Х
  • 46. хувьсагч нь Byte хэмжээтэй ба Byte нь 0 - 255 хүртэл хэмжээтэй байдаг. Зөвлөгөө: Сompilе хийхдээ санамж анхааруулга алдааны мэдээлэл зэргийг сайтар дагах хэрэгтэй. Тэдгээр нь програмын кодын алдаа хэрэгцээтэй зарим мэдээллүүдийг хэлж өгдөг. Обьект Паскалийн Оператор Хүснэгт 1.2 Түгээмэл ашиглагддаг операторууд.
  • 47. Операторуудын хувьд байнга хэрэглэгдэж байдаг хэсэг нь байхад бас хааях ашиглагддаг операторууд ч байдаг. Аnd, or, not зэрэг түлхүүр үгс нь логикийн болон битийн гэсэн төрөлтэй байдаг. Жишээ нь if (Started = True) and (X > 20) then Z := X and Y; Дээрх жишээнд and үйлдэл нь хоёр янзаар хэрэглэгдэнэ. Тогтмол Өмнө хэлсэнчлэн тогтмол нь утгын хувьд өөрчлөгдлөггүй. Хувьсагчийн утгыг програм бичигч өөрчилж чаддаг бол тогтмолын утгыг чаддаггүй. Тогтмолыг зарлахдаа const түлхүүр үгийг ашигладаг. const DefaultWidth = 400; DefaultHeight = 200; Description = ‘Something really cool.’;
  • 48. Тогтмолыг зарлахдаа (:=) тэмдэг бус = тэмдэгийг ашигладаг. Мөн ямар ч өгөгдлийн төрлийг онцолж заадаггүй. Массив Массив буюу array нь бүлэг утгын цогц гэж хэлж тодорхойлж болно. Өөрөөр хэлбэл нэг төрөлтэй хэсэг элемент юм. Зарлах үед түүнийг санах ойн тодорхой зайд байрлуулдаггүй ба зөвхөн заагчийн эхлэх утга тогтоогддог. Массивыг дараах хэлбэрээр зарладаг. var MyArray : array[0..4] of Integer; Integer нь 4 байтын санах ойтой учраас дээрх массивын хувьд 5 индекстэй тул санах ойд 20 байт эзлэж байна. MyArray массив 5 гишүүн буюу индекстэй. Индексээ дугаарлаж тэмдэглэхдээ [ ] хаалтад бичиж өгнө. Массивийн гишүүн тус бүрд доорх жишээнд анхны утга олгов. MyArray[0] := -200; MyArray[1] := -100; MyArray[2] := 0; MyArray[3] := 100; MyArray[4] := 200; Дараагийн жишээнд 3 ба 4 –р индексуудын утгуудыг хооронд нь нэмж Х хувьсагчид олгож байна. X := MyArray[3] + MyArray[4]; { үр дүн 300 } Олон хэмжээст массив Массив нь олон хэмжээст байж болно. Өөрөөр хэлбэл санах ойд мөр мөрөөрөө дараалж ажилладаг. Хоёр хэмжээст integer төрөлтэй массив үүсгэхийн тулд кодыг дараахь хэлбэрээр бичнэ. var MdArray : array[0..2, 0..4] of Integer; Энэ массив санах ойг 60 байтаар ачаалж байна. Массивын утга нь урд нь санах ойд байрлаж байсан санамсаргүй өгөгдөл юм. Мөн индекс нь тэгээс эхэлдэг. Массивийн элементүүдийг энгийн масив хэлбэрээр ашиглаж болох ба [ ] хаалтын тусламжтай дараахь хоёр байдлаар ашиглаж болно. Үр дүн нь ижил гарна. X := MdArray[1][1] + MdArray[2][1]; X := MdArray[1, 1] + MdArray[2, 1]; САНАМЖ: Массивийн элементийн тооны хязгаарт байхгүй индекс гарч ирвэл алдаа заана. Доорхи жишээнд үзүүлэв. var MyArray : array[0..4] of Integer; X : Integer; begin X := MyArray[3] + MyArray[5]; { 5 дугаартай индекс байхгүй. } end; Тэгэхээр массивийн элементийн хязгаарыг анх зарлаж өгөх хэрэгтэй. Жишээ нь 10*20 хэмжээтэй массив үүсгэе. var MyArray : array[10..20] of Integer; 10 баганатай 20 мөртэй хүснэгт мэтээр төсөөлье.
  • 49. const myArray : array[0..4] of Integer = ( -200, -100, 0, 100, 200 ); Их ба бага функц Эдгээр функцуудыг массивт олон дахин ашиглаж болно. Хувьсагчийн утгын дээд доод хязгаарыг массивт энгийн байдлаар зарлаж өгдөг. Бага /Low/ функц нь доод хязгаараас буцах үйлдэл /return/ хийдэг. Харин Их /High/ функц нь мөн адил массивын дээд хязгаараас буцдаг. var X, I, Lower, Upper : Integer; MyArray : array[10..20] of Integer; begin { MyArray массивын эхний хэсэг } Lower := Low(MyArray); { Lower нь 10 } Upper := High(MyArray); { Upper now contains 20 } X := 0; for I := Lower to Upper do X := X + MyArray[I]; { Х хувьсагч дээр ямар нэг зүйл хийнэ. } end; Массивийн хязгаарын гаднах утга нь ойртоход их ба бага функц тодорхой биш хэрэглэгддэг. Динамик Массив Delphi 4 -т массивийг динамикаар оруулдаг. A динамикийн массивийн эхний хэмжээг гаднаас зарласан ба массивийг зарлах цагт хэмжээг нь тавьж агуулдаггүй. Дараа нь SetLength -ийн хэмжээг заан хэрэглэдэг. Жишээ нь: var BigArray : array of Integer; { хэмжээ олгоогүй байна } X : Integer; begin X := GetArraySize; { хэрэгтэй хэмжээг тодорхойлогч функц } SetLength(BigArray, X); { динамикаар хэмжээ тогтоож байна } { одоо BigArray –г хэргэлнэ} end; Шинээр : A динамик массив нь массиваа санах ойд ачаалдаг. A динамик массив нь програмд их бага хэмжээгээр хэрэглэгддэг. Массивийн индекс бүрд элемент харгалзуулан байрлуулах нь ач холбогдолтой. Санах ойд 10 integer хангалттай байлгах хэрэгтэй гэвч бусад нь магадгүй 1000 integer хангалттай хэрэглэдэг. Массиваа Copy функцээр байрлуулан хэрэглэж чадна. Жишээ нь массив нь 100 ба 200 хэмжээтэй элемент хэрэглэдэг : Copy(BigArray, 200); Массивдаа утгыг нь хадгалсан ба массивийн хэмжээ нь 100 -с 200 элемент болон өссөн. Олон хэмжээст dynamic массивыг үүсгэх нь нэг хэмжээст массивыг үүсгэхтэй бараг адилхан байдаг. Доор 2 хэмжээст массивыг үүсгэв. Код нь: var
  • 50. BigArray : array of array of Integer; begin SetLength(BigArray, 20, 20); BigArray[0][0] := 200; end; Strings Програмд String -тэй ажиллахад хэцүү. Object Pascal нь 3 string төрөлтөй: long string, short string, ба wide string. Нэмэлт string төрөлтөй, энэ нь төгсгөлгүй string-briefly ба stringmanipulation функцтэй. Short String Богино string төрлийн урт нь тогтмол, тэмдэгтүүдийн хамгийн их хэмжээ нь 255 тэмдэгт байдаг. Богино string нь 1 -ээс 2 замтай ба 1 зам нь 255 byte хэмжээтэй ShortString -д зарлагддаг. var S1 : ShortString; { 255 тэмдэгт } S2 : string[20]; { 20 тэмдэгт } String manipulation нь short төрөлтөй учир нь санах ой дахь string -ийн хэмжээг өөрчлөхгүй. Богино string хуучин төрлийг нь бодох ба урт string оруулна. Богино strings нь урт byte -тай учир нь string -ийн анхны элемент нь уртаа агуулдаг. (тоо болон тэмдэгт). Short string -ийн анхны элементийн утга нь string -ийнхээ уртыг тодорхойлдог. Жишээ нь : var S : ShortString; { 255 тэмдэгт } Len : Integer; begin S := ‘Hello’; Len := Ord(S[0]); end; Дээрх жишээнд string -ийн уртыг S[0] утга тодорхойлж байна. Мөн функцын уртыг тодорхойлж чадна. Функцын урт нь bit байна. Санамж : Ord функцын утгыг Char төрөл, integer утгаар хувиргаж хэрэглэнэ. (дараалсан утга) Мөн Ord функц нь жагсаалттай хамт хэрэглэгддэг. Хэрэв та short string -ийн эхний элементийг хэрэглэх бол түүний урт нь string байна. Тэгэхлээр програмын орчинд түүнийг хэрэглэх шаардлага гарч ирж байна. Эхлэн суралцагч таны хувьд програм техникийн дэвшилтэт технологид 0 байтын short string -ийг нэмж судлахыг санал болгож байна. Long String long string төрөл нь string объектэд динамик байдлаар байрладаг. Хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. Объект Паскал нь санах ойд string -ийг байршуулж бас устгаж хэрэглэдэг. Long strings нь харин маш их уян хатан чанартай бөгөөд заримдаа short string шиг удаан болхи мэт нарийн төвөгтэй тэмдэгтүүдээ ачаалдаг.
  • 51. Хэрэв үр дүн тань шүүмжлэлтэй санагдвал long string-ийг ашиглаарай. Динамикаар санах ойд байрлуулснаар long string нь тэмдэгт мөрийн гарчгийг өөрчлөх боломжтой болсон Доорх жишээнд string нь түлхүүр үг, параметрийн хэмжээгүй зарлагдсан байна. var S : string; { динамикаар байрласан long string } Учир нь string нь динамикаар байрласанд оршино. Харин танд одоо үйлдлийн хэсэгт өөрчлөлт хийж чадах боломж үлдсэн шүү. Ер нь long string нь хэрэглэхэд маш энгийн ба өөрөөр хэлбэл тэмдэгт мөрөө санах ойгоос ачаалах үед зай завсар гэх мэтийн санаа зовоосон асуудал гарахгүй. Учир нь энэ бүгд илүүчгүй дутуучгүй бүгд автомат юм. Long string нь 0 элементийг зөвшөөрдөггүй бөгөөд хэрэв түүнд хандвал үр дүн тань compiler error буюу алдаатай гарна гэсэн үг. SetLength функцийг ашиглавал зохистой. Wide String Unicode төлөв байдалтай double-byte хэрэглэдэг. Windows API функцэд хэрэглэгддэг. long string -ийн адилаар авах утгын хэмжээний хязгаар нь зөвхөн ачаалагдсан санах ойгоор тодорхойлогддог. string объектэд динамик байдлаар байрладаг. Үүнээс илүү деталчилсан мэдээллийг та олж авч чадахгүй болов уу. Учир нь OLE function -той дуудуулах хязгаартай байдаг. Null /хоосон/ - Төгсгөгч Strings: PChar ба Char -ын Массив Объект Паскал нь С ба C++ хэлнүүдээс string өгөгдлийн төрлөөрөө ялгаатай. C ба C++ -д string нь 0 нь төгсгөлийг заадаг. Мөн массивын урт нь байтаар биш байдаг. PChar төрлийг дүүргэж хэрэглэх хэрэгтэй ба массивын бүх төрлийг ашиглаж болдог. Жишээ нь Windows MessageBox функц юм. Энэ функц нь Windows -ийн стандарт message мэдээллүүдийг дэлгэц дээр гаргадаг. function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; Хоёр дахь ба гурав дахь параметрүүд нь массивын элементийг заагчаар харуулж байна.(message box текст, message box caption). Эдгээр функцуудыг та Delphi програмаас дуудан ажиллуулж болно. PChar type - ийн жишээ код: var Text : string; Caption : string; begin Text := ‘Шалгаж байна.’; Caption := ‘Текст мэдээлэл’; MessageBox(0, PChar(Text), PChar(Caption), 0); end; Дээрх жишээнд Pchar -ыг Pascal -ын long string, null-terminated string ашиглан үзүүллээ. Харин та өөрөө Pchar -ыг үргэлжүүлж судлаарай. var Text : PChar;
  • 52. begin Text := ‘Шалгаж байна.’; MessageBox(0, Text, ‘Message’, 0); end; Pascal -ын string нь хүчирхэг төдийгүй хялбарханаар хэрэглэгдэж байна. Та үүнээс олон удаа хэрэглэх боломж байхгүй. Pchar -ыг long string, nullterminated string руу хөрвүүлж болдгийг дээрх жишээ харууллаа. Төгсгөлд нь та массивт Char төрлийн өгөгдлийг Pchar ашиглан байршуулж үйлдэл хийж сурлаа. var Text : array [0..20] of Char; begin Text := ‘Шалгаж байна.’; MessageBox(0, Text, ‘Message’, 0); end; Windows API функцийг дуудахдаа null-terminated string -ийг параметраар ашиглавал илүү тохиромжтой. Үндсэн Тэмдэгт мөр /String Basics/ Pascal нь нилээн хэдэн string төрлийн элементүүдтэй. + Operator var S1 : string; S2 : string; begin S1 := ‘SW210 Kim’; S2 := ‘Reisdorph’; Label1.Caption := S1 + ‘ ‘ + S2; end; Дээрх кодод S1, S2 хувьсагчдийн үр дүнг label -ын Caption property –ээр дамжуулан харууллаа. Одоо арай өөр жишээ үзье: var X : Integer; begin X := 199; Label1.Caption := ‘The result is: ‘ + IntToStr(X); end; Энд IntToStr функц ашиглан 199 гэсэн тоог тэмдэгт мөр болгон хувиргалаа. Subscript Oператор Тэмдэгт мөрөөс subscript ([ ]) –г ашиглан элемент бүрийг нь салган авч болдог. var S1 : string; S2 : Char; begin S1 := ‘Hello World!’; S2 := S1[1]; Label1.Caption := S2;
  • 53. end; Дээрх жишээнд S2 хувьсагч нь Char төрлийн байна. Үр дүнд Н гэж Label1.Caption дээр гарна. S[0] -ийг эхний элемент гэж long string, wide string -үүд үздэггүй. String -ийн контрол буюу тохируулга Object Pascal нь String -ийн контрол буюу тохируулгыг шинээр нэвтрүүлж өгсөн. Ихэвчлэн хэвлэдэггүй тэмдэгт мөрд ашигладаг. Та control character хийхдээ # тэмдэг ашиглах ёстой. Доорх жишээнд (ASCII 27) гэж тэмдэглэжээ. S := ‘This is a test. Escape follows.’#27’ Finished.’; S1 := ‘This is a test. Escape follows.’; S2 := ‘Finished.’; S3 := S1 + #27 + S2; Эндээс та хялбархан онол гаргаж болно. Form дээрээ button, label үүсгэ. button дээрээ Double-click /хулганаа товших/ хийж event -ийг нь OnClick болго: Label1.Caption := ‘Line 1’ + #10 + ‘Line 2’; Run хийж button товч дээрээ дар. Label 2 шугамаар мэдээллээ гаргадаг гэдгийг та одоо мэдэж авлаа. Дээрх кодын хувьд (ASCII 10) -ыг 2 шугамаар үзүүлхэд ашиглаж байна. Том хэмжээний текстэн мэдээлэлийг нэг шугамаар авч болно. (ойролцоогоор 200 орчим тэмдэгт орсон үед) Delphi Code Editor нь хамгийн ихдээ буюу 1,024 тэмдэгтээс тогтож болдог. Ийм хэмжээний мэдээллийн унших бүрэн бололцоотой гэж үздэг. Тэмдэгт мөрийн олон шугаман хэлбэрийг + operator -той жишээг доор үзүүлэв. MessageBox(0, ‘Энд маш урт message ‘ + ‘that seems to go on and on forever. In order ‘ + ‘to make the code more readable the message has ‘ + ‘been split across several lines of code.’, ‘Message’, 0); Тэмдэгт мөрийн харьцуулах үйлдэл String нь харьцуулах операторын тусламжтай харьцуулалт хийж чаддаг. Хүснэгт 1.3 их ашиглагддаг операторуудыг жагсаан бичив. ХҮСНЭГТ 1.3. ТЭМДЭГТ МӨРИЙН ХАРЬЦУУЛАХ ОПЕРАТОР.
  • 54. Эдгээр операторууд нь ASCII кодоор харьцдаг. Мөн үйлдэлд биелэгдэх дарааллаараа ялгагдана. Тэнцүү үйлдлийн буруу ашигласан жишээ: if FileName = ‘TEST.TXT’ then OpenFile(FileName) else ReportError; String-Manipulation ФУНКЦ Ихэвчлэн ашиглагддаг функцуудын тайлбарыг доорх 1.4 хүснэгтэд үзүүлэв. ХҮСНЭГТ 1.4. ТЭМДЭГТ МӨРИЙН ФУНКЦ БА ПРОЦЕДУРУУД
  • 55. САНАМЖ: Нэмэлт функцуудын талаар мэдээллийг Delphi програмын help руу орж additional дотроос олж аварай. Одоо жишээн дээр StrToInt function туршиж үзье. Value := StrToInt(Edit1.Text); Өөр StrToXXX функц (StrToFloat, StrToDate гэх мэт) дээрх замын дагуу ажиллана. Format function нь тэмдэгт мөр ба нэмэлт аргументэд хэвшүүлэлт хийдэг. Доорх жишээн дээр үр дүнг нь үзье. var S : string; X : Integer; begin
  • 56. X := 10 * 20; S := Format(‘Үр дүн: %d’, [X]); Label1.Caption := S; end; Үр дүн: 200 Энэ жишээнд %d тэмдэгт нь integer утгыг илэрхийлж байна. Мөн бусад тэмдэгтэй хувьсагчаар дамжуулан ажиллана. Жишээ нь: var X : Integer; Y : Integer; begin X := 20; Y := 5; Label1.Caption := Format(‘%d + %d = %d’, [X, Y, X + Y]); end; Дэлгэцэнд үр дүн нь гарахдаа дараах байдалтай байна. 20 + 5 = 25 Энэ жишээнд label -ын Caption property –г ашиглалаа. Өмнөх болон дараа дараагийн жишээнд ашиглаж бас болно. "Format Strings" –н талаар илүү их мэдээлэл үзье гэвэл Delphi help -ээс аварай. Standart-компнент Delphi программын чухал хэсэг бол компнентууд юм. Одоо Standart- компнентийг үзье. Standart-компнентийн Delphi програмд харагдах хэлбэр доторхи бүтцүүд:
  • 57. -MainMenu : Програмуудын цонхны дээд хэсэгт байрлах програмын үндсэн менюүг хийхэд ашиглагдана. Жишээ нь: Word, Excel, Media Player г.м олон програмд байдаг. Програмы н үндсэн хэсэг Хийгдэх дараалал: 1. MainMenu-гээ сонгоод Form дээрээ гаргаад 2 дарна... 2. Caption дээр нь меньюїгийн нэрнїїдийг дэс дараалан бичиж
  • 58. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: procedure Tform1.New1Click(Sender: Tobject); begin inc (Childcount) ; createMDIChild (‘Untitled’+inttostr (Childcount)+’.txt') ; end; -PopupMenu : Mouse -ний баруун товчтой ажиллана. (мөн дээрхийн адил олон програмд ашиглагдана). PopupMenu Caption дээр нь меньюїгийн нэрнїїдийг дэс дараалан бичиж єгнє(Copy,Paste, Close All г.м )
  • 59. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: procedure TForm1.Closeall1Click(Sender: TObject); var i : integer ; begin for I := MDIChildCount-1 downto 0 do MDIChildren[I].Close; end; -Label : Тэмдэгт мөрийг гаргана. Label ашигласан Caption дээр нь меньюїгийн нэрнїїдийг дэс дараалан бичиж єгнє
  • 60. -Edit : Нэг тэмдэгт мөртэй ажиллана. Жишээ: Тооны машин дээр үзье. Edit компнентийг ашигласанэ Text дээр нь Edit утга бичиж єгнє Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: procedure TForm1.Button11Click(Sender: TObject); begin edit1.Text:=edit1.Text+'1';
  • 61. end; -Memo : Олон тэкст мөртэй ажиллана. Жишээ нь: Notepad, WordPad г.м олон програмд ашиглагдана. Memo компнентийг ашигласан Memo -д ашиглагдах зарим командууд: Memo1.Lines.add(‘thestring’); -Memo -д тэмдэгт мөр нэмэх Memo1.Lines.Clear -Memo -гоос устгах Memo1.Lines[0...] -Memo -д тэмдэгт мөр мөрөөр нэмэх Memo1.Lines.Savetofile(file-ийн нэр зам) - текст файл хадгалах
  • 62. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: procedure CreateMDIChild (name : string) ; var child : TChildWin ; Begin child := Tchildwin.Create(Application); child.caption := name ; if FileExists(Name) then Child.Memo1.Lines.LoadFromFile(Name); end ; -Button : Программуудын товчыг хийхэд ашиглагдана. Жишээ нь: Файлуудыг хадгалах комманд дээр үзье. Button компнентийг ашигласан Button Caption дээр нь меньюїгийн нэрнїїдийг дэс дараалан бичиж єгнє
  • 63. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: procedure TForm1.Closeall1Click(Sender: TObject); var i : integer ; begin for I := MDIChildCount-1 downto 0 do MDIChildren[I].Close; end; -CheckBox, RadioButton : CheckBox : Програм дээр олон сонголт хийх контрол. RadioButton : Програм дээр нэг л сонголт хийх контрол. Жишээ нь: Print -лэх тохиргооны комманд дээр үзье. CheckBox компнентийг ашгиласан RadioButtonком ашгиласан Caption дээр нь меньюїгийн нэрнїїдийг дэс дараалан бичиж єгнє
  • 64. -ListBox : Програмжждын тэмдэгт мөртэй ажиллахад ашиглагдана. Жишээ нь:Select хийж байгаа үйлдэл нь... ListBox компнентийг ашигласан ListBox -ийн events: Items -мөрийн тоо Colums -баганы тоо Extendedselected -нэг нэгээр нь сонголт хийх Multiselected - олон олноор сонголт хийх Parentcolor -эх өнгө Sorted -үсгээ автоматаар эрэмблэнэ.
  • 65. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: Бүрэн хэмжээний зохиосон бичлэг unit Umain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; Edit1: TEdit; Label1: TLabel; Button2: TButton; Button3: TButton; procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button3Click(Sender: TObject); begin close ; end; procedure TForm1.FormCreate(Sender: TObject); begin
  • 66. edit1.Text := '' ; end; procedure TForm1.Button1Click(Sender: TObject); begin if edit1.text = '' then begin showmessage ('Medeellee oruul.') ; edit1.setfocus ; exit ; end ; listbox1.items.add (edit1.text) ; edit1.text := '' ; edit1.setfocus ; end; procedure TForm1.Button2Click(Sender: TObject); var i : integer ; b : boolean ; begin b := false ; i := 0 ; while i < listbox1.items.count do if listbox1.Selected [i] then begin listbox1.Items.Delete (i) ; b := true ; end else inc (i) ; if not b then showmessage ('ustgah medeellee songo.') ; end; end. Үр дүн ба Debug хийхэд:
  • 67. Standart, Additional Mainmenu Popupmenu items Label caption Edit text Memo lines Button Checkbox Radiobutton checked Listbox ComboBox Items Scrollbar Min Max position GroupBox RadioGroup Items Columns Panel Additional Bitbtn Kind glyph SpeedButton Glyph Flat MaskEdit Editmask String Grid cells DrawGrid Image Picture Stretch Transparent Shape Shape
  • 68. Brush Pen Belev Shape style Scrollbox CheckListBox Items.checked Spliter !StaticText Chart Styles fsBold fsItalic fsUnderline fsStrikeout Өөрийн стиль үүсгэх var Styles : TFontStyles; begin Styles := Styles + [fsBold, fsItalic]; end; Memo.Font.Style = Styles; Styles := Styles - [fsItalic]; if fsBold in Styles then DoSomething; Хөрвүүлэлт Inttostr(); Strtoint(); Floattostr() Inttohex() Timetostr() Datetostr() DecodeDate(Date: TDateTime; var Year, Month, Day: Word); EncodeDate(Year, Month, Day: Word): TDateTime; EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime; DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word); var AChar : Char; AnInteger : Integer;
  • 69. begin AChar := `A'; AnInteger := Integer(AChar); Label1.Caption := IntToStr(AnInteger); end; Өнөөдөр та нар энгийн Windows application -аас том Windows application руу яаж орох талаар сурах болно. Тэр тусмаа дараахи зүйлүүдийг: • Window хийх арга (chemeglel) : toolbar болон status bar; • Command хийх; • Delphi application -ийг хувьлах; • Cursor хэрэглэх; Windows Decoration -ийг хийх Би таны байшингын цонхны гэрэл чимэглэл яриагүй. Би юу ярих вэ гэвэл toolbars болон status bar нүүрний тухай ярна. Энэ үйл ажилгааг ерөнхийдөө windows decoration гэнэ. Энэ нь маш олон төрлийн жижиг хэсгээс хамаарна. Toolbars Toolbars нь (мөн control bar эсвэл speedbar гэдэг) Windows program -ийн гол багаж юм. Хэрэглэгчид сэтгэлдээ нийцсэн юм хүсдэг ба toolbar бол тэдний нэг юм. Маш сайн чанрын toolbar нь доорхи зүйлүүдийг агуулсан байх ёстой. • Тoвчнууд нь application -ий цэсэн дээр байх ёстой. • Боломжтой болон боломжгүй товчууд байдаг. • Tooltips нь товчын үйл ажилгааг тайлбарладаг. • Дэлгэцэнд аpplication -ий status bar -ийн нэмэлт заавар гарч ирнэ. • Хасах боломж. • Бусад удирдлагууд нь combobox -ууд эсвэл цэсийг доош нь буулгадаг товнууд шиг байна. Дурдсан зарим нэг өвөрмөц онцолгууд toolbar бүрт байдаггүй. Delphi -д toolbar -ийн өвөрмөц чанар нь хялбар боловсронгуй юм. Дараагийн ”Command -аар үйл ажилгааг нэмэх” бүлэг би command яаж хийх тухай ярна. Би toolbar товчнуудаар command яаж хийхийг дараа үргэлжлүүлэнэ. 8 дахь өдөр “delphi application –д байгуулах” , би урд нь хэлсэнчлэн хамгийн хялбар toolbar байгуулах бол application Wizard хэрэглэх. Чи аль хэдийн application -aa эхэлсэн байсан ч хамаагүй application wizard хэрэглэж toolbar байгуулна. Application -aa application wizard –тай ерөнхий болгоод, дэлгэцийг toolbar –тай нь хамт clipboard руу хуулна, дараа нь чи өөрийнхөө жинхэнэ application -aa дахин онгойлгоод ( application wizard –аа хадгалахгүй ч байж болно), дараа нь clipboard –оос toolbar –ийг өөрийнхөө application –д буулга. Харамсалтай нь application wizard чиний бүх хэрэгтэй зүйлийг (toobar байгуулах) чинь өгөж чадахгүй. Хамгийн бодууштай нь. Application wizard дээр үеийн арга барил хэрэглэж toolbar байгуулдаг. Toolbar байгуулхад
  • 70. бэлдэх зүйл бол toolbar бас coolbar –ийн бүрэлдхүүн юм. (win32 бүрэлдхүүнээс олох хэрэгтэй). Одоо энэ 2 бүрэлдхүүнээс суралцъя. CoolBar Компонент Cool Bar бүлэгүүд (Bands) 1. Coolbar бүрэлдхүүнтэй эд нар program run –лхад байраа өөрчлөнө бас өөр хэмжээтэй болно. Шинэ application бас доошлох (drop) coolbar band –аас эхлэнэ. 2. Coolbar дахь drop combo box. Delphi шинэ бүлэг байгуулж combo box –ийг тогтоож байдаг coolbar –ийн өргөнйин combo box анхаарах. 3. Coolbar дотроо дахиж доошлуулах combo box бүрэлдхүүн хий. Дахиж нэг бүлэг эхний бүлгийн доор байгуулагдсан байна 4. Хоёрдох бүлэгтээ mouse -ийнхоо cursor -ийг хэмжээний grip combo box хоёрын дунд байрлуул. Cursor гарны цэгийг өөрчлөнө. Бүлгээ хөдөлгөхөд чамд мэдэгдэнэ. (чи бас хэмжээний grip хэрэглэж band –aa хөдөлгөж болно) тэр band -аа хөдөлгөж нөгөө band –ийнхаа доод цэгт авайч. Нэгдэх бүлэг жижигсэж хоёрдох бүлэгтээ зай тавьж өгнө. Тэр бүлгээ доошлуулаад coolbar “гийнхаа дунд хэсэгт авайч. Тэгээд хэмжээний grip (sizing grip) хэрэглэж хэмжээгээ өөрчил. 5. Одоо дэлгэцний band “аа coolbard -aa байрлуул. 6. Сool Bar дээрээ дараад autosizе “aa true болго. 7. Дараа нь coolbarn “ийнхаа доороос Memo component “ийг ол. Align -ийг alСlient болго. Одоо run program. Cool bar -ийн бүлгүүдийг түрш. Дээш нь доош нь хөдөлгөж үз бас хэмжээг нь өөрчил. Чамайг band -ийг хөдөлгөх явцад cool bar хэмжээгээ өөрчлөх шаардалга гарч байгааг чи анхаарч байгаа биз дээ. Cool bar -ийн бүлгүүд Bands property луу чөлөөтэй орно. Энэ property бол Tcoolbands, энэ нь Tcoolband -ийн жагсаалт бүрэлдэхүүнүүд. Хэрэв чи хоёрдох бүлгийг нуухыг хүсвэл чи энгэж нууж чадна: CoolBar.Bands[1].Visible := False; Чи хоёр аргаар бүлгүүд нэмж болно. Чи аль хэдийн сурснаар бүлэг байгуулахдаа coolbar -ийн аль нэг бүрэлдхүүнийн drop бүрэлдхүүн хэрэглэж болно, бас нөгөө арга нь Bands editor хэрэглэх юм. Bands editor хэрэглэхдээ double-click coolbar эсвэл click button Object inspector дотор Bands propertyt -ийн хажуугийн button. Бүлэг нэмэхдээ Add button hereglene. Чи бас бүлэг арилгахдаа delete button хэрэглэнэ. Мove up бас move down button -ийг хэрэглэж бүлгүүдийн дэс дарааг өөрчлөнө. Чи bitmap property хэрэглэж бүлгийнхээ background -ийг суурьлуулана. Дүрсийг сонгоход тэр дүрс бүлгийн зүүн талд гарна. Чи imageindex хэргэл. Чи байгуулахдаа бүлгийнхээ хамгийн нам бас хамгийн богино хэмжээг тогтоохыг хүсвэл MinHeight бас MinWidth property хэрэглээрэй. Бүлгийнхээ хэмжээг тогтвортой байлгахын тулд FixedSize property to True гэж болго. ToolBar Компонент Хуучин Toolbar –аа устгах
  • 71. 1. Меню component-ийг дараад, Alight property-ийг All None болгон өөрчилнө. Менюгийн дээд талаас дарсан чигээр чирээд шинэ хэрэгсэл нэмэх зай гаргана. 2. Toolbar дээр дараад устгана. Шинэ Toolbar нэмэх Дахин шинэ component нэмж дахин эхлэж болно. Юуны өмнө coolbar болон toolbar -ийг нэмэх хэрэгтэй. Энэ удаад coolbar тийм их чухал хэрэгтэй биш, учир нь одоогоор зөвхөн нэг toolbar -тай байгаа. Гэхдээ дараа нь toolbar нэмж болох ба үүнийгээ бодолцож төлөвлөх нь зүйтэй. Дараах алхамуудыг гүйцэтгэнэ. 1. Form дээр (дүрс) coolbar -ийн component -ийг зөөж тавина. Энэ нь өөрийг автоматаар form-ийн дээд хэсэгт байрлуулдаг. Property name-ийг coolbar болгон өөрчил. 2. Coolbar-т toolbar component-ийг зөөж тавь, түүний Name property-г maintoolbar болгон өөрчил. 3. Бүх захын хязгааруудын үзүүлэхийн тулд object inspector-т байгаа Edgeborders property-д 2 удаа дарна. Ebtop хэлбэрийг False болгон өөрчил. (одоо бүх edgeborder хэлбэрүүд False болно) 4. Flat property-г True болгон өөрчил. Энэ нь курсор тэдний дээгүүр өнгөрөх бүртэл toolbar-уудад хавтгай харгалзах хэлбэрийг олгоно. 5. Coolbar дээр даран түүний Autosize property-г True болгон өөрчилнө. Coolbar нь toolbar-ийн хэмжээгээр өөрийн хэмжээг өөрчлөх болно. 6. Memo component дээр дараад Align property-г буцаагаад AllClient болгон өөрчил. Toolbar –т товч нэмэх Одоо toolbar-д товчлуурууд нэмж эхлэе. Та хэд хэдэн товчнууд, мөн цөөхөн завсрууд нэмж болно. Эхний үед товчнуудгүй байх ба үүнийг дараа нь янзалж болно. Одоо дараах алхамуудыг хийе: 1. Тoolbar дээр хулганы баруун товчоо дараад New Button -г сонго. Ингэхэд шинэ товч toolbar дээр байрлана. Товчны Name property-г File NewButton болгон өөрчил. Hint Property-ийг New богоод New File үүсгээд, Show Hint-р property-г True болго. (Hint Code-ийг 8 дахь өдөр бичсэнээ сана. Энэ код чинь програмд байгаа бөгөөд шинэ hint чинь шууд ажиллах болго) 2. Дахин Toolbar дээр баруун товч (маузны) дараа New Button-ийг сонго. Ингэснээр 2 дахь товч эхний товчны баруун талд байрлагдах болно. Name Property-ийг нь File Open Button болгон өөрчил. Hint Property-ийг Open гээд байгаа файлаа нээ. Show Hint property-ийг True болго. 3. Дахин товч нэм. Товчны Name property-ийг File Save Button болгон өөрчил. Hint property-г save болгоод файлыг хадгалж show hint property-г True болго. Санамж: Товчнууд болон spacer-үүдийг toolbar-т нэмэхэд toolbar-ийн сүүлийн хяналтын хэсгийн баруун талд үргэлж байдаг. Button-г oруулахдаа хүссэн газраа байрлуулах боломжгүй ч дараа нь button эсвэл spacer нэмэгдэхэд дараад өөр
  • 72. газар зөөж болно. Байгаа button-ууд нь шинэ button-д зай гаргаж өгнө. Ингээд button-г тохируулах эхний алхам дууслаа. Одоо button-ны 2 дахь тохиргоог хийнэ. Гэхдээ үүнээс өмнө эхний тохиргоо болон 2 дахь тохиргооны хооронд багахан завсар тусгаарлагч хэрэгтэй. 1. Toolbar-дээр баруун товчоо дараад New sepatator-ийг сонго. Тoolbar-т тусгаарлагч бий болно. 2. Бас нэг товч нэм. Name property-г нь Edit Cut Button; Hint propertyг Cut/cuttoclipbord болго. 3. Copy & Paste товч нэм. Нэрүүдийг болон Hint property-г ашиглалтын дагуу нэр өг. 4. Дахин тусгаарлага оруул. 5. Help About Button товч оруул. Hint property-г About/About Scratch pad болгон өөрчил. 6. Cut; Copy; Paste; Help товчнуудийг сонго. (Shift дарж байгаад) Тэгээд Show Hint property-г True болгон өөрчил. Сонгосон товч болгон өөрчлөгдөнө. Хийсэн form чинь Figure 13.3-тай адил болох болно. Toolbar –ийн товчыг ажилуулах Товчлууруудыг гаргачихлаа. Одоогоор тэд ямарч үүрэг гүйцэтгэх чадваргүй байгаа. ОnClick-г нь тохируулаагүй байгаа. Одоо үүнийг хийцгээе: 1. Эхний товчны File New Button-ийг дараад Object Inspector -ийн Event хуудасийг сонго. OnClick-ийн drop-down суман дээр дараад File New Click-г сонго. Ингэснээр товчийг идэвхжүүлэх боломжтой болно. 2. Товч бүр дээр нэгдүгээр алхамыг гүйцэтгэ. OnClick дарж сонголт хийхдээ болгоомжтой бай. 3. Scratch Pad-д About Box-г хийгээгүй бол одоо нэгийг хий. Дараа нь Help/About menu-д үйлдлийг зааж өг. Help about button-ий OnClick-г татаж, Help About menu-д үйлдлийг өг. Toolbar -ийн товчнуудад Bitmap нэмэх Энэ Toolbar-т Ямар нэг юм дутуу байна. Glyphs нэмэх шаардлагатай. Дараах алхамуудыг хийж Imagelist component нэм. 1. Form дээрээ Imagelist component байрлуул. 2. Form дахь Imagelist component -ийн icon дээр байруун товчоо дараад Imagelist editor-г сонго. Imagelist editor харагдана. 3. Add товчийг дар. Сommon FilesBorland sharedImagesButtons хавтсийг удирдлага болгон FILENAME.BMP файлыг дарж нээ. Харилцах цонх гарч bitmap-г 2 дүрс болгон салгах уу гэсэн асуулт гарна. Шинээр дүрснүүд маань адил өндөр өргөн нь 16 боллоо гэсэн үг. Сонгосон дүрс чинь 16 pixel-ээс муу өргөнтэй ба тохиромжтой хэмжээнд жижигрэх эсвэл 2 дүрсэд хуваагдана. Дахин дуудвал Delphi-тай нэг Bitmap 2 дүрстэй хамт гарч ирнэ. Эхний Дүрс нь хэвийн, дараах нь дутуу гарна. 4. Image list Editor-р bitmap-ийг 2 дүрс болгохдоо Yes-г дарна. Ингэснээр 2 дүрсийг харуулна. Эхний дүрс нь л таньд хэрэгтэй. Дутуу дүрсийг устга. 5. Add Button-г дахин дар. Fileopen.BMP файл дээр дар. Bitmap-ийн 2 дүрс болгоход Yes дар. Дутуу дүрсийг устга.
  • 73. 6. Товч бүр дээр 5-р алхамыг гүйцэтгэ. Дуртай Bitmap-ийг сонго. Дүрсийн жагсаалтийг гаргаж байхдаа илүү дүрсүүдээ устгаж байхаа мартав. Toolbar дахь товчнуудын дарааллаар Imagelist editor дахь дүрсүүд байрлаж байгаа эсэхийг хараарай. Ингээд 7 дүрстэй болллоо. 7. Ok дараад Imagelist editor-г хаа. Санамж: Imagelist editor -г нэг удаад хэд хэдэн дүрсийг зэрэг сонгоод дүрсийн жагсаалтыг нэг дор хийж болно. Одоо Toolbar-ийг дүрсний жагсаалттай холбож байна. Toolbar дээр Object Inspector-т Images property-г байрлуулаад доорхи жагсаалтаас Imagelist – г сонго. Бүх алхмаа зөв хисэн бол таны товчнууд дүрстэй болсон байгаа. Toolbar нэмэх бүрт Delphi автоматаар ImageIndex Property-г товчинд зориулж оруулж өгнө. Учир нь та товч боолон дүрснүүдийг ижил дарааллаар байрлуулсан ба товчнууд дахь glyphs зөв байх нь гарцаагүй. Хэрвээ товч буруу байвал товчны ImageIndex property-г өөрчилж болно эсвэл Imagelist editor-луу дахин ороод дүрс ба дүрсний жагсаалтийг өөрчилж болно. Санамж: Дүрсний жагсаалтын дүрсүүдийг дахин байрлуулж, тэднийг ILE-ийн шинэ байрлалд зөөж тавь. Glyphs товч Одоо хэрэглэх боломжтой товчны л glyphs -тэй болно. Ажиллах боломжгүй товчны glyphs мөн шаардлагатай. үүнийг хийх 2 арга бий. • Ажиллах боломжгүй glyphs-г Toolbar автоматаар бүтээх. • Ажиллах боломжгүй Bitmap-г агуулах 2 дахь дүрсийн жагсаалтыг товчинд зориулж бүтээх. Үүний эхний арга нь Хамаагүй хялбар юм. Ихэнхи тохиолдолд үүнийг хийхэд хангалттай ч заримдаа идэвхигүй товчны glyphs-г бүтээгч алгоритм ажиллахгүй байх тохиорлдол гардаг. (glyphs-ийн илэрхийлэл нь тодорхой бус, зөв биш харагддаг). Учир нь товчинд хангалттай өнгө ялгах өнгө байхгүйд байгаа юм. Энэ тохиолдолд та идэвхгүй товчны glyphs-г агуулж буй 2 дахь дүрсний жагсаалтйг гаргаж болно. Toolbar-ын DisabledImages property-г тохиргоог хийж идэвхигүй glyphs бүхий дүрснүүдийг тохируулснаар үлдсэн нь автоматаар хийгдэх болно. ScratchPad-н хувьд Toolbar-н товчнуудийг автоматаар орж байгаа цаашид хийх шаардлагатай зүйл үгүй. Хуучин ScratchPad-г дахин хамт гаргаж болно. Энэ бол төслийг хадгалах боломжтой үе юм. Хадгалсны дараа Run товчийг дарж програмыг ажиллуул. Тэгээд товчнууд юу хийх ёстой, юу хийж байна гэдгийг хар. Хэрэв программ ажиллахгүй бол эргэж алхам бүрээ хянаад алдааг олж зас. Ингээд амжилттай бол ScratchPad төслийн номын кодийг харсан нь дээр байх. Toolbar Tips ба Hints 7 дахь өдрийн ‘VCL components”, 8 дахь өдрийн “Delphi-д хэрэглээг бий болгох нь” сэдвээр ярилцаж байхдаа, ScratchPad programm-д hint text
  • 74. оруулж байхдаа tooltip болн hints-ийн талаар яриж байсан. TABLE 13.1. TOOLTIP-д ХАМААТАЙ хэрэглээний PROPERT-ууд. Дээрх Default-ийн тохируулсан хугацааны сонголт нь ихэнхи хэрэглээнд байдаг хэдий ч та өөрийн хувилбарыг оруулах сонголттой. TOOLBARS БA ЗӨВӨЛГӨӨ • Хэрэглэгч хяналтын текстйиг уншиж байхад хяналтын тооltips бүү хэрэглэ. • Tooltip, Hint-г товч бөгөөд тодорхой байлга. • Status bar-ны Hint-г илүү утга төгөлдөр болго. • Хэрэглэгчдээ Hint-г хаах сонголтыг өг. Toolbar-т өөр хяналт нэмэх Toolbar-н бүрэлдэхүүн хэсэг бол маш өргөн хүрээтэй. Toolbar-т нэмэгдэх хяналтын бусад төрлүүдээс хамгийн түгээмэл нь Combo Box юм. Combo Box бүхий Toolbar үсгийн фонт солих, zoom тохируулах, сонголт хийх гээд боломж хязгааргүй. Component-г Toolbar-т нэмэхдээ Component Palette-ээс component сонгоод toolbar дээрээ зөөж аваач. Toolbar өөрөө хаана байрлуулахаа зохицуулна. Шаардлагатай бол зай тусгаарлагч оруул. Нэгэнт component-г toolbar-т оруулсан бол хэлбэр байдлыг хүссэнээрээ янзал. Нэлээд төвөгтэй мэт боловч үнэндээ энэ бүхэн маш энгин. Windows API-г ашиглан toolbar Combo Box-г оруулж туршиж үзээгүй бол Delphi ямар их ажлыг чин хөнгөлж хамгаалж байгааг та ойлгохгүй. Dockable Toolbar Dockable Toolbar нь байршилаа өөрчилдөг. Хулганаараа дараад өөр байрлалд байрлуулж болно. Ихэнхи Windows -н программд dockable toolbar
  • 75. түгээмэл байдаг. Dockable toolbar бол paradox sort-ууд юм. Нэг талаар ихэнхи хэрэглээтэй dockable toolbar хэрэглэгчид маань хүлээж бйадаг ба энэ өвөрмөц тун дажгүй юм. Нөгөө талаар ихэнхи dochable toolbar-ууд үйлдэл хйихэд хэрэглэгддэг. Delphi-д dochable toolbar-г хийхэд хэцүү биш юм. Та ч үүнийг хийж чадна. Тэмдэглэл: Үүнийг зөвхөн toolbar -ийг хийх хэргэлхэд ч бус windows -ийн орчинд ашиглаж байна. Dockable Toolbar -ийг хийх Dockable toolbar хийхэд 2 алхам хийнэ. • Dragkind-н тохиргоог DkDock дээр тавь. • Dragmode-г тохиргоог dkAutomatic дээр тавь. Дээрх сонголтын хийсний дараа toolbar-г дэлгцэн дээрээ хүссэнээрээ байрлуулж болно. Гэсэнч үүнийг байнга хийх шаардлага гарахгүй. Toolbar-г байрлуулахад drag&drop үйлдлийг хийж чаддаг байх хэрэгтэй. Dock Sites Roger Waters-ийн хэлснээр “Ямарч тэнэг хүн нохойд оромж хэрэгтэйг мэддэг” адил toolbar гарган бйарлуулах орон зай хэрэгтэй. Windows –н орчны component-ууд нь DochSite property-н тохиргоо нь True байдаг. Component нь голцуу TpageControl, Tcoolbar, Tcontrolbar, Tpagescroller, Tpanel-г docksite -р хэрэглэдэг. Дараах алхамуудыг гүйцэтгэ: 1. Хоосон форм дээр coolbar-н component-г тавь. Docksite property-г True болго. 2. Coolbar дээр toolbar-г тавь. Toolbar-ын dragkind property -г dkDock болгоод үүнийг dragMode property-г dmAutomatic болго. Toolbar дээр хэд хэдэн шинэ товч бий болго. 3. 2 дахь Coolbar-н оролт дээр байрлуул. Aligh property-г dLeft болгоод Aligh property-г True болго. 4. 3 дахь Coolbar-г байрлуул. Coolbar-ийн өргөн нь 40 pixel орчим байна. Одоо Програмаа ажиллуул. Toolbar -г DockSite -с DockSite -рүү зөө. Status Bar Status Bar нь хэрэглээг улам хэрэгцээтэй болгодог бас нэг онцлог юм. Бүгд биш ч ихэнхи нь Status Bar -д тус болдог. Win32 Status Bar хяналт бүхий VCL Status Bar бүрэлдэхүүн нь Breeze -г бүтээгч Status Bar -г хидэг. 13.2 хүснэгтэд буй мэдээллийн жагсаалтийг нэг харчих. StatusBar PROPERTIES.
  • 76. Дээрх хүснэгтээс харвал Status Bar энгийн ба multipanel-тай байдаг байна. Энгийн уу? эсвэл цогцолбор уу? Хэрвээ Simple bar-тай байхыг хүсвэл simple panel propety-г True болго. simple panel-ийг True эсвэл False болгосноор simple ба complex Status Bar аль нь байхыг сонгож болно. Complex Status Bar нь олон панелтай. Хэрвээ Status Bar хэрэглэх бол Status Bar panel editor -ийг ашигла. Status Bar panel editor-г дуудахын тулд panels property -н Value column дээр 2 дар. Panel нэмэхийн тулд Status Bar panel editor-н Add New товчийг дар. Устгахын тулд Delete Selected товчийг дар. Засвар хийхийн тулд панелаа сонгоод Object Inspector –н панелийн тохиргоог хий. NOTE: Complex bar -ны панел тус бүр TstatusPanel -н төрөл юм. Ихэнхи properties өөрийн тайлбартай байдаг хэдий ч цаашдын тэмдэглэлд 2 хүчин зүйл шаардлагатай. Text property нь панелд харуулах текстээ агуулж байдаг. Text property-г мөн панелийн текстийг өөрчилж байхад хэрэглэж болно. Status Bar-н тохиргооны талаар дараа яригдах болно. Панелийн дизайн дээр текстийн
  • 77. хэрэг байхгүй. Ажиллаж байхад текст өөрчлөх гэж байгаа бол psText эсвэл psOwnerDraw-ын алинаар нь ч Style property-г тохируулж болно. Панел дах текстүүд Alignment property-н зааснаар байрлана. Хэрэв Style нь psOwnerDrawing байвал панел ямар байх талаар дараа ярилцана. Panel-д зориулсан Width, Bevel, болон Alignment properties бол шууд тодорхой байдаг. Дадлага хийснээр эдгээр property Status Bar-н харагдах байдалд хэрхэн нөлөөлөхийг мэдэж болно. Note: Status Bar panel editor -ээр дамжуулан Status Bar ямар өөрчлөлт оруулдгийг форм дизайнер дээр харж болно. Status Bar panel editor дээр ажиллаж байхдаа Status Bar -г харж чадна. Хийсэн өөрчлөлт бүр чинь форм дизайнер дээр харна. Status Bar дээр панел нэмээд дууссан бол SBPE-г форм дизайнер руу буцаж ор. Note: Status Bar component-н panels property-г өөрчлөн сайжруулж байхад форм дизайнер автоматаар simple panel property-г False болгоно. Хэрэв та multiple panels-г хэрэглэж байгаа бол simple Status Bar-тай байхыг хүсэхгүй биздээ. Status Bar –ийн текстийг өөрчлөх Үүнийг хийх 2 арга байна. • Status Bar-ны simple text property-г зааврын дагуу өөрчлөнө. (Simple status bar) эсвэл панел тус бүрийн Text property-г (complex Status Bar-т) • VCL-г автоматаар Auto Hint proprerty-г True болгохоор status bar –г тохируул. Хэрэв simple status bar -тай бол status bar -ын текстийг өөрчлөх нь их энгийн юм. Simple panel property нь True байхад status bar -д оруулах хүссэн текстийг Simple text property-д тохируулна. StatusBar.SimpleText := ‘This shows up in the status bar.’; Complex bar -тай бол текст өөрчлөх нь жаахан илүү төвөгтэй байх. Хэрвээ complex status bar-н эхний panel-н текстийг өөрчлөхийг хүсвэл нэг иймэрхүү зүйл ашиглах байх. Боловсруулсан: оюутан Б. Нямсүрэн SW01D062 Хянасан: багш Ч. Эрдэнэбат 14 Өөрөө өөртөө заах нь: Borland Delphi 4 http://www.csms.edu.mn/cheri/ StatusBar.Panels[0].Text := ‘Status Bar Text’; Status bar component-н panels property нь Item гэж нэрлэгдэх status bar-ын панелийн array-тай байдаг. Энэ Item-н array-д хийсэн Text property-н элемент нь панелийн текстийн өөрчилнө. Учир нь Item бол panels object-д default array property болдог ба та онцгойлсон заалттай Items-тэй байх шаардлагагүй. Array 0-д сууршагдсаныг харж байгаа байхаа. status bar- ны эхний панел нь 0 array элементтэй байна. Автомат status bar-ны Hint текст нь тайлбартаа их юм шаарддаггүй. Таны
  • 78. хийх зүйл бол Autohint property-г True болгон явдал юм. үлдсэн нь автоматаар хийгдэнэ. NOTE: AutoHint-г хэрэглэсэн ч та status bar-н текстийг зааварчлан өөрчилж болно. status bar-н текстийг та яаж ч өөрчилж болно. Курсор текст hint-тэй component-н дээгүүр өнгөрөх дараагийн удаад текст сонгогдоно гэдгийг мартуузай. Owner-Drawn Status Bar Panels Түрүүн panel-н Style property нь psText эсвэл psOwnerDraw байж болно хэмээн хэлсэн билээ. Panel-ийн Style-ийн psOwnerDrawn болгохдоо панелд харагдах аливаа дүрсийг өөрөө хийж болдог. Дэлгэцэн дээр дүрс гаргахын тулд owner panel -г ашиглах яршигтай ажилтай боллоо гэсэн үг бишээ. Энэ нь та дэлгэцэн дээр status bar-нд горим төрлийн icon эсвэл bitmap гаргана гэсэн үг. Хийх алхамууд: 1. Panel-ын Style property-г psOwnerDraw болго. 2. OnDrawPanel event –д кодыг бичиж өг. OnDraw panel-н үйлдлүүдийг л хийх нь гол ажил юм. OnDraw panel-н event handler иймэрхүү харагдана. procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); Status bar-н хэмжүүр бол status bar-н заагч юм. status bar-т ер нь заагчтай байх болно. Тиймээс multiple OwnerDrawn status bar хэрэглээгүй бол энэ хэмжүүр хэрэггүй. Одоогоор drawing-д хэрэгтэй тусгай панелийн заагч бол panel property юм. Та энэ хэмжүүрийг хэрвээ status bar-таа нэгээс илүү OwnerDrawn panel-тай бол аль panel нь drawing хэрэгтэй байгаа гэдгийг тодорхойлохийн тулд ашиглаж болно. Rect хэмжүүр нь panel-ийн хэмжээг ба байрлалыг агуулж байдаг. Энэ хэмжүүр нь их чухал юм. Учир нь энэ нь зургийн хэсийн хэмжээг яг тодорхой хэсэг юм . OnDrawPanel event handler нь Style property-г psOwnerDraw болгох панел тус бүрийг дуудсан. Хэрэв та зурах ганцхан панелтай бол санаа зовох хэрэггүй. Хэрэв multiple panels зурах бол аль panel-г вэ гэдгээ тодорхойлоод зур. Хавсралтийг харвал тодорхой ойлгох байхаа. Номны код нь status bar-тай холбоотой зүйлсийг хийхэд тус болох хавсралт бүхий Statbar гэсэн нэртэй программыг багтаасан байгаа. Программыг ажиллуулж таны хэрэглээний status bar-г гүйцэтгэж буй tip-н эх сурвалжийг тань мэд. Зураг 13.6-д программ хэрхэн ажиллаж байгааг харуулжээ. Энэ программын status bar нь multiple panel-тай болохыг харж байгаа байхаа. Дунд талын 3 panel-ууд бол OwnerDrawn юм. OVK болон EXT тэмдэгтэй panel-ууд нь Word программ эсвэл code editor-тай төстэй байгаа. Overtype эсвэл Extended Selection mode зэрэг иймэрхүү төрлийн
  • 79. программууд нь on ч байж магад off ч байж магад. Хэрэв mode нь on байвал status bar-н panel дахь текст хар өнгөтэй байна. Хэрэв off байвал текст 3 хэмжээст бүдэг харагдана. 3 дахь OwnerDrawn panel нь Windows icon-ий нөөцийг status bar дах графикийн хэрэглээг хавсаргана. Программыг ажиллуулж хэрхэн ажиллаж байгааг мэд. Жагсаалт 13.1 StatBar программын OnDrawPanel үйлдлийг харуулж байна. procedure TMainForm.StatusBarDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); var R : TRect; Icon : HIcon; begin with StatusBar.Canvas do begin { Create a temporary TRect object. The Rect parameter { is const so we can't change it. } R := Rect; { Check to see if panel 3 is the panel which needs { to be drawn. If so, draw an icon in the panel. } if Panel.Index = 3 then begin { Load one of the stock Windows icons. This time { using the API is easier than using VCL. } Icon := LoadIcon(0, IDI_HAND); { Draw the icon and shrink it down to 15 x 15 pixels. } { Center it in the panel, too. } DrawIconEx(Handle, Rect.Left + 6, 3, Icon, 15, 15, 0, 0, DI_NORMAL); { Nothing more to do. } Exit; end; { This rather lengthy if statement checks to see if { either the Overtype Mode or Extended Selection { check boxes are checked. If so, then what we need { to do is to draw the text twice. First, we draw it { in white. Then we draw it again, offset by 1 pixel, { in gray. The effect is a 3D disabled-text look. } if ((Panel.Index = 1) and (OvrMode.Checked = False)) or ((Panel.Index = 2) and (ExtendedSel.Checked = False)) then begin { Move over and down one pixel for the offset. } Inc(R.Left); Inc(R.Top, 2); { Change the text color to white. } Font.Color := clWhite; { Set the backround mode to transparent so the { text appears hollow and so that the white { text can be seen under the gray. } Brush.Style := bsClear; { Draw the text using the API function DrawText. } { I use DrawText because it allows me to center { the text both horizontally and vertically within
  • 80. { the given rectangle. } DrawText(Handle, PChar(Panel.Text), -1, R, DT_CENTER or DT_VCENTER or DT_SINGLELINE); { Set the color to gray because we're going to { draw the text in gray in a moment. } Font.Color := clGray; { Set the rect back to the original size. } Dec(R.Left); Dec(R.Top, 2); end; { Display the text. If the item is not disabled then { the default color (black) is used to draw the text. } { If the item is disabled, then the text color has { been set to gray by the code above. } DrawText(Handle, PChar(Panel.Text), -1, R, DT_CENTER or DT_VCENTER or DT_SINGLELINE); end; end; Энэ код нь сүрдмээр харагдаж болох юм. Гэвч ихэнх нь тайлбар юм. Код нь нилээд энгийн бөгөөд алхам бүртээ тайлбар орсон байгаа. 3D харагдаж байгаа идэвхигүй текст нь нэг удаад цагаанаар бичигдсэнээр боловсронгуй болж drawing нь Slight offset-тэй саарал болно. Үр дүнд нь текст хонхойн харагдана. Icon нь Windows API functions LoadIcon болон DrawIcon Ex-г хэрэглэснээр гарч ирнэ. status bar panel-ийн Owner drawing эхлээд байх хэдий ч энэ нь тийм муу эд биш гэдгийг та ойлгох болно. Та Windows-н хэрэглээг удаан хугацааны турш бичиж магад, тэгээд status bar-даа хэзээ ч Owner Drawing ашиглахгүй ч байж мэднэ. Хэзээ нэгэн цагт хэрэг болвол хийхэд боломжгүй зүйл биш гэдгийг мэдэж авлаа. Command Enabling Command Enabling нь тухайн үеийн нөхцөл байдлаас хамаарч товчийг биелэгдэх, үл биелэгдэх болгох процесс юм. Жишээ нь: Текст засварлаж байх явцад ямарч текст идэвхжүүлээгүй хирнээ Cut эсвэл Copy товчийг дарвал ямарч команд биелэгдэхгүй. Clipboard-д ямар ч текст ороогүй бол Paste товч ажилдаггүйтэй адил. Command Enabling нь тийм ч хэцүү биш. Ялангуя шинэ Delphi-н TActionList component-тай бол хүнд асуудал биш. Зөв хийж сурахад хугацаа хэрэгтэй. Учир нь та наривчлан алхам бүрт анхаарал тавих хэрэгтэй. Command Enabling –ийг TActionList and TАction ашиглан хэрэгжүүлэх TAction төрлүүд Command Enabling болох таатай нөхцлийг бүрдүүлнэ. TAction List нь component palette-г нэмэлт TAB-г олж зохицуулдаг. Нэрнээс нь аваад үзвэл TAction Object-н жагсаалийн асуудлийг илэрхийлж байна. Та ямар нэг үйлдлийг бүтээлээ, тэгээд үйлдэл дээрээ тулгуурлан
  • 81. ямар нөхцөлд биелэгдэх, үл биелэгдэх ёстойг тэмдэглэнэ. Үүнд component цэс, toolbar, context menu items г.м. Edit/Cut –командийг авч үзье. Хамгийн багаар гэхэд үүнд зориулсан 3 үйлдэлтэй байх хэрэгтэй. • Үндсэн цэс • Toolbar товч • Шуурхай цэс (popup) Action List editor-р үйлдлээ хийнэ. Жишээ нь: Edit/Cut. Cut нэртэй үйлдлийг хийгээд CutAction гэнэ. Тэгээд Object Inspector -ийг ашиглан CutAction-г тэмдэглээд Action property-г үйлдлийг хийх объект бүрт (цэс, toolbar, шуурхай цэс) хамааруулж өгөх хэрэгтэй. Ажиллуулах явцад Cut сонголтын идэвхжүүлэхийн тулд нэг код хийчихнэ. CutAction.Enabled := True; Ингэснээр Cut-г биелүүлэх бүх component ажиллах болно. Идэвхигүй болгохын тулд үйлдлийг Enabled property-г False гэж тэмдэглээд л болоо. TAction болон TAction List-н OnUpdate үйлдэл нь командыг идэвхжүүлэх кодийгтохиромжтой газар байрлуулна. TAction ашиглан командыг биелүүлэх чадвартай боллоо. Дараагын хэсэгт Scratch Pad-д командийн биеллийг нэмэх болно. Command Enabling –ийг хэрэгжүүлэх Эхлээд Action List component -г тохируул, дараа нь олон төрлийн component -г action жагсаалтайд оруул. Scratch Pad программд командыг хэрэгжүүлэе. Тэмдэглэл: Хэрвээ та хэд хэдэн үйлдлийг хадгалахыг хүсэж байгаа бол, үйлдлийн шинэ категори нээж болно. Шинэ үйлдлийн категори үүсгэхийн тулд өөрийн хүссэн дурын текстэд 1 ба түүнээс дээш үйлдлийг агуулах энгийн категори үүсгэхийн тулд эхлээд edit үйлдлийг үүсгэнэ. Компонентод Action –уудыг холбох Үйлдлийн бүрэлдэхүүн хэсгийг холбох дараагийн алхам бол: 1. Menu Editor –ийг эхлүүлэхийн тулд Main Menu – н дээр 2 удаа товш. 2. File/ save menu – г сонгоод save үйлдлийн шинж чанарыг соль. 3. File save as menu – г сонгоод, save as үйлдлийн шинж чанарыг сонго. 4. Edit menu – руу шилжээд Cut menu-г сонго. Cut үйлдлийн шинж чанарыг өөрчил. 5. Copy үйлдлийг ашиглаж edit menu доторх Copy Рastе үйлдэлийг 4-т заасантай адил адил замаар үйлдэлийг гүйцэтгэнэ. 6. Toolbar menu доторх File save товчийг дарж Form Designer –г үүсгэнэ. 7. Cut ,Copy, Рastе үйлдэлийг тус тусад нь гүйцэтгэхийн тулд Toolbar menu доторх Cut ,Copy , Рastе товчлууруудыг дарна. 8. Хэрвээ шаардлагатай бол Memo Papup menu –ний үйлдэлийн шинж чанарыг өөрчил. Хэрэв та үйлдэлийн шинж чанарын бүрэлдэхүүний Save үйлдлийг гүйцэтгэх тушаал өгсөн тохиолдолд Save үйлдлийн бүрэлдэхүүн хэсэг
  • 82. болох Caption. Checked. Enabled. Help context . Hint. Image. Index . Shortcut болон Vteible – үүд нь бүгд өөрчлөгдөх болно. Ямар нэгэн үйлдэл хийхэд түүнийг бүх бүрэлдэхүүн хэсгүүд дахин өөрчлөгдөн бичигддэг. Тиймээс та шинэ үйлдэл хийхэд Hint болон Item index нь өөрчлөгдөнө. Энэ үйлдлийг гүйцэтгээгүй тохиолдолд FoolBar болон Hint text буруу бичигдэх болно. Тухайн үйлдлийн бүрэлдэхүүн хэсэг бүр түүнийг тойрон бичигдсэн байдаг. Тодорхой үйлдэл өөрчлөгдсөн тохиолдолд, тухайн үйлдэлд хамаарагдах бүрэлдэхүүн хэсгүүд бүгд өөрчлөгдөнө. SaveAction.Enabled := False; Хэрвээ ийм код гарч ирвэл Save үйлдлийг үүсэгэхэд үйлдлийн шинж чанарын ямарч бүрэлдэхүүн хэсэг боломжгүй гэсэн үг. Энэ үйлдлийг боломжтой болгохын тулд дараах кодыг ашигла: SaveAction.Enabled := True; Энэ бол маш энгйн. Учир нь дараах 2 код тэнцүү тохиолдолд Save үйлдлийг гйүцэтгэхэд тухайн үйлдлийн бүрэлдэхүүн хэсэгт өөрийн шинж чанар агуулагдана. { Үйлдлийг гүйцэтгэх нэгэн тохиолдол байна. } SaveAction.Enabled := False; { Хүнд арга. } FileSave.Enabled := False; FileSaveBtn.Enabled := False; Ээн жишээний зөвхөн нэгээр л та хадгалж чадна. Хэрвээта хэд хэдэн бүрэлдэхүүн хэсгийг боломжтой эсвэл боломжгүй болгох хэрэгтэй байгаа тохиолдолд энэ үйлдэл нь таны цагийг маш ихээр хэмнэх болно. Та шинэ үйлдэл хийх болон түүнтэй хамааралтай хэд хэдэн бүрэлдэхүүн хэсгийг болмжтой болгоход дээрх код маш хялбар гүйцэтгэх болно. Scratch Pad программ руу шилжье. Cut болон copy товчлуурууд ажилlах боломжгүй байна гэж бодъё. Memo дотор текст бичээд түүнийгээ Toolbar доторх Cut болон copy товчлуур боломжтой болно. Memo дотор хаа нэгтээ товшиход сонгогдсон текст дахин сонгогдох болно. Энэ тохиолдолд Cut. copy товчлуурууд дахин ажиллах боломжгүй болно. Paste товчлуур ажиллах боломжтой байна уу. Хэрвээ тийм бол монитор дээрх Alt + print screen товчлуурыг дар. Энэ тохиолдолд Paste товчлуур ажиллах боломжгүй болно. Өөр текстийг сонгоод Cut эсвэл Copy товчлуурын аль нэгийг товш. Энэ тохиолдолд Paste товчлуур ажиллах болно. Учир нь одоо Memo -д буулгах өөр текстийг агуулж байгаа учраас. Энэ хэрхэн ажиллах вэ. Хэрвээ ямар нэгэн Edit хяналтийг ажиллуулаад оруулсан тохиолдолд түүнийг дагалдах бүх бүрэлдэхүүн хэсгүүд / TEditCopy. TеditCut. TeditPaste / үйлдэлтэй автоматаар ажиллах боломжтой, үгүйг гүйцэтгэх болно. Save. Save as ангилалуудыг ажиллах боломжтой болгох командууд. Дээрх командыг гүйцэтгэхийн тулд OnUpdate гэдгийг ашиглах хэрэгтэй. Үүнээс OnUpdate –ийн тухай мэдээллийг авах хэрэгтэй. On Update нь таны өгсөн командыг ажиллагаатай болгохын тулд тохирох зайгаар хангана. Таны хүсэлтийг гүйцэтгэхэд бэлэн болсон тохиолдолд танд WM_Enteridle гэсэн мэдээллийг илдгээх болно. Та өөрийнхөө командыг ажиллах боломжтой болгохын тулд On Update –д шинэ холбоо үүсгэнэ. Та командаа шалгахын тулд Memo -гийн нөхцөлийг шалгаж Save. Save as ажиллах болмжтой болно.
  • 83. On Update үйлдлийг үүсгэхэд дараах зүйлүүдийг буюу алхамуудыг гүйцэтгэнэ. 1. Action list Editor эхлүүлээд Action бүрэлдэхүүн хэсгийг 2 удаа товш. 2. Ажиллах боломжтой үйлдлийн жагсаалтаас Save action сонго. Хэрвээ үйлдийн жагсаалтанд дээрх үйлдэл харагдахгүй байгаа тохиолдолд File үйлдлийн категорийг товш. 3. On Update д Object Juspector гаргаж ирэхийн тулд Value гэсэн товчлуурыг 2 удаа товш On Update дотор Code Editor гарч ирнэ. 4. Action list Editor байрлуул. Хэрвээ Action list Editor олж чадахгүй байгаа тохиолдолд View / Window жагсаалтыг ашигла / үйлдлийн жагсаалтаас Save Action –ийг сонго. 5. On Update-ийн дараагийн хуудас руу шилжихийн тулд сум зааж байгаа хэсэгт 2 удаа товш. Жагсаалтаас Save action update –г сонго. Энэ нь On Update, Save, save as файл ашиглах боломжой болно. 6. Action List Editor .-ийг хаа. procedure TMainForm.SaveActionUpdate(Sender: TObject); begin { Command enabler for Save and Save As. } SaveAction.Enabled := Memo.Modified and (Length(Memo.Lines.Text) > 0); SaveAsAction.Enabled := SaveAction.Enabled; { The following two command enablers don't use actions. } { Instead the Enabled property of the two menu items } { is accessed directly. } { Command enabler for Select All. } EditSelectAll.Enabled := Memo.Lines.Count > 0; { Command enabler for Undo. } EditUndo.Enabled := Memo.Modified; end; Өмнө нь Memo text агуулж байсан, эсвэл үгүй байсан ч memo тодорхойлогдсон байсан ч үгүй ч save action үйлдэл ажиллах боломжтой байсан. Дээрх кодыг хэрэгжүүлснээр текст агуулж байгаа болон ажиллаж байгаа тохиолдолд Save үйлдэл горимд ажиллах боломжой болно. Save. Save as категори адил аргаар ажиллана. Edit menu. Select all undo хэрэглүүр нь үйлдлийг ажилгаагүй байсан ч ажиллах боломжтой. TCommandList Энэ бол таны өгсөн командын жагсаалтанд хараахан дурьдагдаагүй байгаа нэмэлт тусламж юм. Дээрх нуугдмал тусламжийг харахын тулд дараах алахмуудыг хийнэ. 1. Schatch Pad`s гол бүтцээс Main menu гэсэн тэмдэглэгээг сонго. 2. ImageList – ийн Image – n шинж чанарыг өөрчил. 3. PopupMenu –г адил аргаар хий. Харин одоо программ руу шилжээд File & Edit menu -г хар. Menu-nii доторхи хэсгүүд Image Index–n шинж чанар болон түүнтэй дагалдах үйлдлүүдийг хэвээр хадгалагдаж үлдэнэ. Delphi Application хэвлэх Windows - ийг ашиглагчдын өдөр тутам хийдэг үйлдэл бол хэвлэх юм. Dos -
  • 84. ийн орчинд бодитоор ашиглах хэвлэлтийн боломжуудаар хангадаг. Тухайн программ бүрийг хэвлэхэд Dos программ бүхий л боломжоор хангаж өгч байдаг. Delphi хүсэлтийг хэвлэхэд хэд хэдэн үе шат дамжина. Үүний тулд та эхлээд VCL -д хэвлэлтэнд бэлтгэж сурах хэрэгтэй. Тэгсэн тохиолдолд автоматаар бүх зүйлийг гүйцэтгэх болно. Үүнээс гадна та тусгай хэвлэх командуудыг эзэмших болно. Хэвлэх команд Box -н доторх зүйлүүдийг судлах хэрэгтэй. Харин дараа нь Delphi хүсэлтийг хэрхэн хэвлэхийг ярилцья. Хэвлэх Dialog Boxes Windows нь таны хүсэлтийг биелүүлэхэд Print & PrintSetup хангаж өгнө. Print командыг хэвлэж эхэлэхэд ашиглана. Харин PrintSetup командыг хэвлэлтийг дүрсэлэхэд ашигладаг. Print Dialog Box Print команд нь хэрэглэгч гол Menu -нээс File print командыг сонгоход гарч ирдэг юм. Тэгээд OK товчлуурыг дарахад хэвлэж эхэлнэ. Хэрвээ Cancel товчлуурыг дарахад команд таслагдана. Print dialog бүрэлдэхүүн хэсэг дотор VCL -ийн Print команд гүйцэтгэх ердийн аргаар Print dialog -г дуудаж хэвлэх үйдлийг хийж болно. Print командыг дуудсаны дараа хэвлэх командыг дагалдаж хэдэн хувь хэвлэх, ямар хэмжээтэй хэвлэх вэ гэсэн бүрэдлэхүүн хэсгүүд дагалдаж гарч ирнэ. Хэвлэх хүсэлт өгсөн тохиолдолд бүх командуудыг хэвлэхэд бэлэн болгож бүх боломжуудыг ханган өгөх хэрэгтэй. PrintDialog PROPERTIES.
  • 85. Print rage болон Print to file цонхны Print команд өгөгдсөн тохиолдолд түүнийг хаах илүү үйлдэл хийх шаардлагагүй. Жишээ нь: Хэрэв та хэвлэх хүсэлт өгсөн тохиолдолд From page –s To page -г хүртэл таны хэрэгтэй гэсэн бүхнийг уншиж хэвлэх болно. ОК товчлуурыг дарахыг мартуузай. Print Setup Dialog Box Хэвлэх командаа өөрчлөх, хуудасны хэмжээ, тоо, боломж зэргийг өөрчлөхөд Print setup –g ашигладаг. Шинээр хэвлэх команд өгч байгаа тохиолдолд, Print командыг ашиглахаас PrintSetup -г ашиглахгүй. Гэвч PrintSetup нь Print командаас хамаагүй хялбар ашиглагддаг. PrintSetup -ийг сонгосноор Print командыг дагалддаг бүрэлдэхүүн хэсгүүд бүгд автоматаар гүйцэтгэгдэх болно. PrintSetup дуудаад Cancel товчийг дарвал бүх зүйл зогсох болно. Харин ОК товчийг дарахад хийж гүйцэтгэх ёстой бүхнийг өөрөө гүйцэтгэнэ. procedure TMainForm.FilePrintSetupClick(Sender: TObject); begin PrinterSetupDialog.Execute; end;
  • 86. Хялбар аргаар хэвлэх Та ямар ч төрлийн хүсэлт шаардлага тавьсан, хэдэн зуун ширхэг ч бүгдийг нь хэвлэх боломжтой. Эхлээд хамгийн хялбар аргыг судлаад дараа нь илүү ажиллагаатай тооцогдох хэвлэлтийг судална. Form –ийн хэвлэх аргууд Хэлбэрийн агуулгыг хэвлэхэд form нь командийг дуудаж хэвлэдэг. Энэ нь зөвхөн хэрэгтэй зүйл л хэвлэгдэнэ. Дагалдах хүрээ зэрэг нь хэвлэгдэхгүй. Та Print Scale цонхыг хянаж байдаг 3 хэлбэрийн хэвлэх командыг сонгож болно. PrintScale PROPERTY Option Тайлбар poNone Тусгай хэмжээ шаардахгүй шууд хэвлэнэ. PoProportional Дэлгэцэн дээрх хэмжээтэй ижил хэмжээгээр хэвлэнэ. poPrintToFit өгөгдсөн хэвлэх командын хэлбэр, хэмжээг өсгөж хорогдуулна. RichEdit Component Windows тэмдэглэлийн хяналтаар орсон бүх ажлыг шууд хангах бүрэлдэхүүн хэсэг бол RichEdit юм. RichEdit команд өгсөн тохиолдолд Print командаар дамжиж хэвлэгдэнэ. Энэ хэвлэх команд ажиллаж байхад print manager цонхыг ашиглаж Caption -г нэг параметр өөрөө дуудна. RichEdit.Print(‘MyApp.exe - readme.txt’); TIP: WindowsAPI нь ShellExecute командаар эхийг хэвлэнэ. Жишээ нь: ShellExecute(Handle, ‘print’, ‘readme.txt’, nil, nil, SW_HIDE); Энэ код нь Notepad ачаалалд Readme текст нэртэй файлыг хэвлэнэ. Дараа нь Notepad руу шилжинэ. Та Notepad программыг үндсэн цонхон дээрээс олж харахгүй учир нь Sw_ hide загвар Show параметрд зориулагдсан байдаг. QuickReport –дамжуулан хэвлэх Өгөгдлийн сангийн программууд нь мэдээлэлүүдийг хэвлэхэд QuickReport - ийг ашиглаж болно. Энэ хэсгийн гарчгуудыг бүү хойш нь тавь. Хэвлэх бол тийм хүнд даалгавар биш юм. Багахан цаг зав, байршил л шаардах байх. Эхлээд өөрийн хэвлэх гэж буй зүйлийнхээ хэрхэн дугаарлахыг мэдэж байх хэрэгтэй хэд хэдэн зүйлүүдийг судлах хэрэгтэй. Дараа нь та тусгай кодийг хайгаарай. Device Context гэж юу вэ? Canvas бол дээр та текст бичиж, шугам татаж зураг зурах зүйлүүдийг хийж болдог. Саnvas –т хамаарах шинж байдлууд, жишээ нь: шулуунуудын төрлийг сонгоход DC дээр сонгогдсон үзэгийг ашиглана. Үүний нэгэн адил өнгө хэлбэрийг гаргах бийрийг сонгож өнгө хэлбэрийг гаргана. Учир нь windows -т DC -ийн хязгааралагдмал байдаг. DC -ийн бүх деталуудын талаар та VCL халхавч хэсгээс харж болно. Та хэвлэх canvas -ийг дэлгэцийн canvas дээр таны зурсантай адил хийнэ. Энэ нь canvas -ийн орчинтой төстэй аргаар хэвлэдэг. TPrinter Class ба Хэвлэх Ажилгаа VCL нь операторыг TPrinter class -аар хангахад тусалдаг. Энэ нь windows -ийн бүх хэвлэлтийг Printer нь шулуун, график, текст болон бусад зурсан
  • 87. объектуудыг хэвлэдэг canvas шинж чанартай байдаг. Энэ бол хялбархан биш. Та Delpi программуудыг хэвлэхэд таны ашиглаж байгаа жагсаалтанд Printer нэмэгддэг. Printer.BeginDoc; Printer.Canvas.TextOut(20, 20, ‘Hello There!’); Printer.EndDoc; TPrinter PROPERTIES.
  • 88. TPrinter METHODS. Хэрхэн ажиллуулах тухай Print, Printer Setup -нуудыг аль хэдийг гаргаж аваад байна. Гэхдээ та тэднийг үйлдэл хийхэд боломжтой болгох хэрэгтэй. Үүний тулд: 1. Гол меню бүрэлдэхүүн дээр 2 удаа товшиж Menu -ийг гаргаж ир. 2. Menu designer доторхscratch menu -нээс File printer сонго. 3. File printer set up menu -г сонгоод Scratch menu- г хаа. 4. Print dialog - ийг байрлуулаад нэрийг нь өөрчил. FilePrintClick METHOD. procedure TMainForm.FilePrintClick(Sender: TObject); var I : Integer; LineHeight : Integer; LinesPerPage : Integer; LineCount : Integer; R : TRect; S : string; begin { Display the Print dialog. } if PrintDialog.Execute then begin { Set the title for the printer object. } Printer.Title := ‘ScratchPad – ‘ + OpenDialog.FileName; { Set the printer font to the same font as the memo. } Printer.Canvas.Font := Memo.Font; { Determine the line height. Take the Size of the { font and and use the MulDiv function to calculate { the line height taking into account the current { printer resolution. Use the Abs function to get { the absolute value because the result could be a
  • 89. { negative number. After that add 40% for leading. } LineHeight := Abs( MulDiv(Printer.Canvas.Font.Size, GetDeviceCaps(Printer.Handle, LOGPIXELSY), 72)); Inc(LineHeight, (LineHeight * 4) div 10); { Determine how many lines will fit on a page. Trim { it back by three lines to leave some bottom margin. } LinesPerPage := (Printer.PageHeight div lineHeight) - 4; { Start printing on line 4 rather than line 0 to leave { room for the header and to allow for some top margin. } LineCount := 4; { Tell Windows we're starting and print the header. } Printer.BeginDoc; R.Top := LineHeight; R.Left := 20; R.Right := Printer.PageWidth; R.Bottom := LineHeight * 2; DrawText(Printer.Handle, PChar(OpenDialog.FileName), -1, R, DT_CENTER); { Loop through all of the lines and print each one. } for I := 0 to Pred(Memo.Lines.Count) do begin { When we get to the bottom of the page reset the { line counter, eject the page, and start a new page. } Inc(LineCount); if LineCount = LinesPerPage then begin PrintFooter(R, LineHeight); LineCount := 4; Printer.NewPage; end; { Get the next string and print it using TextOut } S := Memo.Lines.Strings[I]; Printer.Canvas.TextOut(0, LineCount * LineHeight, S); end; { All done. } PrintFooter(R, LineHeight); Printer.EndDoc; end; end; PrintFooter METHOD. procedure TMainForm.PrintFooter(var R: TRect; LineHeight: Integer); var S : String; begin with Printer do begin { Build a string to display the page number. } S := Format(‘Page %d’, [PageNumber]); { Set up the rectangle where the footer will be drawn. } { Find the bottom of the page and come up a couple of { lines. } R.Top := PageHeight - (lineHeight * 2);
  • 90. R.Bottom := R.Top + lineHeight; { Display the text using DrawText so we can center the { text with no fuss. } DrawText(Handle, PChar(S), -1, R, DT_CENTER); { Draw a line across the page just above the `Page X' text. } Canvas.MoveTo(0, R.Top - 2); Canvas.LineTo(R.Right, R.Top - 2); end; end; Bitmap –ийг хэвлэх Bitmap хэвлэхэд хялбар. Хийх шаардлагатай зүйл бол Bitmap -ийн шаардах жишээг шинээр бий болгоод объект руу ачааллаад canvas ийн dra method - ийг ашиглаж хэвлэгч рүү илгээнэ. procedure TForm1.Button1Click(Sender: TObject); var Bitmap : TBitmap; begin Bitmap := TBitmap.Create; Bitmap.LoadFromFile(‘test.bmp’); Printer.BeginDoc; Printer.Canvas.Draw(20, 20, Bitmap); Printer.EndDoc; Bitmap.Free; end; Cursors –ийг ашиглах Курсорийг ашиглахад хэцүү биш. Гэхдээ та бүхэнд хэрхэн ажиллах үндсэн ойлголтыг өгье. Cursor –ийн үндсэн үзүүлэдтүүд Эхлээд та курсорыг ердийн бүрдэл, хэлбэр эсвэл таны бичиг баримтын бүсэд нэвтэрэхэд ашиглана. Хэрвээ та бичиг эх рүү нэвтрэх курсорыг өөрчлөхийг хүсвэл, дэлгэцийн объектийн курсорын шинж чанарыг өөрчлөх хэрэгтэй. Дэлгэцийн объект курсорын шинж чанарыг өөрчилж байхдаа та курсорын гүйцэтгэх бүрдэлүүдийг бүрэн хангаж байгаа эсэхийг батлах нь зүйтэй. Курсорын удирдлага нь дэлгэцийн объектийн шаардлагын дагуу ажиллана. Бүх курсорууд дэлгэцийн объектэд курсорын шинж чанарт багтдаг. Курсорын шинж чанар гэдэг нь таны хүсэлтийн дагуу сонгогдох курсоруудын жагсаалт юм. Дэлгэцийн объектийн курсорын шинж чанарыг ашиглахын тулд ашиглах курсорынхоо нэрийг курсорын жагсаалтанд бичнэ. Та курсорыг маш олон шалтгаанаар өөрчилж болно. Курсор шаардлагагүй тохиолдолд эсвэл тусгай курсор ашигладаг программ ашиглах үед эсвэл таны эхэд туслахад зэрэгт хэрэгтэй. Cursor –ийн хэрэглэх болон ачааллах Хэд хэдэн курсорууд аар хангадаг. Танд сонголт хийхэд чинь зориулан курсорын хэдэн төрлийг нэмж өгдөг. Үүнийг та хэдийд ч ашиглаж болно. Курсорыг сольдог хамгийн тодорхой үе бол таны бичиж байгаа зүйлийн уртсан байхад. Хэрэглэж байгаа курсороо солихийн өмнө хадгалахад хэрэгтэй яагаад гэвэл та аль курсорыг хэдийд ашиглахаа сайн мэдэхгүй. Хадгалсан
  • 91. курсороо сүүлд нь ашиглахад танд хялбар байх болно. Та өөр хувийн бүрэлдэхүүнээс хамааран курсороо сольж болно. Жишээ нь: зурах программын үед зурах гэж байгаа зүйлээсээ хамаарч зургын хэрэгсэлээ сонгосноор курсороо сольж болно. Энэ тохиолдолд та дэлгэцийн объектийн курсорыг солих шаардлагагүй. Учир нь меню, болон бусад дагалдах бүрэлдлүүдийг дагаад курсор өөрчлөгддөг. Хэрэглэгч Cursor –ыг ашиглах ба ачааллах Хэрэглэгч курсорыг ачаалаахд цаг их шаардагдана. Дээр хэлсэнчилэн курсорын шинж чанарт таны текстэн дээр ажиллаж чадах курсоруудын жагсаалт гарч ирдэг. Хэрэглэгчийн шаардаж байгаа курсорыг ашиглахын тулд хэд хэдэн үе шатыг дамжих ёстой. 1. Шинэ курсор үүсгээд болгож хадгал. 2. Өөрийн программаа болго. 3. LoadCursor ашиглаж курсороо ачаал 4. Дэлгэцийн объектийн курсорийн шинж чанарыг индексчилэн дугаарал 5. Дэлгэцийн объектийг ашиглаж байх үед аль ч курсор ачаалагдах боломжтой. Дүгнэлт Одоо чи дээд түвшний Windows -ийн ашиглалт зарим онцлог бүтцийн тухай, түүнийг чи өөрийн программад хэрхэн хэрэгжүүлэх талаар сурсан. Өөрийн зүтгэл чармайлтаар хэрэгтэй ямар ч засал чимэглэлийг хэрэгжүүлнэ. Гэвч түүнийг сайн ашиглаж чадахгүй. Зарим нэг тохиолдолд хэвлэх нь чухал component -ийг байгуулхад тусалдаг ба тэдгээр хэвлэлтүүд нь гайхмаар хялбархан. Бусад үед чи хацуйгаа шамлаад Tprinting class -тай ажилна. Хэдийгээр тийм боловч хэвлэх нь айх зүйл биш. Workshop Workshop -ийн шалгах асуултууд нь чиний ойлголтыг баталгаажуулхад туслах материал ба бэлдсэн материалууд нь чамд дадлага болж чи юу сурсан бэ гэдгээ ашиглана. Чи шалгах асуултуудын хариуг Хавсралт А Шалгах асуултуудын хариу -с олж чадна. Q&A А: Би toolbar -ийн бүх component -уудаа идвэхгүй болгож чадах уу? Х: Чадна. Toolbar -ийн Enabled property -г False болгоно. А: Би Tcoolbar ба Tcontrolbar бараг адилхан зүйл хийдэг гэж тэмдгэлсэн ба аль нэгийг нь л хэрэглэх ёстой юу? Х: Миний зөвөлгөө бол Tcontrolbar -г ашигласан нь дээр. Олон хувилбарууд нь Microsoft -ийн удирдах бааз COMCTRL32.DDL байдаг. MDI Form, MDI child form Formstyle
  • 92. MDIchild MDIform Normal Stayontop ActiveMDIChild MDIChildren[interger] MDIChildCount procedure TMainForm.Cascade1Click(Sender: TObject); begin Cascade; end; procedure TMainForm.Tile1Click(Sender: TObject); begin Tile; end; ArrangeIcons; procedure TChild.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; project option forms auto-creat form available form Группээр нь сонгох ба зөөх Shift and Control Debug хийх
  • 93. Run F9 Ажиллуулах Parameters Праметр Step Over F8 Алхам алхамаар нь Trace Into F7 Мөр мөрөөр Trace to Next Source Shift+F7 Line Run to Cursor F4 Мөр хүртэл ажиллуулах Program Pause Program Reset Ctrl+F2 Add Watch at Cursor Ctrl+F5 Харах цонхонд хийх Evaluate/Modify Ctrl+F7 Add Breakpoint Мөрийн эхэнд улаан тэмдэглэгээ тавиж зөв ажиллаж байна эсхийг шалгана Win32 - н Component ууд TabControl Tabs хавтасны нэрүүд нь TabPosition Хавтасны нэр гарах байрлал TabIndex идвэхтэй хавтасны дугаар PageControl ActivePage Идвэхтэй хуудасны дугаар TabPostion хуудасны нэр гарах байрлал Хуудас нэмэхдээ хулганы баруун товч дээр дарж Бас урд дараагын хуудас руу шилжинэ. InageList RichEdit Lines Word wrap Track bar Max Min Prequence хэд хувааж тоймлож үзүүлэх хэмжүүр Postion TrickMark хэмжүүр хаан байрлах 2 талдаа 1 талдаа Orientation босоо эсвэл хэвтээг сонгох UpDown Max Min Position Orientation Incerment хэд хэдээр нэмэгдэхийг заана ProgressBar
  • 94. Hotkey Hotkey ямар товч дарадсан авна InvalidKeys авахгүй товчнууд Modifer авах товчнууд Animate Active идвэхжүүлэх CommonAVI ихэнх Windows ашигладаг дүрсүүд FileName Start frame эхлэх Stop frame төгсөх Repeatition хэд давтах Trancparent нэвт гэрэлтэх ListBox : Програмжждын тэмдэгт мөртэй ажиллахад ашиглагдана. Жишээ нь:Select хийж байгаа үйлдэл нь... ListBox компнентийг ашигласан ListBox -ийн events: Items -мөрийн тоо Colums -баганы тоо Extendedselected -нэг нэгээр нь сонголт хийх Multiselected - олон олноор сонголт хийх Parentcolor -эх өнгө Sorted -үсгээ автоматаар эрэмблэнэ.
  • 95. Unit.pas дээр нь дараах загвараар бичинэ: Жишээ: Бүрэн хэмжээний зохиосон бичлэг unit Umain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; Edit1: TEdit; Label1: TLabel; Button2: TButton; Button3: TButton; procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation
  • 96. {$R *.DFM} procedure TForm1.Button3Click(Sender: TObject); begin close ; end; procedure TForm1.FormCreate(Sender: TObject); begin edit1.Text := '' ; end; procedure TForm1.Button1Click(Sender: TObject); begin if edit1.text = '' then begin showmessage ('Medeellee oruul.') ; edit1.setfocus ; exit ; end ; listbox1.items.add (edit1.text) ; edit1.text := '' ; edit1.setfocus ; end; procedure TForm1.Button2Click(Sender: TObject); var i : integer ; b : boolean ; begin b := false ; i := 0 ; while i < listbox1.items.count do if listbox1.Selected [i] then begin listbox1.Items.Delete (i) ; b := true ; end else inc (i) ; if not b then showmessage ('ustgah medeellee songo.') ; end; end.
  • 97. Үр дүн ба Debug хийхэд: TListbox TListBox нь TCustomListBox-д байдаг ерөнхий ажлын горимыг хэрэгжүүлдэг. TListBox нь TCustomListBox -с удамшсан олон property- той боловч ямар нэгэн шинэ ажлын горимыг гаргаж чадахгүй. TlistBox нь Item -уудыг сонгох , нэмэх мөн устгадаг жагсаалтанд харуулахад хэрэглэгдэнэ. Column - Олон баганатай ListBox -ийн харагдах баганы тоог заана. Гэхдээ энэ нь зөвхөн horizontial scrollbar -тай тохиолдолд хэрэглэгдэнэ. Өөрөөр хэлбэл , энэ property 0 утгатай байхад ListBox нь зөвхөн нэг баганатай бөгөөд vertical scrollbar -тай, харин тэгээс их утгатай үед тухайн утганд харгалзах тоотой тэнцүү баганатай , horizontial scrollbar - тай байна гэсэн үг юм. ExtendedSelect - ListBox дахь Item-уудыг сонгох зориулалттай бөгөөд MultiSelect property-той хамт ажиллана. ExtendedSelect нь True , MultiSelect нь мөн True үед эхний тэмдэглэсэн Item-аас дараагийн идэвхжүүлсэн Item-ийн хоорондох бүх Item-уудыг тэмдэглэнэ. Мөн хулгана, SHIFT товч ашиглан дэс дараалан байрласан Item -уудыг тэмдэглэж болно. Хэрэв дараалан байрлаагүй Item-уудыг тэмдэглэх шаардлагатай бол CTRL товч ашиглана.
  • 98. ExtendedSelect нь False , MultiSelect нь True үед SHIFT, CTRL-гүйгээр хэд хэдэн Item-уудыг тэмдэглэж болно. Гэвч нэг үйлдлээр Item -уудыг тэмдэглэж чадахгүй. Харин MultiSelect нь False үед ExtendedSelect ямар ч нөлөөгүй бөгөөд Item -ууд тэмдэглэгдэхгүй. SelCount - MultiSelect True байхад ListBox дахь тэмдэглэгдсэн Item - уудын тоог олоход хэрэглэнэ. MultiSelect нь False үед SelCount нь -1 утгатай байна. Sorted - True үед ListBox дахь Item-уудыг цагаан толгойн үсгийн дараалллаар эрэмбэлнэ. Энэ үед ListBox -д шинээр нэмэгдэж байгаа Item-ууд нь мөн эрэмбэлэгдэж орно. False байхад эрэмбэлэхгүй байгаа байдлаар нь харуулна. Clear – ListBox-д байгаа бүх Item-уудыг устгахад хэрэглэнэ. Хэдийгээр стандарт ListBox-ийн Item-ууд нь String төрөлтэй боловч ListBox-ийн Clear method-ийг хэрэглэх нь Items property-ийн Clear method-ыг хэрэглэснээс илүү дээр байдаг. ComboBox Items -мөрийн тоо GroupBox RadioGroup Items -мөрийн тоо Columns -баганы тоо ActionList CheckListBox CheckListBox нь ерөнхийдөө ListBox-той адил боловч элементүүд нь check box-той байдгаараа түүнээс ялгагдана. Хэрэглэгч түүнээс хэдэн ч item сонгож болно. Өөртөө scrollbar-тай. Properties:
  • 99. • AllowGrayed - Энэ нь үнэн утгатай байвал checkbox нь checked, unchecked, and grayed гэсэн 3 төлөвийн аль нэгэнд байж болно. Үгүй бол checked, эсвэл unchecked. • • Checked - Аль item тэмдэглэгдсэн байгааг заана. • • Columns - Баганы тоог заана. • • Flat - CheckListBox нь 3 хэмжээст байдлаар харагдах эсэхийг заана. • • IntegralHeight - CheckListbox нь гүйцэд харагдахгүй мөр агуулах эсэх • • ItemEnabled - cbGrayed төлөвийг ашиглалгүйгээр тухайн item-ийг идэвхитэй буюу идэвхигүй болгоно. • • ItemHeight - style property нь OwnerDrawFixed гэсэн утгатай байхад үүнийг ашиглан мөрийн өндрийг зааж өгч болно. • • ItemIndex - Сонгогдсон item-ийн дугаарыг заана. • • SelCount - Сонгогдсон item-үүдийн тоо. • • Selected - Тухайн item сонгогдсон эсэх. • • Sorted - CheckListBox-ийн item-үүд нь цагаан толгойн дарааллаар эрэмбэлэгдсэн эсэх. • • State - Тухайн item сонгогдсон, сонгогдоогүй, идэвхгүй төлөвийн алинд байгааг заана. • • Style - Тэмдэгт мөр агуулдаг стандарт CheckListBox юм уу, стандарт бус юм уу гэдгийг заана. Events: • • OnClickCheck -Аль нэг item-ийн checkbox-ийг сонгоход дуудагдана. • • OnDrawItem- style property нь OwnerDrawFixed буюу OwnerDrawVariable байхад ашиглаж болно. • • OnMeasureItem- style property нь зөвхөн OwnerDrawVariable байхад ашиглаж болно. TcheckBox Энэ зураг дээр улаанаар тойруулан үзүүлсэн icon бол Стандарт компонент CheckBox юм. Энэ товч нь хянах хайрцаг дарагдсан эсвэл дарагдаагүй байдгийг илэрхийлнэ.Хэрэглэгчид сонголтуудыг A TCheckBox component олгоно.Хэрэглэгч сонголт хийж хайрцгийг хянаж болно эсвэл сонгохгүй байж болдог. TCheckBox properties
  • 100. AllowGrayed буюу Саарал төлөвт хянах хайрцаг нь байж болохыг тодорхойлно. Delphi –ийн бичлэг нь: property AllowGrayed: Boolean; хэлбэртэй байдаг.Хэрэв энэ нь үнэн утгатай байвал check box нь checked, unchecked, and grayed гэсэн 3 боломжит төлөвт байдаг.Хэрэв худал утгатай байвал checked and unchecked гэсэн 2 төлөвтэй байдаг. Доорхи жишээнд программыг ажиллуулахад эхлээд check box-ийг шалгана.Хэрэглэгч үүн дээр дарахад the check box -нь unchecked байна.Дахин дарахад саарал төлөвт орно. procedure TForm1.FormCreate(Sender: TObject); begin CheckBox1.AllowGrayed := True; CheckBox1.State := cbChecked; end; -Checked төлөв: check box нь checked төлөвт байгааг заадаг. Delphi syntax: property Checked: Boolean; C++ syntax: __property bool Checked = {read=GetChecked, write=SetChecked, stored=IsCheckedStored, default=0}; Хэрэв AllowGrayed property нь үнэн утгатай байвал та State property-ийг илүү өргөн хэрэглэх боломжтой. TCheckBox events: OnEnter event Delphi syntax: property OnEnter: TNotifyEvent; C++ syntax: __property Classes::TNotifyEvent OnEnter = {read=FOnEnter, write=FOnEnter}; OnEnter-ийг удирдлагыг идэвхтэй болгон зарим онцгой процесс тохиолдоход ашигладаг.Энэ event нь 2 application, form-ийн хооронд шилжихэд эсвэл удирдлагаа агуулсан application зэрэгт хэрэглэгддэггүй. Хэрэв тусдаа 2 агуулгатай удирдлагын хооронд шилжих тохиолдолд энэ нь агуулсан удирлагын өмнөх удирлагад тохиолдоно. OnExit event үүнтэй адил байдаг.
  • 101. Жишээлбэл:ОК товч, group box-нь 3 radio button-тай form байдаг гэж үзье.Тэгээд аль нэг radio button дээр нь дарахад OnExit болдог ба OnEnter event –нь зайлшгүй дагаж хамт байдаг ба заавал дарагддаг байна.ОК дээр дарахад OnExit event болох ба заавал нэг нэгтэйгээ хамт байдаг. GRAPHICS БА MULTIMEDIA ПРОГРАМЧЛАЛ • Хялбар замаар Graphics хийх; • Device context and Tcanvas; • GDI обьектууд o Pens, Brushes, Fonts; o Bitmaps ба Palette; o Region огтлох; o Teкст зурах; o Bitmap зурах; o Memory Bitmap үүсгэх; o Memory Bitmap –ийг хадгалах; • Multimedia програмчлах o Windows API aшиглан Wave Audio тоглуулах; o TmediaPlayer компонент; o MediaPlayer Properties , Methods ба Events o Wave Audio o Гаралтын volume –г тохируулах; o Wave Audio –г бичиж авах; • MIDI Audio; • CD Audio; • AVI Video; Graphics and Multimedia нь програмын дээд түвшнийг төлөөлдөг. Өнөөдрийн энэ сэдэвт та нар Graphics ба Multimedia –г Delphi хэл дээр програмчлах тухай үзэж танилцана. Graphics –ийг програмчлахын тулд ямар ч гэсэн TCanvas TBitmap классуудын тухай нилээд хэдэн зүйлийг мэдэх хэрэгтэй. Би та нарт Delphi хэл дээр Graphics –г үзүүлэх хялбар аргаас эхэлье. Үүний дараа та нар Windows Graphics Device Interface (GDI)–ийн тухай мөн түүний компонентуудынх тухай мэдэж, хийж сурна. Одоо бид олон төрлийн хүрээ, хэлбэр дүрс зурах тогтсон дэг журмын тухай мөн Bitmap үзүүлэх олон аргыг сурна. Харин Multimedia програмчлах бүлгийн хэсэгт хэрхэн Windows API -аар дуут файл тоглуулах тухай үзнэ. Мөн та нар долгионт Audio тоглуулах, MIDI болон AVI video тоглуулахад TMediaPlayer класс хэрхэн хэрэглэгдэх тухай сурч мэдэх болно. Иймээс эхэлцгээе. TextRect Clipping rectangle дотор текст бичих Эдгээр properties ба methods нь Windows Device context –ийн үүргийн бага хэсгийг төлөөлдөг. Гэхдээ та нарт хэлэхэд Graphics -тай ажиллаж байхад эдгээр properties ба methods 80 хувийн үүргийг гүйцэтгэдэг.
  • 102. Хэдийгээр ийм боловч би TCanvas –ийн тухай ярихаасаа өмнө Graphic’s object –ийг яаж Windows програмчлалд хэрэглэх тухай ярих хэрэгтэй болов уу. GDI objects GDI –д олон төрлийн обьектууд байдаг ба эдгээр нь хэрхэн device context функцийг тодорхойлдог бол? GDI –ийн энгийн хэрэглэгддэг обьектууд нь Pens, Brushes, Fonts. Бусад обьектуудад Palettes, Bitmaps, regions багтдаг. Эхлээд Pens, Brushes, Fonts –ийг үзээд дараа нь complex object -руу орцгооё. Pens, Brushes, ба Fonts Pens, Brushes, Fonts нь TCanvas класст яаж хэрэглэгдэж байгааг авч үзье. Pens Pen нь обьектоор тодорхойлогдсон ба шугам зурахад хэрэглэгдэнэ. Шугам нь шулуун байх ба нэг цэгээс эхлэлтэй нэг цэгт төгсгөлтэй эсвэл тэгш өнцөгт, эллипс, олон өнцөгтийн хүрээ байна. TCanvas классын Pen property –аар pen –ээ оруулах ба энэ нь TPen классын жишээ юм. Хүснэгт 12.3 TPen-ийн property- нуудыг жагсаав. Хүснэгт 12.3 TPen properties. Эдгээр шинж чанаруудыг та хүссэнээрээ тохируулна. Доорх жишээнд улаан өнгөөр Dashed line-р харуулав. Canvas.Pen.Color:=clRed; Canvas.Pen.Style:=psDash; Canvas.MoveTo(20,20); Canvas.LineTo(120,20); Энэ кодчилолыг формынхаа товчинд OnClick handler дээр туршиж үзээрэй. Таныг товчин дээрээ дарахад зурагдах шулуун нь form дээр гарах болно. Тэмдэглэл : Энэ сэдвийн бүх жишээнүүдийг ийм байдлаар туршиж үзсэн байх хэрэгтэй. Хэрэв та нар дээрх жишээг туршиж үзсэн бол form –оо дээш нь зөөхөд таны зурсан шулуун арилах болно. Иймээс үүнийг байнгын болгохыг хүсвэл form –ийн OnPaint event –д дээр шулуун зурдаг кодоо бичиж болно. OnPaint event нь form –ийн харагдах байдал, байршил өөрчлөгдхөд үүсээдэг. Dashed ба Dotted pen style зөвхөн pen width –ийн утга 1 байх үед хэрэглэгдэнэ. PsClear pen style нь line –аа устгахад хэрэглэгдэнэ. Тэгэхдээ энэ line нь Windows GDI draw –ийн обьект болох тэгш өнцөгт, эллипс, олон өнцөгтүүдийн эргэн тойрны хүрээг хэлж байгаа юм. Зөвлөмж: TPen –ийн олон property -нуудыг form дээрээ Shape
  • 103. component ашиглан туршиж үзээрэй. Мөн Shape –ийнхаа pen -ийн property –г өөрчилж сайжруулаарай. TPen классын Mode шинж чанар нь effect -үүдийн гаднах харагдах байдалд онцгой хэрэгтэй байдаг. Brushes Энэ нь Graphical Shape -ийн дотрох хэсгийг буюу filled area –г төлөөлдөг. Хэрвээ та нар эллипс, тэгш өнцөгт, олон өнцөгтүүдийг зурсан бол Brush -г ашиглан дүүргэж болно. Ихэвчлэн энэ үед Brush нь зөвхөн өнгө байдаггүй Bitmap эсвэл pattern –ийг агуулсан байдаг. Brush нь TCanvas class -д байдаг ба нэг property юм. Brush –аар харагдах хэлбэрийг өөрчилж туршиж үзээрэй. Brush нь Tbrush class -ийн нэг объект юм. TPen, TBrush class -д бичиж тэмдэглэх event, method ерөөсөө байдаггүй. Хүснэгт 12.4 –т шинж чанаруудыг жагсааж бичив. Property Тайлбар Хүснэгт12.4 TPen properties. Доорх жишээнд форм дээрээ дугуй зураад 45 градусын налуутай зураасаар дотрохыг нь будах хэлбэрийг ашиглалаа. Canvas.Brush.Color:=clBlue; Canvas.Brush.Style:=bsDiagCross; Canvas.Ellipse(20,20,220,220); Brush -ийн хэв маягийг ашиглаж байхад түүний Color property шугмын
  • 104. өнгийг өөрчилдөг ба энэ шугам нь зургийнх юм. Зарим нэг VCL automatically forces зэрэгт background mode -ийг transparent болгодог. Гэхдээ энэ нь pattern fill үед болно. Background mode –ийг transparent болгоно гэдэг нь дүрсийн дэвсгэрийг цонхны дэвсгэр өнгө, хэв маяг хэлбэртэй адил болгохыг хэлж байгаа юм. Өмнөхөөс арай өөрөөр харагдуулъя. Өөрөөр хэлбэл дугуй дүрсийн дэвсгэр өнгийг формынхтай адил болгож . Энийг grayscale -дээр харах тийм амар биш гэдгийг мэдэж байна. Хэрэв background –аа тус тусд нь тодорхойлохыг хүсвэл VCL circumvent хэрэгтэй ба API –руу шууд очно. Энд хэрэв цагаан дэвсгэр дээр хөхөөр зураас татах кодыг үзүүлэв : Canvas.Brush.Color:=clBlue; Canvas.Brush.Style :=bsdiagCross; SetBkMode(Canvas.handle,OPAQUE); SetBkColor(Canvas.Handle, clWhite); Canvas.Ellipse(20,20,220,220); Одоо дэвсгэр өнгө цагаан болохыг Figure12.2 т дээрх кодчилолоор дугуй дүрсийг харуулав. Brush -ийн өөр сонирхолтой өвөрмөц онцлог нь Bitmap background option юм. Доор бичигдэх кодчилол нь bitmap brush -ийн тухай их зүйлийг хэлж өгнө: Canvas.Brush.Bitmap:=TBitmap.Greate; Canvas.Brush.Bitmap.LoadFromFile(‘bkgnd.bmp’); Canvas.Ellipse(20,20,220,220); Canvas.brush.Bitmap.Free; Эхний мөрөнд TBitmap обьектийн үүсэж буйг Brush -ийн Bitmap property –руу гэж тодорхойлж байна. Bitmap property нь утгаа аваагүй үүсэж байгаа маш өвөрмөц байна. Хоёр дах мөрөнд bitmap -аа файлаас зөөж байна. Гурав дах мөрөнд эллипс зурж байна. Энэ мөрний дараа эллипс зурагдсан байх учраас Brush property устгагдаж байна. Энэ үйлдэл зайлшгүй чухал юм. Учир нь VCL танд үүнийг хийж өгөхгүй. Хэрвээ brush property устгах нь бүтэлгүй болбол таны програмд санах ой хүрэхгүй болох магадлалтай. Доорх зурагт Bitmap brush -аар эллипс зурсныг харуулав. Танд зарим үед заавал hollow
  • 105. Brush хэрэг болно. Үүгээр background -аа харуулах болно. Hollow Brush -аа үүсгээд түүнийхээ brush style д зөвхөн bsClear гэж өгнө. Одоо бүгдээрээ өмнөх жишээгээ авч түүн дээрээ 2 дахь дугуйгаа дотор нь нэмж hollow brush aшиглая. procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pen.Width:=1; Canvas.Brush.Bitmap:=TBitmap.Create; Canvas.Brush.Bitmap.LoadFromFile('bkgnd.bmp'); Canvas.Ellipse(20,20,220,220); Canvas.Brush.Style:=bsClear; Canvas.Pen.Width:=5; Canvas.Ellipse(70,70,170,170); Canvas.brush.Bitmap.Free; end; Хэрвээ шууд API руу очвол та өөр зүйлүүдийг хийх боломжтой болно. Хэдийгээр ийм боловч VCL Brush class –т ихэвчлэн эдгээрийг гүйцэтгэдэг. Fonts Энд ямар нэгэн шинэ зүйл байхгүй. Fonts нь TCanvas class –тай хэрэглэдэг ба Tcanvas -ийн Fonts -оос ялгаагүй форм эсвэл бусад компонентуудад хэрэглэгддэг. TCanvas –ийн Font property нь бусад компонентуудын Font property -тай ижил байдаг. Canvas -т font -ийг солихдоо зөвхөн үүнийг хийгдэг: Canvas.Font.Name:=’Courlier New’; Canvas.Font.Size:=14; Canvas.Font.Style:=Canvas.Font.Style+[fsBold]; Canvas.TextOut(20,20, ‘ Testing’); Байна. Дараа бид текст зурах хэсэг дэх fonts нь юу хийдэг болохыг авч үзье. Bitmaps ба Palette
  • 106. Ихэнхдээ bitmaps, palettes –ууд нь хамтдаа явдаг. TBitmap class -ийг хэрэглэж байх үед Bitmap ачаалах ба дүрслэл хийхэд хялбар байдаг. Та нар хэдийнээ VIII бүлэгийн хичээл дээр Jumping Jack програм дахь TBitmap –ийн үйл ажиллагааг харсан. TBitmap class нэлээд хэд хэдэн нөхцөл байдалд өргөн хэрэглэгддэг. Дараагийн бүлэгт bitmaps зурах болон Memory Bitmaps –ийн талаар ярих үед зарим нөхцөл байдлыг харах болно. TBitmap class нь нэг цогц учраас би method, property бүрийг тайлбарлаагүй болно. Palette –ийн чухал ач холбогдлыг тайлбарлахаар жишээ авч үзүүллээ. OnPaint event handler дээр кодчилолыг эсвэл button click event дээр хэрэглэ. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap :TBitmap; begin Bitmap:=Tbitmap.Create; { Bitmap.IgnorePalette:=True;} Bitmap.LoadFromFile('c:co.bmp'); Canvas.Draw(0,0,Bitmap); Bitmap.Free; End; Програм ажиллуулахад та гоё Bitmap –ийг формаасаа харах болно. Эдгээр мөрнүүд ойлгомжтой тул тайлбаргүй. Харин 4 дах мөрөнд VCL –ийн Palette -ийн мэдээллийг татгалзаарай. Тэгээд дахин програмаа ажиллуулаарай. Ингэхэд bitmap-ийн өнгө бүгд буруу худал болно. (хэрвээ video adapter –ийнхаа display –ийг more than 256 Colors гэж тохируулбал та энэ үр нөлөөг анзаарч чадахгүй. ) Яагаад гэвэл palette aшиглаж чадахгүй. Харин palette bitmap -ийнхаа зөв өнгөнүүдийг palette system -д найдвартай хувиарлаж чаддаг. Bitmap, Palette обьектууд нь Graphics боловсруулалтад чухал үүрэгтэй оролцдог байна. Clipping Regions Regions нь Canvas –ийн дэлгэцэнд зурах хэсгийг хянаж байдаг муж юм. TCanvas class –д ClipRect property байдаг. Харин энэ нь зөвхөн
  • 107. уншдаг. Clipping Regions-ийг өөрчлөхөд Windows API –г хэрэглэх хэрэгтэй. Одоо өмнөх жишээгээ авч хэрхэн Clipping Regions work –д бага зэрэг зураг хавсаргаж түүнийгээ өөрчилж сайжруулахыг үзье. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; Rgn: HRGN; begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); Rgn:=CreateRectRgn(100,50,250,250); SelectClipRgn(Canvas.Handle ,Rgn); Canvas.Draw(0,0,Bitmap); Bitmap.Free; End; Одоо програмаа ажиллуулахад та зөвхөн Bitmap -ийн харагдаж байгаа хэмжээг харах болно. SelectClipRgn функц нь Canvas Clipping Region (хайчлах муж) –ийг тэгш өнцөгттэй адилтгаж координатыг 100,50,250,250 гэж тогтоодог. Өмнө нь bitmap -ийг хөдөлгөөнгүй байрлалд зурсан бол одоо зөвхөн Bitmap -ийн Clipping Region –оор хэмжээг нь тодорхойлсон нь харагдаж байна. Clipping Region –аас гаднахыг эс зөвшөөрсөн байна. Өмнөх жишээгээ авч олон сонирхолтой зүйл хийж өөрчиллөө. Тэгш өнцөгт Region үүсгэж байгаа мөрийг авч оронд нь доорх мөрийг тавилаа. Rgn:=CreateEllipticRgn(30,30,170,170);
  • 108. Одоо дахин програмаа ачааллаарай. Энэ үед Bitmap circular region - аар хязгаарлагдана. За одоо region –ний өөр нэг төрлийг авъя: Const Points: array [0..3] of Point = ((X:80,Y:0) ,(X:0,Y:80), (X:80,Y:160), (X:160,Y:80)); Var Bitmap: TBitmap; Rgn: HRGN; begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile(‘c:co.bmp’); Rgn:=CreatePolygonRgn(Points,4,ALTERNATE); SelectClipRgn(Canvas.Handle ,Rgn); Canvas.Draw(0,0,Bitmap); Bitmap.Free; End Энэ үед та олон өнцөгтийн region хэрэглэж region үүсгэж буй цэгүүдээр массив тодорхойлнсон байна. CreatePolygonRgn функц нь цэгүүдийн Region form цувааг үүсгэж байна. Үүн шиг хүссэнээрээ олон цэгүүдийг хэрэглэж болно. Төгсгөлийнх нь хаагдах цэгийг онцгойлон зааж болохгүй учир нь region автоматаар өөрөө эхлэлийн цэг төгсгөлийн цэгийг хооронд нь холбож төгсгөдөг. Дахин програмаа ажиллуулж ямар үр дүн өгөхийг хар. Тэмдэглэл: Энд бичсэн кодчилолын хэсэгт хэрхэн массивын анхны утгыг тогтоохыг харуулав. Кодчилол: Const Points: array [0..3] of Point =((X:80,Y:0),(X:0,Y:80),(X:80,Y:160),(X:160,Y:80)); Энд Tpoint массивын хязгаарыг тогтоож анхны өгөгдлөөр хангаж байна. Tpoint –д 2 талбар байдаг. X ба Y гэсэн. үүнд fieldname буюу талбарын нэрийг жагсааж тодорхойлох цэгээр өгөгдлийг нь тогтоож өгөх . Жишээ нь: (X:80) Мөн X ба Y-ийн өгөгдлөөр хангагдсан биеийг хос хосоор нь
  • 109. нийлүүлж бичнэ. Үүнийг 4 удаа бичсэн. Яагаад гэвэл массивт 4 элемент байна. Массивыг зарлаж анхны утга тогтоохдоо зөвхөн ийм байдлаар бичнэ. Та region –ийг дандаа хэрэглэхгүй ч гэсэн танд хэрэгтэй үед үнэлж баршгүй чухал болно. Зураг боловсруулалтанд шаардлагатай зүйлүүдийг хийж гүйцэтгэхэд хэрэг болно. Зурах үндсэн ажиллагаа Өмнө нь та номноос графикийн зарим үндсэн хэв маягтай тулгарч байсан байх. Үүгээрээ та Rectangle method нь талбай ба тэгш өнцөгт зурахад хэрэглэгддэг гэдгийг, харин Ellipse method нь дугуй ба зуйван дүрс зурахад, MoveTo ба LineTo -ээр хүрээ зурахдаа хэрэглэдгийг мэдсэн байгаа байх. Мөн Arc method нум зурахад, Pie method pie-shaped objects зурахад хэрэглэгддэг. Энэ бүгд чухамдаа үндсэн ойлголтууд юм. Teкст зурах Drawing text хийж сурах нь хэцүү дадлага юм. Нэмж хэлэхэд үүнд нилээд хэдэн гоё өвөрмөц онцлогууд байдаг . Эдгээрийн талаар та нар мэдэж авах хэрэгтэй . TextOut ба TextRect функцууд TextOut method canvas дээр бичих үндсэн арга болж өгдөг. Үүнд тийм ч хэцүү юм байхгүй. Та нар зөвхөн X ба Y –ийнхаа байрлалыг зааж өгч харагдах текстээ жишээн дээрхтэй ижил бичиж өгнө: procedure TForm1.Button1Click(Sender: TObject); begin Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri'); End; Энэ нь формын string –ийг 20,20 байрлалд гаргана. X ба Yнь гарах текстийнхээ зүүн дээд булангаас нь байрлуулдаг. Үүнийг туршиж үзээрэй. procedure TForm1.Button1Click(Sender: TObject); begin Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri'); Canvas.MoveTo(20,20); Canvas.LineTo(100,20); End;
  • 110. Энэ кодчилол текстээ 20, 20 байрлалд үзүүлж, мөн шугам 100, 20 хүртэл зурж байна. Шугам нь текстийнхаа оройноос хөндлөнгөөр зурагдсан. TextRect method нь танд clipping rectangle -дээ текст нэмж харуулах боломжийг олгодог. Энэ method -ийг хэрэглэж байх үедээ текстээ заавал тодорхой хил хязгаар дотор нь багтаах хэрэгтэй. Хэрэв хязгаараас илүү гарах юм бол хайчилдаг. Доорх жишээнд 100 -аас илүү гарсныг үзүүлж баталж байна. Зөвлөгөө: Хэрэв текстээ tab төгсгөлтэй бичвэл Windows API функц TabbedTextOut-г хараарай. TextBackground Саарал форм дээр цагаан background –тай байсан нь сэтгэл татахгүй байна. Text background -ийг цагаанаар тогтоосон brush -аас олж авсан. Уг асуудлыг шийдэх 2 арга зам байна. Эхнийх нь canvas brush -ийн өнгийг солих, дараагийнх нь text background –г transparent хийх. Text background – ийг өөрчлөх нь хялбар байна. Тэгэхдээ нэг асуулт байна. Ямар өнгөөр текстийнхаа дэвсгэр өнгийг болгохоо мэдэж байна уу? Энэ нөхцөлд текстийнхаа дэвсгэр өнгийг формынхтай ижил болгов. Үүний тулд: Canvas.Brush.Color:=Color; Гэж хийнэ. Энэ кодчилол нь олон нөхцөл байдалд ажиллана. Зарим үед танд олон контрол байна. Харин та зөвхөн text transparent -ийнхаа background -ийг өөрчлөх юм бол хялбар болно. Кодчилол нь ямар байхыг харуулъя: Var OldStyle: TbrushStyle; Begin OldStyle:=Canvas.Brush.Style; Canvas.Brush.Style:=bsClear; Canvas.textOut(20,20, ‘www.csms.edu.mn/cheri’); Canvas.brush.Style:=OldStyle; End Эхлээд одоогийн байгаа brush style -аа хадгална. Дараа нь brush style - ийг transparent дээр bsClear гэж тогтоож өгнө. Тэгээд текстээ харуулсныхаа
  • 111. дараа Brush style -ийг эргээд урд нь ямар стиль байсныг тавилаа. Та текстээ бичиж өгчихөөд өмнөх style -аа хадгалсан хэлбэрээр нь дахин тогтоож өгнө. Энэ нь хуучин байсан brush style -ийг цаашид байх нь зүгээр гэж бодвол дахин тогтоож болохыг харуулав. Transparent background хэрэглэх үед бас нэг өөр давуу тал бий. Энэ нь та хэсэг текстээ bitmap background дээр гаргах боломжтой боллоо гэсэн үг. Харин энэ үед solid дэвсгэр хэрэглэж болохгүй. Кодчилол нь зургийн хамт (factory.bmp file нь Borland Shared Files 56 Color директоороор олдоно.) procedure TForm1.Button1Click(Sender: TObject); Var OldStyle: TbrushStyle; Bitmap:TBitmap; Begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile(‘factory.bmp’); Canvas.Draw(0,0, Bitmap); Canvas.Font.Name:=’Arial Bold’; Canvas.Font.Size:=13; Oldstyle:=Canvas.Brush.Style; Canvas.Brush.Style:=bsClear; Canvas.TextOut(20,5,’Transparent background’); Canvas.brush.Style:=OldStyle; Canvas.TextOut(20,30,’solid background’); Bitmap.Free; end; Энэ код нь форм дээр bitmap зурна. Дараа нь текст формд зураг нь дээр transparent background –аар бичигдэнэ. Үр дүнг харж байхад background transparent нь танд таалагдана. Мөн transparent background текстэнд зураг хавсаргана. Үүнийг уг номны XIII бүлэгт “Owner Drawn Status panels” хэсэгт үзнэ. Draw Text функц Windows API DrawText функц нь canvas дээр TextOut -аас илүү өргөн боломжтой юм. TCanvas class -д DrawText method байдаггүй учраас DrawText –ийг хэрэглэхдээ шууд дуудна. Эхлээд DrawText -ийн жишээг хараад дараа нь энэ функцын тухай авч үзье.
  • 112. Var R:TRect; begin R:=Rect(20,20,280,80); Canvas.Rectangle(20,20,280,80); DrawText(Canvas.Handle,’An example of drawetext.’,- 1,R,DT_SINGLELINE or DT_VCENTER DT_CENTER); end; Эхлээд Rect -ийг windows API Rect функцаар анхны утга тогтоосоон байна. Үүний дараах мөр нь Canvas дээр rectangle буюу тэгш өнцөгтийг зурж байна. Ингэхдээ тэгш өнцөгтийн түүн дээр зурагдах хэмжээг нь зааж өгнө. Сүүлийн мөрөнд текст бичихдээ Drawtext функцыг дуудан бичиж байна. Харин одоо энэ функцынхээ хоорондоо ялгаатай параметрүүдийг нь авч үзье. • Эхний параметр нь тухайн зургаа буюу жишээн дээрх тэгш өнцөгтөө юун дээр зурахаа зааж өгнө. • Хоёрдах параметрт string утга авч харагдах текстээ бичиж өгнө. • Гуравдах параметрт зурагдах хэсгийнх тоог зааж өгнө. –1 утгатай байвал энэ нь string-ийг бүтэнээр нь гаргана. • Drawtext -ийн 4 дөх параметр TRect хувьсагчийг авна. Яагаад гэвэл зарим Drawtext -ийн боловсруулалт тэгш өнцөгтийг хийхдээ өөрчилдөг учираас энэ параметр хувьсагч авна. • DrawText хэрхэн ажиллахыг энэ параметрт бичнэ. Параметр нь текстээ бичих үед хэрэглэгдэх flag-ийг заана. Энэ жишээнд DT_SINGLELINE, DT_VCENTER, DT_CENTER flag-ийг хэрэглэсэн байна. Энэ flags нь текстийг дан шугамаар, хөндлөнгөөр нь голлуулж гаргахыг илэрхийлж байгаа юм. Drawtext -д бараг 20 flags байдаг ба тэдгээрийг тус тусд нь тодорхойлж болно. Би тэр болгоныг тайлбарламааргүй байна учир нь Win 32 API –ийн online help -д гүйцэт жагсааж бичсэн байдаг . Өмнөх жишээндээ Drawtext функцдээ текстээ голлуулж Horizontally, Vertically, both зэргээс нэгийг нь сонгон авсан. Та яг одоо энэ функцын ач холбогдлыг ухаарахгүй байж магадгүй. Гэвч та хэрвээ owner drawn components хийж эхлэхээр эсвэл own graphical compoment -aa бичиж эхлэхээрээ хэрэгцээг нь мэдрэх болно. procedure TForm1.Button1Click(Sender: TObject); Var R: TRect; begin R:=Rect(20,100,120,150); DrawText(Canvas.Handle,'This text is too long.',-1, R, DT_END_ELLIPSIS); end;
  • 113. Дээрх код ажиллахад үүсэх үр дүнд текст ингэж харагдана. Хэрвээ та тэгш өнцөгт дотор текстээ багтахгүй урт гэж мэдвэл flag -ийг хэрэглэж чадах боллоо. DT_CALCRECT flag нь текстийн багтаахад хэрэглэх өндрийг боддог. Энэ flag –ийг хэрэглэж байхад харин текстээ бичиж өгөхгүй . Windows текстийг багтаахад хэр зэрэг өндөртэй тэгш өнцөгт байхыг хэлж өгнө. Тэгээд Windows багтах өндрөөр нь тэгш өнцөгтийн зүүнээс эхлэн өөрчилж гүйцэтгэдэг байна. Энэ flag олон мөр текстийг бичихэд маш чухал ач холбогдолтой байдаг. Доорх жишээнд windows -оос текстээ багтаах тэгш өнцөгтийнхөө өндрийг асууж, тэр өндрөөр нь тэгш өнцөгтөө зураад дээр нь текстээ бичиж байгаа кодчилолыг бичив. procedure TForm1.Button1Click(Sender: TObject); Var R: TRect; S: string; begin R:=Rect(20,150,150,200); S:='This is very long string which will '+'run into multiple lines of text'; DrawText(Canvas.Handle, Pchar(s),-1,R,DT_CALCRECT or DT_WORDBREAK); Canvas.Brush.Style:=bsSolid; Canvas.Rectangle(R.Left,R.Top,R.Right,R.Bottom); Canvas.Brush.Style:=bsClear; DrawText(Canvas.Handle, Pchar(s),-1,R, DT_WORDBREAK); end; DrawText -ийн 2 дах параметр string биш текст параметр болохоор
  • 114. массивын заагчийг шаарддаг учираас Pchar(s) гэж бичсэн байна. Тэмдэглэл: Хэрэв та Delphi 1.0 –ийг ашиглаж байгаа бол String –г Pchar луу болгохдоо StrPCopy функцыг хэрэглээрэй. Жишээ нь: Var Temp: array [0..3]of Char; R : TRect; S : string begin DrawText(Canvas.Handle, StrPCopy(Temp,S), -1, R,DT_CALCRECT or DT_WORDBREAK); Харин Delphi 1.0 –ээс дээших хувилбаруудад бол Pchar –г өмнөх жишээтэй адил хэрэглээрэй . Энэ кодчилолоо формынхоо OnPaint event дээр тавиад програмаа ажиллуулаарай. Мөн текстийнхаа уртыг өөрчлөөд үзээрэй. Ингэхэд энэ нь ямар ч асуудалгүй та хичнээн ихийг нэмж бичсэн ч тэгш өнцөгт таны текстийн гаднаар хүрээлэгдсэн байх болно. Зөвлөгөө: Хэрэв танд текст бичих олон cонголт хэрэгтэй байгаа бол DrawTextEx функцыг хэрэглээрэй. Win32API-ийн online help –с мэдээллийг аваарай. Тэмдэглэл: DrawText дээр текст бичих нь TextOut -ийг хэрэглэхээс арай удаан байдаг. Хэрвээ таны зургийн боловсруулалт хурдан байх шаардлагатай бол TextOutм-ийг хэрэглэх нь зохимжтой. Гэхдээ энэ 2 нь зарчмын хувьд хоорондоо ялгаагүй юм. DrawText нь маш өргөн хэрэглээтэй. Bitmap зурах Bitmap зурах нь нилээн хэцүү юм шиг санагддаг. Харин та үүнийг үзсэнийхээ дараа маш хялбархан зүйл байна гэж бодох болно. Тэгэхээр TCanvas –д Btmap зурахад зориулагдсан хэдэн method –ууд байдаг. Эдгээрээс хамгийн их хэрэглэгддэг method бол Draw. Энэ нь Canvas дээрх гарах байрлалыг зааж өгөхөд л хангалттай. Одоо хэдэн жишээ авъя. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); Canvas.Draw(0,0,Bitmap); Bitmap.Free; end;
  • 115. Энэ жишээнд өгөгдсөн зургийн файлаас TBitmap обьект үүсгэж формын зүүн дээд буланд гаргаж үзүүлж байна. Bitmap –даа ямар ч өөрчлөлт оруулахгүйгээр гаргаж үзүүлбэл Draw -ийг хэрэглээрэй. Хэрвээ хэмжээг нь өөрчилж гаргамаар байгаа бол StretchDraw method -ийг хэрэглээрэй. Ингэхдээ Bitmap -ийнхаа гарах тэгш өнцөгтийн хэмжээг зааж өгнө. Хэрвээ Bitmap -ийн өөрийнх нь хэмжээнээс томоор заавал зураг чинь stretched болж гарна. Харин жинхэнэ хэмжээнээс нь багаар зааж өгвөл багасгаж гаргах болно. Жишээ нь: procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; R: TRect; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); R:=Rect(0,0,100,100); Canvas.StretchDraw(R,Bitmap); Bitmap.Free; end;
  • 116. Тэмдэглэл: StretchDraw –аар bitmap -ийн жинхэнэ харагдах харьцааг өөрчлөх гэж оролдсоны ч хэрэггүй. Яагаад гэвэл Bitmap -ийнхаа жинхэнэ өндөр өргөнийхөө харьцааг хадгалж хамгаалсан байдаг. Мөн өөр нэг CopyRect method байдаг. Энэ method үндсэн гарах тэгш өнцөгтийнхөө бие ба хуваагдах тэгш өнцөгтийнхөө очих биеийг зааж өгөхөд болно. Нэг ёсондоо bitmap -аа хэсэгт хувааж үзүүлэх боломж өгч байгаа юм. Жнь: Var Bitmap: TBitmap; Src: TRect; Dst: TRect; I, X, Y :Integer; Strips: Integer; Stripsize: Integer; OldPal: Hpalette; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile(‘factory.bmp’); Strips :=6; Stripsize:=(Bitmap.Height div Strips); OlsPal:= SelectPalette(Canvas.Handle,Bitmap.Palette,True); For I:=0 to Pred(Strips) do begin Src:=Rect(0,I*Stripsize) . Энд зургаа оруулж ирээд зурааснуудад зүсч санамсаргүйгээр байрлалыг үзүүлж байна. Энэ кодыг өөрөө үндсэн формынхоо OnPaint handler оруулж туршиж үзээрэй. Тэгэхээр илүү ойлгомжтой болно. Зураг onPaint event ажиллах болгонд зурагдах болно. Тэмдэглэл: Өмнөх жишээнд Palette функцыг ашиглаж байхад формын palette -ийг Bitmap Palette property –д тогтоож өгсөн. Учир нь canvas –т Palette байдаггүй. Иймээс формдоо API -г ашиглаарай. Хэрвээ Palette -аа тогтоож өгөөгүй бол формдээр Bitmap -ийг гарч байхад өнгө буруу гарна. CopyRect method bitmap -ийг гаргахад бүтэц хэрэглэгддэг. Иймээс уг
  • 117. функцийг хэргэлж байхад нэмэлт алхам шаардлагатай. Бас нэг өөр bitmap drawing method байдаг тухай дурьдахыг хүсч байна. the BrushCopy method үндсэн тэгш өнцөгтийн очих тэгш өнцөгт, зураг, transparent color -ийг зааж өгөх боломжийг олгодог. Online help BrushCopy –д энэ method -ийг хэрэглэхээсээ илүү ImageList component -ийг хэрэглэхийг зөвлөдөг. BrushCopy method нь ImageList –ийг бодвол хэрэглэхэд хялбар, гоё харагдуулах боловч хугацаа илүү зарцуулдаг. Хэрвээ transparent background –тай bitmap -ийг хэрэглэж байгаа бол заавал BrushCopy -г хэрэглээрэй. Offscreen Bitmap Offscreen bitmaps, мөн bitmaps memory гэж дуудаж болдог. Энэ нь Windows програмчлалд энгийнээр хэрэглэгддэг. Offscreen bitmaps танд зургаа санах ойд хадгалчихаад дараа нь Draw method –оор үзүүлэх боломж олгодог. Offsreen Bitmaps help богино хугацаанд дэлгэцэнд гаргахын тулд ашиглагддаг. Энэ нь олон удаа шууд зурахад гардаг анивчих үзэгдлээс зайлсхийдэг. Мөн complex Bitmap програмчлахад маш зүгээр байдаг. Зургаа санах ойд хадгалаад дэлгэцэнд үзүүлэхад бэлэн болгож бэлтгэдэг. OffscreenBitmaps Microfofts DirectX SDK animation –д хамгийн өргөн дэлгэрсэн шинэ технологи. Offscreen Bitmap -ийн процесс 3 алхамаас бүрдэнэ. Үүнд: 1. Bitmap memory үүсгэнэ. 2. Bitmap memory дээр зурна. 3. Bitmap memory –г дэлгэц руу хуулах. Memory Bitmap үүсгэх Bitmap memory (санах ой ) үүсгэх нь хялбар байдаг. Memory Bitmap –аа үүсгэж байхад цаг тутамд TBitmap объект үүсэж байх болно. Энэ үед memory bitmap -д файлаа хадгална. Дараа нь memory bitmap үүсгээд, хэмжээг зааж өгч гаргана. Жишээ нь: Form дээр нэг button авч түүнийхээ OnClick event –д туршиж үзээрэй. Button дарах бүрд тэгш өнцөгт санамсаргүйгээр зурагдан дэлгэцэнд харагдах болно. Bitmap memory хялбархан зурагдах ба canvas –т Bitmap –аа хуулдаг. Хэрэв 256 өнгөт video adapter хэрэглэж байгаа бол өнгөнүүд dithered болно. Учир энь жишээнд Palette хийгээгүй болно. Тэмдэглэл: Memory Bitmap үүсгэж байхдаа Bitmap ийн өнгө video үзүүлэх өнгөний тохиргоотой ижил байх ёстой. Хэрвээ video display 256 өнгөн дээр сонгосон бол Bitmap 256 өнгөтэй байна. харин 24 - 32 bit video display - тай бол memory bitmap 32k, 64k эсвэл 16 сая өнгөтэй байх болно. Memory Bitmap –г хадгалах Memory Bitmap –г хадгалахдаа SaveToFIle процедурыг дуудна. BITMAP.SAVETOFILE(‘TEST.BMP’); Та нар програмынхаа дэлгэцийг амархан үүсгэж чаддаг. Энэ бүгдийг та үнэндээ memory Bitmap –д
  • 118. дэлгэцийнхээ хэсгийг хуулж байгаа юм. Multimedia Programming Multimedia programming гэдэг үг нь олон утгыг илэрхийлдэг. Учир нь multimedia program -д боломжийн бүх өргөн хүрээг өөртөө агуулсан байдаг. Multimedia нь ердийн wave audio, MIDI video clips, animation зэргийг багтаадаг. Зарим хүмүүс multimedia програмчлалыг тоглоомын програмчлалтай андуурдаг. Тоглоомын програмчлал нь multimedia –тай гарцаагүй холбоотой болдог. Гэвч sound, video –той илүү холбоотой. Одоо graphics эсвэл multimedia API -ийн тухай тодорхой хэлбэл OpenGL эсвэл DierctDraw -ийн тухай авч үзье. Graphics програмчлалын тухай их мэдээлэлтэй ном хэрэглэвэл сайн мэргэжих болно. Delphi 4.0 Unleased (ISBN: 0-672-312-859) ном сайн сонголт байх болно. TMediaPlayer компонент VCL нь хялбарханаар Multimedia удирдах MediaPlayer компонентоор хангадаг. Энэ компонент нь Component Palette –ийн System tab -д байрладаг. Wave files, AVI video -г тоглуулж чадна. TMediaPlayer –ийг хэрэглэхэд маш амархан. Зөвхөн Wave file тоглуулахын тулд би PlaySound функцыг өмнөх жишээнд хэрэглэсэн. Энэ контролд Play, Pause, Stop, Next, Previous, Step, Back, Record, Eject гэсэн button -ууд байдаг. MediaPlayer -ийн формыг үзүүллээ. Энэ MediaPlayer-ийг хэрэглэх маш энгийн юм. FileName property –д multimedia файлын нэрийг оноосноор товчин дээр дарахад тоглуулж эхэлдэг. Ингэхдээ .wave, .mid, .avi file –уудыг сонгож болно. Та MedioPlayer -аа илүү сонирхолтой хиймээр байгаа бол сайн ухаж төвхөж үзээрэй. Зарим нөхцөлд MediaPlayer -ийн visual control bar их зүгээр харагддаг. Магадгүй та MediaPlayer –аа control bar (Items –гүйгээр) хиймээр байгаа бол MediaPlayer –ийн Play, Start, Stop, Rewind кодыг нарийн аргаар хийгээрэй. Хэрвээ Media Player -ийн runtime үед харагдуулахгүйг хүсвэл Visible –г False утгатай болгоорой. Wave Audio ба Windows API Windows API function –ний тухай энгийн зүйлүүдийг яримааргүй байна. Wave файлыг тоглуулхад Win32API –ийн PlaySound функцийг ашиглаж болно. Эхлээд та нар Mmsystem –ээ өөрийнхөө хэрэглэгчдийг list болгохоор нэмнэ. Дараа нь PlaySound функцээ доорх байдлаар дуудна. PlaySound(‘test.wav’,0,SND_FILENAME); Амархан байгаа биз? PlaySound –н эхний параметрт ямар файл
  • 119. тоглуулахаа зааж өгнө. Сүүлийн параметрт дуу хэрхэн тоглогдох flag -ийг тогтоож өгнө. Дискнээс wave audio тоглуулж байхдаа сүүлчийн параметрт та SND_FILENAME гэж тогтоож өгнө. Та өөр flag зааж өгч болно. Харин энэ тохиолдолд зөвхөн PlaySound функц нь мөн дискэндээр файлтай ижил sounds system тоглуулж чадна. Cистемийн дууг тоглуулахдаа эхний параметрт нь sound alies -ийг зааж өгнө. Харин flags параметрт SND_ALIES гэж жишээндээ зааж өгчээ. PlaySound (‘SystemAsterisk’,0,SND_ALIES); Энэ код нь системийн дуу Asterisk –ийг тоглуулна. Системийн дууны жагсаалтыг олж авхыг тулд Сontrol Panel –ийн Sound аpplet –ийг ажиллуул. Хэрвээ системийн дуу олдохгүй бол windows default дууг тоглуулна. Default дуу нь ding байдаг. Тэмдэглэл: Win32API MessageBeep функц мөн system sound -г индексийн дугаараар нь тоглуулдаг. Win32 online help –с MessageBeep -н тухай бүх мэдээллийг хараарай. Play sound функц дуудах үед 2 өөр чухал flags байна. • SND_ASYNC flag нь дууг асинхрон тоглохыг зөвшөөрдөг. Энэ flag хэрэглэгдэж байхад дуу тоглож эхлэхдээ шууд програмын тоолуурыг програмруу буцаадаг. Энэ нь таны програм дараагийн командаа ажилуулж байхад sound тоглосоор байх болно гэсэн үг. • SND_SYNC flag нь дууг тоглож дуусах хүртэл програмын тоолуурыг програмруу буцаахгүйгээр зааж өгдөг. SND_SYNC нь PlaySound –н default учираас энэ flag-г тодорхойлж өгөх хэрэггүй. Энд маш олон flag-ууд PlaySound -р дууг яаж тохируулахад хэрэглэгдэнэ. Бүрэн мэдээллийг Win32 online help дээр PlaySound функц гэсэн хэсгээс хараарай. MediaPlayer –ийн Properties, Method, ба Event TMediaPlayer –т маш олон property байдаг. Тэдгээрийн ихэнх нь ойлгоход хялбар, харин зарим нь бага зэргийн төвөгтэй байдаг. TmediaPlayer -ийн үндсэн гол шинж чанаруудыг жагсааж бичив.
  • 121. TMediaPlayer –т мөн олон method байдаг.
  • 122. roperty Тайлбар TMediaPlayer компонентод зөвхөн нэг event байдаг. OnNotify event нь команд гүйцэтгэж дуусхад дуудагддаг. Харин зөвхөн Notify property -гийн утга true үед та алдааг шалгаж болно. NotifyValue Property нь утгыг харах үйлдлийг амжилттай эсэхийг заана. Wave Audio Multimedia -гийн олон үндсэн үйлдлүүдийн нэг нь Wave audio тоглуулах юм. энэ нь магадгүй ердийн үйлдэл юм. Wave file synchronously тоглуулж байхад: Play.wait:=true; Player.filename:=’testwav.wav; Player.open; Player.play; Энд wave property true wave файлын тоглох төлөв нь synchronously байна. Player.FileName := ‘test.wav’; Player.Open; Player.StartPos := 1000; Player.EndPos := 3000; Player.Play; Тэмдэглэл: Хэрэв StartPos, EndPos –ийн утгууд буруу байвал wave файлыг тоглуулж чадахгүй. Буруу өгөгдөл гэдэгт startPos, EndPos –ээсс их эсвэл EndPos –ийн утга Media файлын уртаас их зэрэг багтана. Дууны хэмжээг тохируулах Wave төхөөрөмжийн дууг тохируулах нь харьцангуй амархан зүйл юм. Windows API үүнийг хийнэ. WaveOutgetvolume ба WaveOutsetvolume функцүүд дууны цар хүрээг тохируулж чадна. Volume нь integer утга авна. Өндрийг нь баруун, сулыг нь зүүн талын volume тохируулгаар хийнэ. Тэг утга нь дуугүй ба $FFFF (hex) байвал хамгийн чанга гэх мэтчилэн өгнө. waveOutSetVolume(0, $FFFFFFFF); WaveOutsetVolume функц нь зөвхөн wave бүтээгдэхүүний дууг тохируулна. Master дууг зөвхөн multimedia mixer control -оор тохируулдаг. Wave Audio бичлэг хийх Уг сэдэв нь тийм амар зүйл биш. Яагаад гэвэл wave файл бичихдээ эхлээд
  • 123. бичигдэх wave файлаа нээнэ. Энэ нь бичихтэйгээ ижил параметртэй шинэ файл байна. Тэгээд дараа шинэ өгөглөө бичнэ. Filename property -ийн name -ийг өөрчлөх ба түүндээ хадгална. Энэ бүгд бага зэрэг төвөгтэй. Жишээ нь: Filename DUMMY.wav энэ файл 22050kHz –ийн WaveFormat -тай болно. Товчин дээр дарах үед та wave audio -оор бичиж эхэлнэ. Энэ үед бичих үйл явц эхэлчихсэн ба удирдлага таны application руу буцаана. Одоо зогсоох хэрэгтэй . Доор жишээнд үзүүлэв. procedure TForm1.StartBtnClick(Sender: TObject); begin with MediaPlayer do begin FileName := ‘dummy.wav’; Open; Wait := False; StartRecording; end; end; procedure TForm1.StopBtnClick(Sender: TObject); begin with MediaPlayer do begin { Бичих процесийг зогсоож байна } Stop; { файлын нэрийг өөрчилөн, хадгална} FileName :=’new.wav’; { Хадгалах ба хаана } Save; Close; end; end; Тэмдэглэл: Бичиж байх үед энэ алхамыг wave audio recording гүйцэтгэх шаардлагатай. MediePlayer -ийн байрлалыг олохын тулд Record method дууд. Бичлэг хийх үзүүлэлтүүд нь дараах байдалтай байна. Үүнд: хурд, хоолойны тоо (mono, stereo) bits –н тоо, (ихэвчлэн 8 эсвэл 16) зэрэг хэв маягууд байдаг. Ердийн wave form -ийн тоглуулах давтамж нь 8000kHz, 11025KHz, 22050kHz, 44150kHz байдаг. Хамгийн өндөр давтамжтай audio бичлэг дээд зэргийн чанартай. Магадгүй та тоглоом хийгээгүй бол stereorecord -ийг хэрэглэхгүй байх. Мөн bits -ийн тоо нь дуу бичлэгийн чанарт нөлөөлдөг. Энэ нь ихэвчлэн 8 эсвэл 16 байдаг. Тэмдэглэл: Өндөр чанартай дууг бичих дискны ихэнх зайг ихээр эзэлдэг. Wave file -аа stereo -оор бичиж байхад нэг хоолойгоор бичсэн файлаас хэмжээ нь 2 дахин их болдог. 16 bits –г хэрэглэх нь wave файлаа 8 bits дээр тавьж 2 дахин бичсэнтэй адил юм. Файлаа 22050kHz хурдтай, тоон ба 8 bits per -тай бичсэн бол энэ нь 200K. Үүний адилаар 22050kHz stereo 16 bits per-р бичсэн бол 800K болно. Ихэнхдээ stereo, 16 bits per -ээр бичих нь дискны зайг ихээр эзэлдэг. 22050kHz, тоо нь 8 bits per -ээр бичих нь зүгээр
  • 124. байдаг ба дууны чадал файлын хэмжээнд тохирдог. MIDI Audio MIDI audio –гийн талаар ихийг нурших хэрэггүй байх. Үүнийг та MediePlayer -ийн FileName property –д MIDI файл гэж сонгоод Play method –ийг дуудахад болно. Ихэнх sound card нэг зэрэг 2 wave file –ийг тоглуулах боломж өгдөггүй. Үүнтэй адил нэгэн зэрэг нэгээс олон file-ийг MIDI file –д тоглуулах боломжгүй байдаг. Хэдийг ийм боловч MIDI file болон wave file 2 -ийг зэрэг тоглуулах боломжийг олгодог. Энэ нь тоглоом тоглож байхад Music Track ба Sound effect нэгэн зэрэг тоглуулж байдгийг хэлж байгаа юм. Та ингэж Wave, MiDI файлуудыг зэрэг тоглуулмаар байвал MediaPlayer -ийн компоненттэй ажиллана. Тоглуулахдаа MediaPlayer –аа MIDI файлд, PlaySound –аа wave файлд хэрэглээрэй. MIDI file ихэвчлэн тоглоомын background дуунд хэрэглэгддэг. Хэрвээ MIDI file -аа ийм байдлаар хэрэглэж байгаа бол дуу төгсгөлдөө хүрэх үед дахин эхлүүлж байгаарай. TMediaPlayer –нь ийм дууг үргэлжилснээр нь тоглуулж чаддаггүй. Ийм боловч та MideaPlayer-н OnNotify event –ийг давтах эффект болгож хэрэглээрэй. Үүний дараа OnNotify event handler –аар хангах хэрэгтэй. Энэ event handler –т амжилттай тоглож дууссаны дараа MIDI дахин эхлүүлэх кодчилол хэрэгтэй. Жишээ нь: procedure TForm1.MediaPlayerNotify(Sender: TObject); begin with MediaPlayer do if NotifyValue = nvSuccessful then begin Position := 0; Play; end; end; Энэ жишээ нь NotifyValue property -г nvSuccessfull утгатай эсэхийг шалгаж байна. Position 0 байна. Энэ нь файл дахин тоглож эхэлснээр play method дуудагдана гэсэн үг. Энэ бүгд маш энгийн байна. Хэдэн ярвигттай асуудлууд бий. Тэдгээрийн талаар мэдэж авах ёстой. Эхнийх нь Position property 0 гэж өгсөн. Энэ нь файлыг дахин эхлэлд нь эргүүлэх нөлөөтөй. Хэвээ autoRewind property true утгатай байвал энэ нь боломжгүй. Хоёр дах нь энд нилээд хэдэн MediaPlayer үйл ажиллагаа байна. түүнийг мэдэж авах . Энд OnNotify event NotifyValue нь successful утгатайгаар дуудагдаж байгаа үйлдэл юм. Жишээлбэл утга нь nvSuccesfull утгатай байвал команд дуусахаас хамааран Stop командын үүрэг гарна. CD Audio CD тоглуулах нь харьцангуй амархан. CD тоглуулахдаа Device Type property –г dtCDAudio -аар тогтоож мөн Play button дарагдахад эсвэл Play method дуудаарай. CD Audio тоглуулахын тулд CDAudio –д Different TimeFormat хэрэглэгддэгийг ойлгох хэрэгтэй. Та TMSF –ийг хэрэглэж байгаа бол (цаг, минут, секунд, фрайм) TimeFormat тодорхой мөр эсвэл current байрлалаас тодорхой мөр лүү гэсэн мэдээлэлтэй болно. Ямар нэг
  • 125. минут , секунд эсвэл фраймын утгыг мөрийн дугаар болгож тавья. Жишээнд current track дотрох playing position-г string –р зааж өгч байна.: var Time : Integer; Track : Integer; Minutes : Integer; Seconds : Integer; TimeStr : string; begin MediaPlayer.TimeFormat := tfTMSF; Time := MediaPlayer.Position; Track := mci_TMSF_Track(Time); Minutes := mci_TMSF_Minute(Time); Seconds := mci_TMSF_Second(Time); TimeStr := Format(‘Track Time: %2.2d:%2.2d’, [Minutes, Seconds]); Label1.Caption := ‘Track: ‘ + IntToStr(Track); Label2.Caption := TimeStr; end; Эхлээд TimeFormat –ийг TMSF гэж өгч байна. Дараа нь Time дуудагдаж current position -ний хэмжигдхүүн хадгалагдаж байна. Track, Minute, Second гэсэн өөр утгууд windows Time-ийн (mci_TMSF_Track ) гэсэн өөрчлөлтйиг авч байна. MM system unit –д macro -yудыг агуулагддаг. Хэрэв эдгээр макронуудыг хэрэглэвэл энэ хэсгээ та өөрийнхөө uses List -д нэмээрэй. Өөрсдийнхөө цагийн утгуудыг авч дууссаны дараа Time string мөрийн цагийг үзүүлэхээр үүсгэнэ. Тэгээд мөрийн дугаар ба мөрийн цаг Label component -д гарч ирнэ. MSF (minute,second,frames) –ийг гэсэн TimeFormat хэрэглэж байгаа CD global level авах болно. Жишээ нь MSF TimeFormat – ийг current podition –г CD –ний эхлэл гэсэн хуучин хэвд оруулахад хэрэглээрэй. Үүнтэй ижил MSF TimeFormat -ийг CD -ний current position -г CD дээрх 30 минутын хэмжээтэй мөрд гэж зааж өгч болно. Доорх жишээ нь мөрний тухайд биш яаж буцааж хуучин хэвд нь оруулан үзүүлж байгааг харуулав. CD дээрх минут ба секундийг current position : var Time : Integer; Minutes : Integer; Seconds : Integer; TimeStr : string; begin MediaPlayer.TimeFormat := tfMSF; Time := MediaPlayer.Position; Minutes := mci_MSF_Minute(Time); Seconds := mci_MSF_Second(Time); TimeStr := Format(‘Total Time: %2.2d:%2.2d’, [Minutes, Seconds]); Label3.Caption := TimeStr; end; Энэ жишээ нь СDPlayer тоглуулах програмыг агуулсан байна. Мөн
  • 126. TMediaPlayer Audio CDPlayer -ийг үүсгэхэд хэрхэн хэрэглэгдэж байгааг багтаасан байна. AVI Video TmediaPlayer -ээр AVI video тоглуулахын тулд AVI файлаа сонгоод Play method –оо дуудна. (эсвэл Play button дарна.) Хэрэв default MediaPlayer – ийн тохиргоо хэрэглэж байгаа бол тусдаа цонх нь pop up болж AVI үүндээр гарах болно. Мөн Display Property -г ямар нэг цонх төрлийн компонентийг зааж өгснөөр video тэр компонентийн мужид тоглох болно. Жишээ нь: Panel дээр AVI video -гоо тоглуулбал дараах хэлбэртэй бичнэ. MediaPlayer.Display := AVIPanel; Panel дээр AVI video тоглуулж байхад дүрс харагдах болно. Хэрэв video нь Panel -ийн тэгш өнцөгтөөс том тэр video Panel –д хайчлагдаж хэмжээг нь бүрэн гаргахгүй болгоно. Үүнийг Strech эсвэл Shrink болгож video -гоо харвал DisplayRect property -г Stretch эсвэл Shrink гэж зааж өгөөрөй. MEDIAPLAYER.DISPLAYRECT := AVIPANEL.CLIENTRECT; Үүнд AVI video –ны олон төрлийн format байна. Гэвч бүх AVI –г system дүүрэн тоглохгүй. Хэрвээ баталгаатай тоглуулахыг хүсвэл standard Microfoft AVI video type -ийг оруулаарай. Яагаад таны хэрэглэгч гарцаагүй Microsoft AVI суулгасан байна. Registry ашиглах Application -ний системийн мэдээлэл нь WIN.INI эсвэл application –ийн онцгой хэлбэрийн өгөгдлийн хувийн .ini файл юм. Энэ нь зарим нэг ашигтай боловч бас ашиггүй зүйлүүд бий. Хаа нэгтэй миний шинэ шийдсэн зүйлийг хэн нэгэн Registry –ийн application –ийн онцгой хэлбэрийн мэдээллээр ашиглаж байж болзошгүй юм. Гэвч бүгд л Registry –ийг хэрэглэдэг бөгөөд тэд хэзээч Registry сайн, муу гэж хэлдэггүй бөгөөд үүнийг ашигласаар л байна. Registry -ийн term нь Windows Registration Database –ээс богино. Registry нь олон өргөн зүйлийн мэдээллийн тухай таны Windows –ий дүрслэлд байдаг. Win95 – NT хүртлэх програмууд нь Registry засагч програмтай байдаг. Delphi Code Insight –ийн сонголтоос Registry Editor –ийг харж болно. Registry –ийн өгөгдлийн төрлүүд Registry –ийн өгөгдлийн төрлүүд нь цөөн тооных байдаг. Үүнд үндсэн өгөгдлийн төрлүүд нь binary data, string , integer гэсэн төрлүүд байна. binary data нь ямар нэг 2 –тын тоон өгөгдөлд ашиглагдана. Магадгүй та хэзээ ч 2 тоон өгөгдлөөр нь шууд хэрэглээд байхыг хүсэхгүй байх. Магадгүй таны ихэнх зорилгод зөвхөн унших , бичхэд string болон integer утга хэрэглэгддэг байх. TRegistry класс Windows API нь Registry –д цөөн тооны функцууд олгосон байдаг. Тэдгээр функцууд нь, RegOpenKey, RegQueryValue, RegSetValue, RegDeleteKey зэрэг функууд юм. API –ийн төвшин нь Registry –тэй доод төвшнөөр холбогддог. Borland нь VCL class –таа TRegistry –ийн дуудалтыг олгосон. Энэ класт танд хэрэгтэй TRegistry –ээс бичих , унших бүх зүйлийг олгосон.
  • 127. TRegistry Properties TRegistry –т 4 properties байдаг. CurrentKey property нь сонгосон түлхүүрийн утга бөгөөд бодит тоон утгаар түлхүүрүүд ялгагдана. CurrentKey property –н түлхүүрийн нээсэн үед тавигдана. Энэ property нь уншиж чадахгүй. TRootKey and CurrentPath properties нь хаттай техт үүсгэдэг түлхүүр дээр ажиллан. CurrentKey property нь техт тодорхойлолттой түлхүүрийн хэсэгт RootKey утга гаргадаг. Энэ түлхүүрийг авах жишээ. HKEY_CURRENT_USERSoftwareBorlandDelphi4.0Code Insight TRegistry Methods TRegistry –ийн класст цөөн тооны methods байдаг. 14.1 жагсаалтанд анхдагч methods –уудын тодорхойлтуудыг гаргав. Хүснэгт 14.1 TRegistry- ийн анхдагч METHOD -ууд Method Тодорхойлолт
  • 129. TRegistry ашиглах нь TRegistry ашиглах нь үнэндээ амархан. Ихэнхдээ Registry хэрэглэх гараагаа дараах алхамаар хий. • TRegistry class үүсгэх; • OpenKey method -ийг ашиглан түлхүүр нээх, үүсгэх хэрэгтэй; • Өгөгдлийг унших болон бичхэд Read болон Write функцийг дахин дахин ашигла; • TRegistry class –ийг чөлөөл; procedure TForm1.FormCreate(Sender: TObject); var
  • 130. Reg : TRegistry; KeyGood : Boolean; Top : Integer; Left : Integer; Width : Integer; Height : Integer; begin Reg := TRegistry.Create; try KeyGood := Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, False); if not KeyGood then begin Top := Reg.ReadInteger(‘Top’); Left := Reg.ReadInteger(‘Left’); Width := Reg.ReadInteger(‘Width’); Height := Reg.ReadInteger(‘Height’); SetBounds(Left, Top, Width, Height); end; finally Reg.Free; end; end; Энэ код нь хялбар нээгдэх түлхүүрийг ашиглах ба WriteInteger method – ашиглан form -ны Top, Left, Width, and Height properties -ийн түрхүүрийг бичнэ. OpenKey method –ийн сүүлчийн параметрыг true болгож байгааг ажигла. Registry –ээс унших утга, бичих утга нь бүх үндсэн дуудалтууд юм. Бусад өгөгдлийн уншилт, бичилтийн methods нь өмнөх кодын хэсгээс өөр байдаг. Registry -ийг өгөгдөл хадгалах зориулалтаар хэрэглэх нь Энэ програм нь Registry –ийн цөөн зүйлийг агуулдаг. Сүүлчийн хэмжээ болон цонхны байрлал, цонхны байдал (normal, minimized, or maximized) хамгийн сүүлд нээсэн хавтас, сүүлчийн файл, хамгийн сүүлд ашиглагдаж байсан файл, өгөгдөл, хамгийн сүүлд ажилласан програмын огноо зэрэг. RegTest програмд үүсгэсэн Registry –ийн түлрүүрийг арилгахыг хүсвэл та үндсэн form дахь Delete Кеу товчлуурыг дар (see Figure 14.4, later in the chapter). Жагсаалт 14.3. RegTestU.pas. unit RegTestU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls, Registry; type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; DeleteKey: TButton; Panel2: TPanel; Label2: TLabel; Label3: TLabel;
  • 131. TimeLabel: TLabel; DateLabel: TLabel; MainMenu: TMainMenu; File1: TMenuItem; FileOpen: TMenuItem; FileExit: TMenuItem; OpenDialog: TopenDialog; procedure FormCreate(Sender: TObject); procedure FileOpenClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FileExitClick(Sender: TObject); procedure DeleteKeyClick(Sender: TObject); private { Private declarations } KeyDeleted : Boolean; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var Reg : TRegistry; KeyGood : Boolean; DT : TDateTime; Top : Integer; Left : Integer; Width : Integer; Height : Integer; begin { KeyDeleted хувьсагчыг False болгож байна. } { Хэрэглэгч програмаас түлхүүр устгасан эсэхийг шалгахад хэрэглэгдэнэ} KeyDeleted := False; { TRegistry классын обьектийг үүсгэж байна. } Reg := TRegistry.Create; try { Түлхүүрээ нээж байна } KeyGood := Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days', False); if KeyGood then begin Top := Reg.ReadInteger(‘Top’); Left := Reg.ReadInteger(‘Left’); Width := Reg.ReadInteger(‘Width’); Height := Reg.ReadInteger(‘Height’); SetBounds(Left, Top, Width, Height); WindowState :=TWindowState(Reg.ReadInteger(‘WindowState’)); DT := Reg.ReadDate(‘Date and Time’); DateLabel.Caption := DateToStr(DT);
  • 132. TimeLabel.Caption := TimeToStr(DT); end; finally Reg.Free; end; end; procedure TForm1.FileOpenClick(Sender: TObject); үar Reg : TRegistry; begin Reg := TRegistry.Create; try Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, True); if Reg.ValueExists(‘LastDir’) then OpenDialog.InitialDir := Reg.ReadString(‘LastDir’); if Reg.ValueExists(‘LastFile’) then OpenDialog.FileName := Reg.ReadString(‘LastFile’); if Reg.ValueExists(‘FilterIndex’) then OpenDialog.FilterIndex := Reg.ReadInteger(‘FilterIndex’); if OpenDialog.Execute then begin Reg.WriteString(‘LastDir’, ExtractFilePath(OpenDialog.FileName)); Reg.WriteString(‘LastFile’, ExtractFileName(OpenDialog.FileName)); Reg.WriteInteger(‘FilterIndex’, OpenDialog.FilterIndex); end; finally Reg.Free; end; end; procedure TForm1.FormDestroy(Sender: TObject); var Reg : TRegistry; begin if KeyDeleted then Exit; Reg := TRegistry.Create; try Reg.OpenKey(‘SoftwareSAMSDelphi 4 in 21 Days’, True); Reg.WriteInteger(‘WindowState’, Ord(WindowState)); if WindowState <> wsMaximized then begin Reg.WriteInteger(‘Top’, Top); Reg.WriteInteger(‘Left’, Left); Reg.WriteInteger(‘Width’, Width); Reg.WriteInteger(‘Height’, Height); end; Reg.WriteDate(‘Date and Time’, Now); finally Reg.Free; end; end; procedure TForm1.FileExitClick(Sender: TObject);
  • 133. begin Close; end; procedure TForm1.DeleteKeyClick(Sender: TObject); var Reg : TRegistry; begin Reg := TRegistry.Create; try Reg.DeleteKey(‘SoftwareSAMS’); KeyDeleted := True; finally Reg.Free; end; end; end. Дээрх жишээн дэхь RegTest програмыг ажиллуулбал та өөрийн applications –ний Registry ашиглалтын тухай ихийг сурах болно. Figure 14.4 дэхь RegTest програмыг ажиллагааг үзүүлнэ, Мessage барих XI бүлгээр ("Delphi –гийн хэрэгслүүд ба тохиргоонууд") бид WinSight програмын хэсэг нь Windows messages гэж хэлж байсан. Ихэнх хэсгийн Delphi –ийн message барих процесс нь хялбар хийгддэг бөгөөд энэ нь event –ээ дамжин ашиглагддаг. Таны message барих процесс нь Delphi –гийн messaging system -ээс түрүүлж хэрэгждэг. Message -ийн 2 үндсэн төрөл байна. • Windows messages. Эдгээр меssage –уудыг VCL бариж боловсруулж чадахгүй; • Хэрэглэгчийн тодорхойлсон message; Windows Message –ийн талаар дэлгэрэнгүй Програмын бүтцийг ашигласнаар Windows messages програмд яаж илгээгдэх, VCL дэхь төлөв тохируулна. Message төрөлүүд Үндсэндээ message -үүд нь 2 үндсэн төрөлд хуваагддаг. • Command messages – Цонх болон бусад контролд даалгавар өгөх. • Notification messages - Windows нь ямар нэг зүйл тохиолдлоо гэдгийг илтгэдэг. Динамик холболттой сан үүсгэх Яагаад DLL-ийг хэрэглэх хэрэгтэй болсон бэ? Dll нь дараахь ач холбогдлуудыг үзүүлж чадна: • • Кодыг үр ашигтайгаар ашиглах//Effective code reuse • • Олон application-ний дунд кодыг хувааж ашиглах //Capability to easily share code among many applications • • Кодыг хэсэгчилэх боломж //Capability to compartmentalize code • • Internationalization of your application
  • 134. • • Windows-ийн нөөцийг үр ашигтайгаар ашиглах //Effective use of Windows resources Эдгээрийг тус тусад нь авч үзье. Кодыг үр ашигтайгаар ашиглах//Effective code reuse Кодыг дахин ашиглана гэдэг бол объект хандалтад програмчиллын нэг том хэсэг.Dll нь үүнийг гүйцэтгэх зам нь болж чадна. Жишээ нь та Windows-ийн тусгай нэг үйлдэл гүйцэтгэдэг нэлээд том хэмжээний код бичсэн гэж үзье .Энэ хэсгийг бичихэд маш хүнд байсан бөгөөд хэрвээ хэрэгтэй газраа энэ нь дахин ашиглагдаж болдог бол үнэхээр амар байх болно.Dll бол яг үүнийг чинь л гүйцэтгэдэг юм. Үүнийг хийхийн тулд бүх кодоо DLL-дээ бичиж compile хийгээд дараа нь хэрэгтэй газраасаа DLL-ийгээ дуудахад л хангалттай.Бичсэн DLL-ээ бусдад худалдаж ч болно. -------------------------------------------------------------------------------- NOTE:Түүнчилэн та C++Builder, Visual Basic, Visual C++,бусад програмчиллын орчинд бичигдсэн кодноос дуудагдах боломжтой DLL-ийг амархан үүсгэж болно.Мэдээж энэ нь DLL дотор байгаа кодоосоо мөн хэрхэн дуудахаас хамаарах боловч үүнийг хийж болно. -------------------------------------------------------------------------------- Олон application-ний дунд кодыг хувааж ашиглах //Capability to easily share code among many applications кодыг хувааж ашиглах гэдэг бол арай хэдэн алхам илүү хийгдэнэ. Таныг нэгэн том корпарацид програмистаар ажилладаг гэж үзье.Тэгвэл танд өөр өөрсдийн гэсэн системтэй олон зуун хэрэглэгч байх болно. (Энэ жишээнд сүлжээний асуудлуудыг авч үзсэнгүй.).Эдгээр хэрэглэгчдэд 5 application бичсэн ба application бүр нь 100KB-д compile хийдэг гэж үзье.Хэрвээ та DLL хэрэглэхгүй бол 100KB кодоо 5 удаа давтаж хэрэглэхэд нийт 500KB код болно.Энэ бол үнэхээр кодыг үр ашиггүй зарж байна. Тэгэхлээр 5 application бүр нэг DLL-д бичигдсэн кодыг хувааж ашиглахаар зохион байгуулж болно.Ингэснээр Хэрэглэгч бүр нэмэлт 100KB DLL-ийг байрлуулах зай машиндаа агуулах болно гэхдээ application бүр 100KB-ийг хасах болно.Эцсийн дүнд нь хэрэглэгч бүр 400KB disk space хэмнэнэ. 400KB-ийг хэмнэх гэдэг нь их сонсогдохгүй байгаа ч гэсэн хэрвээ хэрэглэгчдийн тоо маш их бол энэ тоо мэдээж нэмэгдэнэ. Жинхэнэ амьдрал дээр бол та DLL-ийг хэрэглэснээр хэдэн хэрэглэгч бүр дээр хэдэн MB-аар хэмнэж болдог Хэрвээ энэ 5 app –ийн 3 нь зэрэг ажиллавал яах вэ ? Ямар ч асуудал гарахгүй . Windows нь хаанаас хэн дуудаж байгаа замыг нь хадгалж байдаг учраас ямар нэг будлиан үүсдэггүй. Кодыг хэсэгчилэх боломж //Capability to compartmentalize code Энэ асуудал ихэвчилэн кодоо өөрчлөх засах үед тохиолддог. Энэ аргыг хэрэглэсний нэг давуу тал бол маш амархан upgrade(өөрчлөлт) хийх боломжтой. Ямар ч шилдэг програм байсан ч
  • 135. гэсэн энэ нь ямар нэг хэмжээгээр заавал алдаатай л байдаг(bug).Тэгэхлээр та DLL дахь алдаагаа хайж байгаад засаад ажиллулах нь бүхэл бүтэн програмын хаа файлыг засахаас хэдэн хувь хялбар болох нь ойлгомжтой. Хэрвээ та програм бичээд нэг их удаагүй бол үүний ашиг тусыг одоохондоо мэдрэхгүй байх гэхдээ маш том хэмжээний хэдэн MB-аар хэмжигдэх програмын үед бол энэ үнэхээр авч үзэх асууддал болно. Internationalization of your application Хэдэн жилийн өмнө бол та програм бичээд олон улсын зах зээлийн тухайд бол санаа зовох зүйл байгаагүй.Програмдаа menu items, dialog boxes, hint text, error messages-ийг үүсгээд ашиглаад өөрийнхөө хэл дээр бичлээ Зах Зээл дээр гаргалаа тэгээд энэ тухай ахиж боддоггүй байлаа. Одоо бол дэлхий улам л жижгэрч Internet World Wide Web зэрэг зүйлүүд хэдэн жилийн өмнө байснаасаа өөр болж байна.Та нэг жижиг Demo программ бичээд Internet-д тавихад хэдхэн минут цагийн дотор л хэн ч гэсэн таны програмыг үзээд ашиглах боломжтой болсон билээ. Эндээс юуг хэлэх гээд байна гэвэл Програмаа өөр хэл дээр хөрвүүлэх тухай одоо авч үзэх цаг болсон. Үүнийг шийдэх нэг арга бол DLL-үүдэд янз бүрийн хэл дээрхий тэмдэгтүүдийн нөөцийг агуулсан resources үүсгэх. Хэл болгонд ялгаатай DLL үүсгэж болно эсвэл нэг DLL-д хийгээд зөв хувилбарыг нь дуудах зэргээр зохион байгуулж болно. Runtime-ийн үед та Windows API function LoadString-ийг дуудах шаардлагатай components-тай холбоход хэрэглэж болно. -------------------------------------------------------------------------------- NOTE: One disadvantage to the Delphi programming model is that it doesn't use traditional resources as other programming environments do. Resources such as menus are not loaded as resources but rather are contained within the form's resource. This makes internationalization more difficult and is one of the few times that this model works against you. -------------------------------------------------------------------------------- Windows-ийн нөөцийг үр ашигтайгаар ашиглах //Effective use of Windows resources Одоогийн систем бол маш хурдан болсон өмнө нь байсан RAM ,hard disk space зэрэг нь бүгд нэмэгдсэн.”Би ердөө л 2MB of system RAM хэрэглэж байна шүү дээ ” гэж хэлэх нь амархан болжээ. Үнэндээ бол та үргэлж хэрэглэгч тань ямар хэмжээний нөөц ашиглаж байгааг хянаж ухамсарлаж байх ёстой. Тэгэхлээр энд дахиад л DLLs тусалж чадна.Энэ бол кодыг олон application-ы дунд хувааж ашиглах гэдгийн үргэлжлэл гэсэн үг. Өмнө ярьж байсан жишээгээ дахин авч үзье.Хэрвээ DLL хэрэглэхгүй бол нэгэн зэрэг ачаалагдаж байгаа зарим програмууд нь санах ойд ижил код зэрэг ачаалагдах болно. Энэ тохиолдолд system resources-ийг дэмий үрж байна яагаад гэвэл program бүр тухайн кодын өөрин гэсэн хуулбарыг үүсгэнэ.
  • 136. DLL-ийг ашигласнаар бүх application нь санах ойд байгаа адилхан кодыг ашиглаж системйин хатуу байдлыг багасгана. DLL Unit-ийн Aнатоми Бусад Pascal unit шиг DLL unit нь тусгай форматтай байдаг. Listing 19.1- д lDLL unit-ийн байж болох хамгийн бага хэмжээг харуулсан байна. LISTING 19.1. A BASIC DLL UNIT. library TestDLL; uses SysUtils, Classes, Forms, Windows; procedure SayHello(AForm : TForm); begin MessageBox(AForm.Handle, `Hello From a DLL!', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; exports SayHello; begin end. Unit-ийн эхэнд байгаа library гэсэн түлхүүр үгэнд анхаарлаа хандуул. Library түлхүүр үг нь энэ unit –ийг DLL unit гэдгийг зааж өгнө.Энэ DLL-д ганцхан SayHello procedure байна. SayHello procedure нь бусад Object Pascal procedure-уудаас ямар ч ялгаагүй. Одоо анхаарлаа exports гэсэн түлхүүр үгэнд хандуул. exports гэсэн хэсэгт тодорхойлогдсон Ямар ч procedure & function DLL-ээс експортлогддог. Эцэст нь DLL unit-ийн төгсгөлд begin and end гэсэн түлхүүр үг байна.Энэ код block бол DLL-ийн үндсэн код block бөгөөд энд DLL эхлээд дуудагдахад гүйцэтгэгдэх кодыг бичиж өгнө. The Basics of DLL Writing Functions and Procedures in DLLs DLL дэх функц процедур нь хоёр категорид хуваагдана. • • DLL дэх локаль функц процедурууд • • DLL-ээс експортлогдсон функц процедурууд DLL нь method агуулсан классуудыг агуулах боломжтой. DLL дэх локаль функц процедурууд Энэ төрлийн функц процедуруудыг яг бусад функц процедур шиг зарлана.Эдгээр функц процедурууд нь DLL дотроо дуудагдана харин DLL-ийн гаднаас дуудагдах боломжгүй.Өөрөөр хэлбэл дуудаж байгаа application нь эдгээр функц процедуруудлуу ханддаггүй, тэдгээр нь DLL- ийн хувьд private мэтээр ойлгогдоно.
  • 137. -------------------------------------------------------------------------------- ТАЙЛБАР: DLL нь DLL-ийн бүх функц процедурууд хандаж болох глобал өгөгдлийг агуулдаг.Өөөрөөр хэлбэл нэг программ нь глобал хувьсагч х-ээ 100 болгож өөрчилбөл DLL-ийг ашиглаж байгаа бүх программуудад энэ өөрчлөлт нь нөлөөлнө. -------------------------------------------------------------------------------- DLL-ээс експортлогдсон функц процедурууд DLL-ээс гадна дуудагдаж чадах функц процедурууд энэ категорид орно. Эдгээр нь public –аар ойлгогдсон байна. -------------------------------------------------------------------------------- NOTE: DLL дэх функц процедурууд нь гүйцэтгэгдэж байгаа application- аас болон бусад DLL-ээс дуудагдаж болно. -------------------------------------------------------------------------------- функц процедурууд нь експортлогдсоны дараа үүнийгээ application-саа дуудах хэрэгтэй болно. Exports түлхүүр үг Listing 19.1 DLL дэх SayHello процедурыг експортлож байгаа жишээ үзүүлсэн байна. 2.Нэрээр нь Export-х Хамгийн өргөн арга бол нэрээр нь експортлох юм. exports SayHello, DoSomething, DoSomethingReallyCool; Експортлогдож байгаа функц процедуруудаа таслалаар тусгаарлан жагсаан бичиж болно. 2.Дугаараар нь Export-х Мөн функц процедуруудаа дугаараар нь експортлож болдог.ингэсэн тохиолдолд index гэсэ түлхүүр үг ашиглана. exports SayHello index 1, DoSomething index 2, DoSomethingReallyCool index 3; Энэ аргыг нэг их хэрэглэдэггүй. - DLL-Proc-ийг ашиглах Өмнө дурдсанчилан DLL-ийн үндсэн block-д initialization code-оо бичиж өгдөг. Харин finalization code-оо хаана бичих вэ гэсэн асуудал байна.DLL нь бусад unit шиг initialization and finalization хэсэг гэж байдаггүй. DLL-ийн үндсэн code block-д санах ойгоо хуваарилж өгдөг. Харин чөлөөлөхдөө DLLProc –ийг ашиглана. DLLProc нь нь DLL-ийн амьдралын хугацаан дахь тухайн үед дуудагддаг процедур юм. DLLProc хэрхэн бий болог тухай авч үзье. DLL нь Windows-ийг санах ойд ачаалагдах болон санах ойгоос чөлөөлөхийн өмнө нь message хүлээж авдаг.Мөн Түүнчилэн аль хэдийн
  • 138. ачаалагдсан DLL-ээс процесс бэхлэгдэх эсвэл Detach хийхэд message хүлээж авна. Эдгээр message-үүдийг олж авахын тулд Тусгай процедур үүсгээд үүнийхээ хаягийг DLLProc гэсэн глобал хувьсагчид олгодог. Энэ процедур нь доор илэрхийлсэн байдлаар харагдаж болно. procedure MyDLLProc(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then { DLL is unloading. Cleanup code here. } end; Зөвхөн DLLProc procedure-ийг зарлах нь үүнийг хэрэглэхэд хангалттай биш. Дээр нь үүнийхээ хаягийг DLLProc гэсэн глобал хувьсагчид олгох ёстой.Энэ үйлдлийг DLL-ийн үндсэн block-д хийдэг. begin DLLProc := @MyDLLProc; { More initialization code. } end. Энэ код нь DLL дуудагдахад биелэгдэнэ. DLLProc одоо бол суулгагдсан гэж тооцогдох бөгөөд processes attach хийхэд болон detach хийхэд DLL- ээс дуудагдана. Listing 19.2-д DLLProc-ийг илэрхийлж байгаа DLL үзүүлсэн байна. LISTING 19.2. A DLL UNIT THAT USES A DLLProc. library TestDLL; uses SysUtils, Classes, Forms, Windows; var SomeBuffer : Pointer; procedure MyDLLProc(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then { DLL is unloading. Cleanup code here. } FreeMem(SomeBuffer); end; procedure SayHello(AForm : TForm); begin MessageBox(AForm.Handle, `Hello From a DLL!', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; { More DLL code here that uses SomeBuffer. } exports SayHello;
  • 139. begin { Assign our DLLProc to the DLLProc global variable. } DLLProc := @MyDLLProc; SomeBuffer := AllocMem(1024); end. Listing 19.2 дахь Reason parameter нь DLLProc-ийг дуудагдах шалтгааныг илэрхийлж байгааг та тааварласан байх. Table 19.1-д Reason parameter-ийн боломжит утгуудыг харуулсан байна. TABLE 19.1. DLLProc Reason VALUES. DLL_PROCESS_DETACH DLL –Санах ойгоос чөлөөлөх. DLL_THREAD_ATTACH process нь DLL-д хобогдож байна. DLL_THREAD_DETACH process нь DLL-ээс detach хийж байна.. Loading DLLs DLL дэх функц процедурыг хэрэглэхийн өмнө эхлээд DLL-ээ санах ойд ачаалах хэрэгтэй. DLL-ийг runtime-ийн үед дуудах хоёр янзын арга байна: • • Static loading • • Dynamic loading Хоёуланд нь өөр өөрийн давуу болон сул тал байдаг. Static Loading Static ачаалалт нь таны DLL –ийг дуудах програм ажиллаж эхлэхэд DLL нь автоматаар ачаалагддаг. Staticдуудалтыг ашиглахын тулд функц процедураа DLL дотор external түлхүүр үгтэй зарладаг.Энэ тохиолдолд DLL доторхи функц процедурыг яг бусад функц процедур шиг ашиглаж болно.Энэ аргын сул тал нь хэрвээ DLL нь программын заалтыг тодохойлоогүй бол программ дуудахаас татгалзана. Dynamic Loading Dynamic-аар ачаална гэдэг нь DLL-ийг шаардлагатай үед нь ачаалж шаардлагагүй үед чөлөөлөх гэсэн үг юм.Давуу тал нь гэвэл DLL нь санах ойд яг хэрэгтэй үедээ л оршин байна тэгэхлээр санах ойг үр ашигтайгаар ашиглана гэсэн үг .Өөр нэг давуу тал нь таны application илүү хурдан ажиллана гэсэн үг. Гол дутагдалтай тал нь танд арай илүү ажиллагаа хийх хэрэгтэй болно.Эхлээд Windows API function LoadLibrary-аар DLL-ээ дуудах шаардлагатай. DLL-ээ ашигласны дараа FreeLibrary-аар чөлөөлөх болно.Тиймээс хүссэн функц процедураа дуудахын тулд GetProcAddress function –ийг ашиглах хэрэгтэй.Нэмж хэлэхэд энэ аргыг хэрэглэхэд будлих толгой эргэх асуудал гарч болзошгүй. DLL –д байгаа функц процедурыг дуудах 1. 1. Static Loading ашиглаж дуудах Дуудаж байгаа application нь функц процедурыг зарлах хэрэгтэй.Үүний дараа ердийн л функц дуудаж байгаа мэт дуудаж ашиглаж болно. DLL дэх функц процедурыг оруулж ирэхдээ зарлалтандаа external тодорхойлогчийг оруулж ирэх хэрэгтэй.Жишээ нь SayHello procedure-ийг дуудаж байгаа application-даа дараахь байдлаар тодорхойлно: procedure SayHello(AForm : TForm); external `testdll.dll';
  • 140. external гэсэн түлхүүр үг нь compiler-д энэ procedure нь DLL (TESTDLL.DLL in this case)-д байж болно гэж ойлгуулж байгаа. Яг дуудаж байгаа хэлбэр нь ямар нэг ондоо зүйлгүй. SayHello(Self); USING THE external KEYWORD Дараахь гурван аргаар импортлож болно: • • Нэрээр нь//By actual name • • Индексээр нь//By ordinal value • • Нэрийг нь өөрчилж//By renaming Эхний арга нь функц процедурыг яг DLL-д байгаагаар нь зарлаж өгөх. procedure SayHello(AForm : TForm); external `testdll.dll'; Хоёрдахь арга нь DLL –ээс експортлогдож байгаа функф процедурын дугаарыг нь шаардана. procedure SomeOrdinalProcedure; external `testdll.dll' index 99; Гуравдахь аргын хувьд функц процедураа хүссэнээрээ нэрлэж болох ба жинхэнэ нэрийг нь тодорхойлж өгөх хэрэгтэй. procedure CoolProcedure; external `testdll.dll' name `DoSomethingReallyCool'; 2. Calling Functions and Procedures Using Dynamic Loading Динамикаар дуудахад DLL дэх функц процедурыг заасан заагч зарлахыг шаарддаг.Жишээ нь DLL-д SayHello гэсэн процедур байг: procedure SayHello(AForm : TForm); begin MessageBox(AForm.Handle, `Hello From a DLL!', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; Тэгвэл энэ функцийг дуудахын тулд procedure-ийг илэрхийлж байгаа төрлийг тодорхойлж өгөх хэрэгтэй: type TSayHello = procedure(AForm : TForm); Ингэснийхээ дараа DLL-ээ дуудаад GetProcAddress –ийг ашиглан процедурыг зааж процедураа дуудна , эцэст нь DLL –ийг чөлөөлнө. var DLLInstance : THandle; SayHello : TSayHello; begin { Load the DLL. }
  • 141. DLLInstance := LoadLibrary(`testdll.dll'); { Get the address of the procedure. } @SayHello := GetProcAddress(DLLInstance, `SayHello'); { Call the procedure. } SayHello(Self); { Unload the DLL. } FreeLibrary(DLLInstance); end; Алдаа шалгах үйлдэл хийхийг доор нэмж харуулсан байна: procedure TForm1.DynamicLoadBtnClick(Sender: TObject); type TSayHello = procedure(AForm : TForm); var DLLInstance : THandle; SayHello : TSayHello; begin DLLInstance := LoadLibrary(`testdll.dll'); if DLLInstance = 0 then begin MessageDlg(`Unable to load DLL.', mtError, [mbOK], 0); Exit; end; @SayHello := GetProcAddress(DLLInstance, `SayHello'); if @SayHello <> nil then SayHello(Self) else MessageDlg(`Unable to locate procedure.', mtError, [mbOK], 0); FreeLibrary(DLLInstance); end; Creating a DLL Project with the Object Repository 1. File|New-ийг сонгоход Object Repository дэлгэцэнд гарна. 2. Double-click the DLL icon. Ингэхэд нэг цонх үүсэх бөгөөд энэ нь доор үзүүлсэн шиг байна. library Project2; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select View-Project Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the DELPHIMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using DELPHIMM.DLL, pass string information using PChar or ShortString parameters. }
  • 142. uses SysUtils, Classes; begin end. Энд бичигдсэн сануулгыг нь устгаад л шууд кодоо бичиж болно.DLL ашиглан динамк болон статик дуудалтыг харуулсан жишээг доор хавсаргав: LISTING 19.3. TestDll.dpr. library TestDLL; uses SysUtils, Classes, Forms, Windows; procedure SayHello(AForm : TForm); begin MessageBox(AForm.Handle, `Hello From a DLL!', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; procedure DoSomething; begin MessageBox(0, `This procedure was exported by ordinal.', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; procedure DoSomethingReallyCool; begin MessageBox(0, `Something really cool.', `DLL Message Box', MB_OK or MB_ICONEXCLAMATION); end; exports SayHello, DoSomething index 99, DoSomethingReallyCool; begin end. LISTING 19.4. DynLoad.dpr. library TestDLL; uses SysUtils, Classes, Forms, Windows; procedure MyDLLProc(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then { DLL is unloading. Cleanup code here. }
  • 143. MessageBox(0, `DLL is unloading!', `DLL Message', MB_OK or MB_ICONEXCLAMATION); end; procedure SayHelloDyn(AForm : TForm); begin MessageBox(AForm.Handle, `Hello From a DLL!' + #13 + `This DLL was loaded dynamically', `DLL Message', MB_OK or MB_ICONEXCLAMATION); end; exports SayHelloDyn; begin DLLProc := @MyDLLProc; end. LISTING 19.5. CallDllU.pas. unit CallDLLU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) HelloBtn: TButton; OrdBtn: TButton; DynamicLoadBtn: TButton; NamedBtn: TButton; procedure HelloBtnClick(Sender: TObject); procedure OrdBtnClick(Sender: TObject); procedure DynamicLoadBtnClick(Sender: TObject); procedure NamedBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; { A procedure imported by name. } procedure SayHello(AForm : TForm); external `testdll.dll'; { A procedure imported by ordinal. } procedure OrdinalProcedure; external `testdll.dll' index 99; { A procedure imported and renamed. } procedure CoolProcedure; external `testdll.dll' name `DoSomethingReallyCool'; implementation {$R *.DFM}
  • 144. procedure TForm1.HelloBtnClick(Sender: TObject); begin SayHello(Self); end; procedure TForm1.OrdBtnClick(Sender: TObject); begin OrdinalProcedure; end; procedure TForm1.NamedBtnClick(Sender: TObject); begin CoolProcedure; end; procedure TForm1.DynamicLoadBtnClick(Sender: TObject); type TSayHello = procedure(AForm : TForm); var DLLInstance : THandle; SayHello : TSayHello; begin { Load the DLL. } DLLInstance := LoadLibrary(`DynLoad.dll'); { If loading fails then bail out. } if DLLInstance = 0 then begin MessageDlg(`Unable to load DLL.', mtError, [mbOK], 0); Exit; end; { Assign the procedure pointer. } @SayHello := GetProcAddress(DLLInstance, `SayHelloDyn'); { If the procedure was found then call it. } if @SayHello <> n il then SayHello(Self) else MessageDlg(`Unable to locate procedure.', mtError, [mbOK], 0); { Unload the DLL. } FreeLibrary(DLLInstance); end; end. Шинээр компонент үүсгэх Компонент бичих нь дээд түвшиний програмчлалыг ашигладаг. Компонент үүсгэдээ эхлээд түүний Класс-г үүсгэдэг. Класс гэдэг нь обекьтыг хэлнэ. Обект нь property, event, method-той байдаг. Зарим нь private хэсэгт байрладаг, бусад нь public хэсэгтбайрладаг ба түүн руу
  • 145. хэрэглэгчид хандах боломжтой байдаг. Компонент бичих нь цэвэр програмчлал шаарддаг. - - New component dialog box Энэ нь компонент бичих эхлэлийг тавьж өгдөг. Ancestor type – удамшуулах төрөл Class name – Классын нэр Palette page- компонент байрлах хуудас Unit file name- source файлын нэр Search path- хайх зам Хэрэв Install товч дээр дарвал source файлыг үүсгээд түүнийг суулгаад тухайн компонент хавтасанд нь байрлуулдаг. Create unit –г сонговол зөвхөн source файлыг үүсэж өгдөг. Published property –нь object inspector дээр design time-н үед харагддаг. Урьд обьектод зарлагдсан property-г дахин зарлаж болдог. Шинээр компонент үүсгэхдээ анхаарах зүйл нь Class name нь заавал Т үсгээр эхэлдэг. Source code Unit Label_sukh; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TLabel_sukh = class(TCustomLabel) private { Private declarations } protected { Protected declarations }
  • 146. public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Sukh's', [TLabel_sukh]); end; end. Дээр харагдаж байгаа Private Protected Public Published хэсэгт зарлалтын бичдэг. Property - үндсэндээ утга хадгалахад зориулагдсан байдаг. - - Унших - - бичих - - унших-бичих - - Зөвхөн унших эсвэл зөвхөн бичих - - Анхны утга - - Pulished-non published гэсэн тодорхойлолтой байдаг. Ихэнхдээ property-н утгыг хадгалж байдаг хувсагчийг F –ээр эхлүүлж бичдэг. Left := 20; when you mean to write FLeft := 20; Унших ба Бичих property FlashRate : Integer read FFlashRate write SetFlashRate; Тухайн property нь read хэсгээс унших өгөгдөлтэй ижил төрөлтэй байна. Write хэсэгт ижил төрөлтэй өгөгдөлийг дамжуулдаг. Read хэсэгт нь хувсагч, write хэсэгт нь процедур байдаг. procedure TFlashingLabel.SetFlashRate(AFlashRate : Integer); begin FFlashRate := AFlashRate; { Do some other stuff. } end; Зөвхөн унших property FlashRate : Integer read FFlashRate; Зөвхөн бичих
  • 147. property FlashRate : Integer write SetFlashRate; Анхны утга property FlashRate : Integer read FFlashRate write SetFlashRate default 800; constructor TFlashingLabel.Create(AOwner : TComponent); begin inherited; FFlashRate := 800; { Other things here. } end; Method бичих Процедураа заавал public хэсэг зарласан байна. Унших болон бичих процедур нь protected хэсэгт зарлана. ComponentState property Design time үед байгаа эсэхийг шалгана. if csDesigning in ComponentState then Exit; unit FlashingLabel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TFlashingLabel = class(TCustomLabel) private { Private declarations } FFlashEnabled : Boolean; FFlashRate : Integer; Timer : TTimer; protected { Protected declarations } { Protected write methods for the properties. } procedure SetFlashEnabled(AFlashEnabled : Boolean); procedure SetFlashRate(AFlashRate : Integer); procedure OnTimer(Sender : TObject); virtual; public { Public declarations } constructor Create(AOwner : TComponent); override; published { Published declarations } property FlashEnabled : Boolean read FFlashEnabled write SetFlashEnabled default True; property FlashRate : Integer read FFlashRate write SetFlashRate default 800;
  • 148. property Align; property Alignment; property AutoSize; property BiDiMode; property Caption; property Color; property Constraints; property DragCursor; property DragKind; property DragMode; property Enabled; property FocusControl; property Font; property ParentBiDiMode; property ParentColor; property ParentFont; property ParentShowHint; property PopupMenu; property ShowAccelChar; property ShowHint; property Transparent; property Layout; property Visible; property WordWrap; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDock; property OnStartDrag; end; procedure Register; implementation constructor TFlashingLabel.Create(AOwner : TComponent); begin inherited; FFlashEnabled := True; FFlashRate := 800; Timer := TTimer.Create(Self); Timer.Interval := FFlashRate; Timer.OnTimer := OnTimer; end; procedure TFlashingLabel.SetFlashEnabled(AFlashEnabled : Boolean); begin FFlashEnabled := AFlashEnabled;
  • 149. if csDesigning in ComponentState then Exit; Timer.Enabled := FFlashEnabled; if not FFlashEnabled then Visible := True; end; procedure TFlashingLabel.SetFlashRate(AFlashRate : Integer); begin FFlashRate := AFlashRate; Timer.Interval := AFlashRate; end; procedure TFlashingLabel.OnTimer(Sender : TObject); begin if csDesigning in ComponentState then begin Timer.Enabled := False; Exit; end; Visible := not Visible; end; procedure Register; begin RegisterComponents(`Samples', [TFlashingLabel]); end; Registry Анх windows нь системийн өгөгдөлийг INI файлд хадгалдаг байсан. Энэ нь нэг талаас эвдэрэхд ша амархан нөгөө талаас нь үзэхэд нууцлалтгүй байсан. Үүнээс үүдэж Registry гэсэн ойлголт гарч ирсэн. Registry нь widows 95-с хойших үйлдлийн систенд байдаг. Хандах 1. хувьсагч зарлаад үүсгэх(Tregistry,Create) 2. rootkey –д root-г зааж өгнө. 3. Openkey зам ыг тодорхойлох(талбар) 4. өгөгдөл уншин ба бичих 5. хувьсагчаа санах ойгоос чөлөөлөх. 1. хувьсагч зарлаад үүсгэх(Tregistry,Create) var reg:Tregistry; …… begin reg:=Tregistry.create; 2. rootkey –д root-г зааж өгнө.
  • 150. reg.rootkey:=HKEY_CURRENT_USER; HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEY_USERS.. гм байдаг. 3. reg.openkey('SoftwareMicrosoftWindowsCurrentVersionRun',false) 4. reg.Readinteger(num') reg.Readstring('txt') reg.readbool(‘bool’) …. ReadBinaryData ReadBool ReadCurrency ReadDate ReadDateTime ReadFloat ReadInteger ReadString ReadTime …. reg.writeinteger(‘num’,123) reg.writestring(‘txt’,’aaaaaaa’); …. WriteBinaryData WriteBool WriteCurrency WriteDate WriteDateTime WriteFloat WriteInteger WriteString WriteTime 5. reg.free GRAPHICS БА MULTIMEDIA ПРОГРАМЧЛАЛ • Хялбар замаар Graphics хийх; • Device context and Tcanvas; • GDI обьектууд o Pens, Brushes, Fonts; o Bitmaps ба Palette; o Region огтлох; o Teкст зурах; o Bitmap зурах; o Memory Bitmap үүсгэх; o Memory Bitmap –ийг хадгалах; • Multimedia програмчлах o Windows API aшиглан Wave Audio тоглуулах;
  • 151. o TmediaPlayer компонент; o MediaPlayer Properties , Methods ба Events o Wave Audio o Гаралтын volume –г тохируулах; o Wave Audio –г бичиж авах; • MIDI Audio; • CD Audio; • AVI Video; Graphics and Multimedia нь програмын дээд түвшнийг төлөөлдөг. Өнөөдрийн энэ сэдэвт та нар Graphics ба Multimedia –г Delphi хэл дээр програмчлах тухай үзэж танилцана. Graphics –ийг програмчлахын тулд ямар ч гэсэн TCanvas TBitmap классуудын тухай нилээд хэдэн зүйлийг мэдэх хэрэгтэй. Би та нарт Delphi хэл дээр Graphics –г үзүүлэх хялбар аргаас эхэлье. Үүний дараа та нар Windows Graphics Device Interface (GDI)–ийн тухай мөн түүний компонентуудынх тухай мэдэж, хийж сурна. Одоо бид олон төрлийн хүрээ, хэлбэр дүрс зурах тогтсон дэг журмын тухай мөн Bitmap үзүүлэх олон аргыг сурна. Харин Multimedia програмчлах бүлгийн хэсэгт хэрхэн Windows API -аар дуут файл тоглуулах тухай үзнэ. Мөн та нар долгионт Audio тоглуулах, MIDI болон AVI video тоглуулахад TMediaPlayer класс хэрхэн хэрэглэгдэх тухай сурч мэдэх болно. Иймээс эхэлцгээе. TextRect Clipping rectangle дотор текст бичих Эдгээр properties ба methods нь Windows Device context –ийн үүргийн бага хэсгийг төлөөлдөг. Гэхдээ та нарт хэлэхэд Graphics -тай ажиллаж байхад эдгээр properties ба methods 80 хувийн үүргийг гүйцэтгэдэг. Хэдийгээр ийм боловч би TCanvas –ийн тухай ярихаасаа өмнө Graphic’s object –ийг яаж Windows програмчлалд хэрэглэх тухай ярих хэрэгтэй болов уу. GDI objects GDI –д олон төрлийн обьектууд байдаг ба эдгээр нь хэрхэн device context функцийг тодорхойлдог бол? GDI –ийн энгийн хэрэглэгддэг обьектууд нь Pens, Brushes, Fonts. Бусад обьектуудад Palettes, Bitmaps, regions багтдаг. Эхлээд Pens, Brushes, Fonts –ийг үзээд дараа нь complex object -руу орцгооё. Pens, Brushes, ба Fonts Pens, Brushes, Fonts нь TCanvas класст яаж хэрэглэгдэж байгааг авч үзье. Pens Pen нь обьектоор тодорхойлогдсон ба шугам зурахад хэрэглэгдэнэ. Шугам нь шулуун байх ба нэг цэгээс эхлэлтэй нэг цэгт төгсгөлтэй эсвэл тэгш өнцөгт, эллипс, олон өнцөгтийн хүрээ байна. TCanvas классын Pen property –аар pen –ээ оруулах ба энэ нь TPen классын жишээ юм. Хүснэгт 12.3 TPen-ийн property- нуудыг жагсаав.
  • 152. Хүснэгт 12.3 TPen properties. Эдгээр шинж чанаруудыг та хүссэнээрээ тохируулна. Доорх жишээнд улаан өнгөөр Dashed line-р харуулав. Canvas.Pen.Color:=clRed; Canvas.Pen.Style:=psDash; Canvas.MoveTo(20,20); Canvas.LineTo(120,20); Энэ кодчилолыг формынхаа товчинд OnClick handler дээр туршиж үзээрэй. Таныг товчин дээрээ дарахад зурагдах шулуун нь form дээр гарах болно. Тэмдэглэл : Энэ сэдвийн бүх жишээнүүдийг ийм байдлаар туршиж үзсэн байх хэрэгтэй. Хэрэв та нар дээрх жишээг туршиж үзсэн бол form –оо дээш нь зөөхөд таны зурсан шулуун арилах болно. Иймээс үүнийг байнгын болгохыг хүсвэл form –ийн OnPaint event –д дээр шулуун зурдаг кодоо бичиж болно. OnPaint event нь form –ийн харагдах байдал, байршил өөрчлөгдхөд үүсээдэг. Dashed ба Dotted pen style зөвхөн pen width –ийн утга 1 байх үед хэрэглэгдэнэ. PsClear pen style нь line –аа устгахад хэрэглэгдэнэ. Тэгэхдээ энэ line нь Windows GDI draw –ийн обьект болох тэгш өнцөгт, эллипс, олон өнцөгтүүдийн эргэн тойрны хүрээг хэлж байгаа юм. Зөвлөмж: TPen –ийн олон property -нуудыг form дээрээ Shape component ашиглан туршиж үзээрэй. Мөн Shape –ийнхаа pen -ийн property –г өөрчилж сайжруулаарай. TPen классын Mode шинж чанар нь effect -үүдийн гаднах харагдах байдалд онцгой хэрэгтэй байдаг. Brushes Энэ нь Graphical Shape -ийн дотрох хэсгийг буюу filled area –г төлөөлдөг. Хэрвээ та нар эллипс, тэгш өнцөгт, олон өнцөгтүүдийг зурсан бол Brush -г ашиглан дүүргэж болно. Ихэвчлэн энэ үед Brush нь зөвхөн өнгө байдаггүй Bitmap эсвэл pattern –ийг агуулсан байдаг. Brush нь TCanvas class -д байдаг ба нэг property юм. Brush –аар харагдах хэлбэрийг өөрчилж туршиж үзээрэй. Brush нь Tbrush class -ийн нэг объект юм. TPen, TBrush class -д бичиж тэмдэглэх event, method ерөөсөө байдаггүй. Хүснэгт 12.4 –т шинж чанаруудыг жагсааж бичив.
  • 153. Property Тайлбар Хүснэгт12.4 TPen properties. Доорх жишээнд форм дээрээ дугуй зураад 45 градусын налуутай зураасаар дотрохыг нь будах хэлбэрийг ашиглалаа. Canvas.Brush.Color:=clBlue; Canvas.Brush.Style:=bsDiagCross; Canvas.Ellipse(20,20,220,220); Brush -ийн хэв маягийг ашиглаж байхад түүний Color property шугмын өнгийг өөрчилдөг ба энэ шугам нь зургийнх юм. Зарим нэг VCL automatically forces зэрэгт background mode -ийг transparent болгодог. Гэхдээ энэ нь pattern fill үед болно. Background mode –ийг transparent болгоно гэдэг нь дүрсийн дэвсгэрийг цонхны дэвсгэр өнгө, хэв маяг хэлбэртэй адил болгохыг хэлж байгаа юм. Өмнөхөөс арай өөрөөр харагдуулъя. Өөрөөр хэлбэл дугуй дүрсийн дэвсгэр өнгийг формынхтай адил болгож . Энийг grayscale -дээр харах тийм амар биш гэдгийг мэдэж байна. Хэрэв background –аа тус тусд нь тодорхойлохыг хүсвэл VCL circumvent хэрэгтэй ба API –руу шууд очно. Энд хэрэв цагаан дэвсгэр дээр хөхөөр зураас татах кодыг үзүүлэв : Canvas.Brush.Color:=clBlue; Canvas.Brush.Style :=bsdiagCross; SetBkMode(Canvas.handle,OPAQUE);
  • 154. SetBkColor(Canvas.Handle, clWhite); Canvas.Ellipse(20,20,220,220); Одоо дэвсгэр өнгө цагаан болохыг Figure12.2 т дээрх кодчилолоор дугуй дүрсийг харуулав. Brush -ийн өөр сонирхолтой өвөрмөц онцлог нь Bitmap background option юм. Доор бичигдэх кодчилол нь bitmap brush -ийн тухай их зүйлийг хэлж өгнө: Canvas.Brush.Bitmap:=TBitmap.Greate; Canvas.Brush.Bitmap.LoadFromFile(‘bkgnd.bmp’); Canvas.Ellipse(20,20,220,220); Canvas.brush.Bitmap.Free; Эхний мөрөнд TBitmap обьектийн үүсэж буйг Brush -ийн Bitmap property –руу гэж тодорхойлж байна. Bitmap property нь утгаа аваагүй үүсэж байгаа маш өвөрмөц байна. Хоёр дах мөрөнд bitmap -аа файлаас зөөж байна. Гурав дах мөрөнд эллипс зурж байна. Энэ мөрний дараа эллипс зурагдсан байх учраас Brush property устгагдаж байна. Энэ үйлдэл зайлшгүй чухал юм. Учир нь VCL танд үүнийг хийж өгөхгүй. Хэрвээ brush property устгах нь бүтэлгүй болбол таны програмд санах ой хүрэхгүй болох магадлалтай. Доорх зурагт Bitmap brush -аар эллипс зурсныг харуулав. Танд зарим үед заавал hollow Brush хэрэг болно. Үүгээр background -аа харуулах болно. Hollow Brush -аа үүсгээд түүнийхээ brush style д зөвхөн bsClear гэж өгнө. Одоо бүгдээрээ өмнөх жишээгээ авч түүн дээрээ 2 дахь дугуйгаа дотор нь нэмж hollow brush aшиглая. procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pen.Width:=1; Canvas.Brush.Bitmap:=TBitmap.Create; Canvas.Brush.Bitmap.LoadFromFile('bkgnd.bmp'); Canvas.Ellipse(20,20,220,220); Canvas.Brush.Style:=bsClear; Canvas.Pen.Width:=5;
  • 155. Canvas.Ellipse(70,70,170,170); Canvas.brush.Bitmap.Free; end; Хэрвээ шууд API руу очвол та өөр зүйлүүдийг хийх боломжтой болно. Хэдийгээр ийм боловч VCL Brush class –т ихэвчлэн эдгээрийг гүйцэтгэдэг. Fonts Энд ямар нэгэн шинэ зүйл байхгүй. Fonts нь TCanvas class –тай хэрэглэдэг ба Tcanvas -ийн Fonts -оос ялгаагүй форм эсвэл бусад компонентуудад хэрэглэгддэг. TCanvas –ийн Font property нь бусад компонентуудын Font property -тай ижил байдаг. Canvas -т font -ийг солихдоо зөвхөн үүнийг хийгдэг: Canvas.Font.Name:=’Courlier New’; Canvas.Font.Size:=14; Canvas.Font.Style:=Canvas.Font.Style+[fsBold]; Canvas.TextOut(20,20, ‘ Testing’); Байна. Дараа бид текст зурах хэсэг дэх fonts нь юу хийдэг болохыг авч үзье. Bitmaps ба Palette Ихэнхдээ bitmaps, palettes –ууд нь хамтдаа явдаг. TBitmap class -ийг хэрэглэж байх үед Bitmap ачаалах ба дүрслэл хийхэд хялбар байдаг. Та нар хэдийнээ VIII бүлэгийн хичээл дээр Jumping Jack програм дахь TBitmap –ийн үйл ажиллагааг харсан. TBitmap class нэлээд хэд хэдэн нөхцөл байдалд өргөн хэрэглэгддэг. Дараагийн бүлэгт bitmaps зурах болон Memory Bitmaps –ийн талаар ярих үед зарим нөхцөл байдлыг харах болно. TBitmap class нь нэг цогц учраас би method, property бүрийг тайлбарлаагүй болно. Palette –ийн чухал ач холбогдлыг тайлбарлахаар жишээ авч үзүүллээ. OnPaint event handler дээр кодчилолыг эсвэл button click event дээр хэрэглэ. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap :TBitmap;
  • 156. begin Bitmap:=Tbitmap.Create; { Bitmap.IgnorePalette:=True;} Bitmap.LoadFromFile('c:co.bmp'); Canvas.Draw(0,0,Bitmap); Bitmap.Free; End; Програм ажиллуулахад та гоё Bitmap –ийг формаасаа харах болно. Эдгээр мөрнүүд ойлгомжтой тул тайлбаргүй. Харин 4 дах мөрөнд VCL –ийн Palette -ийн мэдээллийг татгалзаарай. Тэгээд дахин програмаа ажиллуулаарай. Ингэхэд bitmap-ийн өнгө бүгд буруу худал болно. (хэрвээ video adapter –ийнхаа display –ийг more than 256 Colors гэж тохируулбал та энэ үр нөлөөг анзаарч чадахгүй. ) Яагаад гэвэл palette aшиглаж чадахгүй. Харин palette bitmap -ийнхаа зөв өнгөнүүдийг palette system -д найдвартай хувиарлаж чаддаг. Bitmap, Palette обьектууд нь Graphics боловсруулалтад чухал үүрэгтэй оролцдог байна. Clipping Regions Regions нь Canvas –ийн дэлгэцэнд зурах хэсгийг хянаж байдаг муж юм. TCanvas class –д ClipRect property байдаг. Харин энэ нь зөвхөн уншдаг. Clipping Regions-ийг өөрчлөхөд Windows API –г хэрэглэх хэрэгтэй. Одоо өмнөх жишээгээ авч хэрхэн Clipping Regions work –д бага зэрэг зураг хавсаргаж түүнийгээ өөрчилж сайжруулахыг үзье. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; Rgn: HRGN; begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); Rgn:=CreateRectRgn(100,50,250,250); SelectClipRgn(Canvas.Handle ,Rgn); Canvas.Draw(0,0,Bitmap);
  • 157. Bitmap.Free; End; Одоо програмаа ажиллуулахад та зөвхөн Bitmap -ийн харагдаж байгаа хэмжээг харах болно. SelectClipRgn функц нь Canvas Clipping Region (хайчлах муж) –ийг тэгш өнцөгттэй адилтгаж координатыг 100,50,250,250 гэж тогтоодог. Өмнө нь bitmap -ийг хөдөлгөөнгүй байрлалд зурсан бол одоо зөвхөн Bitmap -ийн Clipping Region –оор хэмжээг нь тодорхойлсон нь харагдаж байна. Clipping Region –аас гаднахыг эс зөвшөөрсөн байна. Өмнөх жишээгээ авч олон сонирхолтой зүйл хийж өөрчиллөө. Тэгш өнцөгт Region үүсгэж байгаа мөрийг авч оронд нь доорх мөрийг тавилаа. Rgn:=CreateEllipticRgn(30,30,170,170); Одоо дахин програмаа ачааллаарай. Энэ үед Bitmap circular region - аар хязгаарлагдана. За одоо region –ний өөр нэг төрлийг авъя: Const
  • 158. Points: array [0..3] of Point = ((X:80,Y:0) ,(X:0,Y:80), (X:80,Y:160), (X:160,Y:80)); Var Bitmap: TBitmap; Rgn: HRGN; begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile(‘c:co.bmp’); Rgn:=CreatePolygonRgn(Points,4,ALTERNATE); SelectClipRgn(Canvas.Handle ,Rgn); Canvas.Draw(0,0,Bitmap); Bitmap.Free; End Энэ үед та олон өнцөгтийн region хэрэглэж region үүсгэж буй цэгүүдээр массив тодорхойлнсон байна. CreatePolygonRgn функц нь цэгүүдийн Region form цувааг үүсгэж байна. Үүн шиг хүссэнээрээ олон цэгүүдийг хэрэглэж болно. Төгсгөлийнх нь хаагдах цэгийг онцгойлон зааж болохгүй учир нь region автоматаар өөрөө эхлэлийн цэг төгсгөлийн цэгийг хооронд нь холбож төгсгөдөг. Дахин програмаа ажиллуулж ямар үр дүн өгөхийг хар. Тэмдэглэл: Энд бичсэн кодчилолын хэсэгт хэрхэн массивын анхны утгыг тогтоохыг харуулав. Кодчилол: Const Points: array [0..3] of Point =((X:80,Y:0),(X:0,Y:80),(X:80,Y:160),(X:160,Y:80)); Энд Tpoint массивын хязгаарыг тогтоож анхны өгөгдлөөр хангаж байна. Tpoint –д 2 талбар байдаг. X ба Y гэсэн. үүнд fieldname буюу талбарын нэрийг жагсааж тодорхойлох цэгээр өгөгдлийг нь тогтоож өгөх . Жишээ нь: (X:80) Мөн X ба Y-ийн өгөгдлөөр хангагдсан биеийг хос хосоор нь нийлүүлж бичнэ. Үүнийг 4 удаа бичсэн. Яагаад гэвэл массивт 4 элемент байна. Массивыг зарлаж анхны утга тогтоохдоо зөвхөн ийм байдлаар бичнэ. Та region –ийг дандаа хэрэглэхгүй ч гэсэн танд хэрэгтэй үед үнэлж баршгүй чухал болно. Зураг боловсруулалтанд шаардлагатай зүйлүүдийг хийж гүйцэтгэхэд хэрэг болно. Зурах үндсэн ажиллагаа Өмнө нь та номноос графикийн зарим үндсэн хэв маягтай тулгарч байсан байх. Үүгээрээ та Rectangle method нь талбай ба тэгш өнцөгт зурахад хэрэглэгддэг гэдгийг, харин Ellipse method нь дугуй ба зуйван дүрс зурахад, MoveTo ба LineTo -ээр хүрээ зурахдаа хэрэглэдгийг мэдсэн байгаа байх. Мөн Arc method нум зурахад, Pie method pie-shaped objects зурахад хэрэглэгддэг. Энэ бүгд чухамдаа үндсэн ойлголтууд юм. Teкст зурах Drawing text хийж сурах нь хэцүү дадлага юм. Нэмж хэлэхэд үүнд нилээд хэдэн гоё өвөрмөц онцлогууд байдаг . Эдгээрийн талаар та нар мэдэж авах хэрэгтэй . TextOut ба TextRect функцууд TextOut method canvas дээр бичих үндсэн арга болж өгдөг. Үүнд тийм ч хэцүү юм байхгүй. Та нар зөвхөн X ба Y –ийнхаа байрлалыг зааж өгч
  • 159. харагдах текстээ жишээн дээрхтэй ижил бичиж өгнө: procedure TForm1.Button1Click(Sender: TObject); begin Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri'); End; Энэ нь формын string –ийг 20,20 байрлалд гаргана. X ба Yнь гарах текстийнхээ зүүн дээд булангаас нь байрлуулдаг. Үүнийг туршиж үзээрэй. procedure TForm1.Button1Click(Sender: TObject); begin Canvas.TextOut(20,20, 'www.csms.edu.mn/cheri'); Canvas.MoveTo(20,20); Canvas.LineTo(100,20); End; Энэ кодчилол текстээ 20, 20 байрлалд үзүүлж, мөн шугам 100, 20 хүртэл зурж байна. Шугам нь текстийнхаа оройноос хөндлөнгөөр зурагдсан. TextRect method нь танд clipping rectangle -дээ текст нэмж харуулах боломжийг олгодог. Энэ method -ийг хэрэглэж байх үедээ текстээ заавал тодорхой хил хязгаар дотор нь багтаах хэрэгтэй. Хэрэв хязгаараас илүү гарах юм бол хайчилдаг. Доорх жишээнд 100 -аас илүү гарсныг үзүүлж баталж байна. Зөвлөгөө: Хэрэв текстээ tab төгсгөлтэй бичвэл Windows API функц TabbedTextOut-г хараарай. TextBackground
  • 160. Саарал форм дээр цагаан background –тай байсан нь сэтгэл татахгүй байна. Text background -ийг цагаанаар тогтоосон brush -аас олж авсан. Уг асуудлыг шийдэх 2 арга зам байна. Эхнийх нь canvas brush -ийн өнгийг солих, дараагийнх нь text background –г transparent хийх. Text background – ийг өөрчлөх нь хялбар байна. Тэгэхдээ нэг асуулт байна. Ямар өнгөөр текстийнхаа дэвсгэр өнгийг болгохоо мэдэж байна уу? Энэ нөхцөлд текстийнхаа дэвсгэр өнгийг формынхтай ижил болгов. Үүний тулд: Canvas.Brush.Color:=Color; Гэж хийнэ. Энэ кодчилол нь олон нөхцөл байдалд ажиллана. Зарим үед танд олон контрол байна. Харин та зөвхөн text transparent -ийнхаа background -ийг өөрчлөх юм бол хялбар болно. Кодчилол нь ямар байхыг харуулъя: Var OldStyle: TbrushStyle; Begin OldStyle:=Canvas.Brush.Style; Canvas.Brush.Style:=bsClear; Canvas.textOut(20,20, ‘www.csms.edu.mn/cheri’); Canvas.brush.Style:=OldStyle; End Эхлээд одоогийн байгаа brush style -аа хадгална. Дараа нь brush style - ийг transparent дээр bsClear гэж тогтоож өгнө. Тэгээд текстээ харуулсныхаа дараа Brush style -ийг эргээд урд нь ямар стиль байсныг тавилаа. Та текстээ бичиж өгчихөөд өмнөх style -аа хадгалсан хэлбэрээр нь дахин тогтоож өгнө. Энэ нь хуучин байсан brush style -ийг цаашид байх нь зүгээр гэж бодвол дахин тогтоож болохыг харуулав. Transparent background хэрэглэх үед бас нэг өөр давуу тал бий. Энэ нь та хэсэг текстээ bitmap background дээр гаргах боломжтой боллоо гэсэн үг. Харин энэ үед solid дэвсгэр хэрэглэж болохгүй. Кодчилол нь зургийн хамт (factory.bmp file нь Borland Shared Files 56 Color директоороор олдоно.) procedure TForm1.Button1Click(Sender: TObject); Var OldStyle: TbrushStyle; Bitmap:TBitmap; Begin Bitmap:=Tbitmap.Create; Bitmap.LoadFromFile(‘factory.bmp’); Canvas.Draw(0,0, Bitmap); Canvas.Font.Name:=’Arial Bold’; Canvas.Font.Size:=13; Oldstyle:=Canvas.Brush.Style; Canvas.Brush.Style:=bsClear; Canvas.TextOut(20,5,’Transparent background’);
  • 161. Canvas.brush.Style:=OldStyle; Canvas.TextOut(20,30,’solid background’); Bitmap.Free; end; Энэ код нь форм дээр bitmap зурна. Дараа нь текст формд зураг нь дээр transparent background –аар бичигдэнэ. Үр дүнг харж байхад background transparent нь танд таалагдана. Мөн transparent background текстэнд зураг хавсаргана. Үүнийг уг номны XIII бүлэгт “Owner Drawn Status panels” хэсэгт үзнэ. Draw Text функц Windows API DrawText функц нь canvas дээр TextOut -аас илүү өргөн боломжтой юм. TCanvas class -д DrawText method байдаггүй учраас DrawText –ийг хэрэглэхдээ шууд дуудна. Эхлээд DrawText -ийн жишээг хараад дараа нь энэ функцын тухай авч үзье. Var R:TRect; begin R:=Rect(20,20,280,80); Canvas.Rectangle(20,20,280,80); DrawText(Canvas.Handle,’An example of drawetext.’,- 1,R,DT_SINGLELINE or DT_VCENTER DT_CENTER); end; Эхлээд Rect -ийг windows API Rect функцаар анхны утга тогтоосоон байна. Үүний дараах мөр нь Canvas дээр rectangle буюу тэгш өнцөгтийг зурж байна. Ингэхдээ тэгш өнцөгтийн түүн дээр зурагдах хэмжээг нь зааж өгнө. Сүүлийн мөрөнд текст бичихдээ Drawtext функцыг дуудан бичиж байна. Харин одоо энэ функцынхээ хоорондоо ялгаатай параметрүүдийг нь авч үзье. • Эхний параметр нь тухайн зургаа буюу жишээн дээрх тэгш өнцөгтөө юун дээр зурахаа зааж өгнө. • Хоёрдах параметрт string утга авч харагдах текстээ бичиж өгнө. • Гуравдах параметрт зурагдах хэсгийнх тоог зааж өгнө. –1 утгатай байвал энэ нь string-ийг бүтэнээр нь гаргана. • Drawtext -ийн 4 дөх параметр TRect хувьсагчийг авна. Яагаад гэвэл зарим Drawtext -ийн боловсруулалт тэгш өнцөгтийг хийхдээ
  • 162. өөрчилдөг учираас энэ параметр хувьсагч авна. • DrawText хэрхэн ажиллахыг энэ параметрт бичнэ. Параметр нь текстээ бичих үед хэрэглэгдэх flag-ийг заана. Энэ жишээнд DT_SINGLELINE, DT_VCENTER, DT_CENTER flag-ийг хэрэглэсэн байна. Энэ flags нь текстийг дан шугамаар, хөндлөнгөөр нь голлуулж гаргахыг илэрхийлж байгаа юм. Drawtext -д бараг 20 flags байдаг ба тэдгээрийг тус тусд нь тодорхойлж болно. Би тэр болгоныг тайлбарламааргүй байна учир нь Win 32 API –ийн online help -д гүйцэт жагсааж бичсэн байдаг . Өмнөх жишээндээ Drawtext функцдээ текстээ голлуулж Horizontally, Vertically, both зэргээс нэгийг нь сонгон авсан. Та яг одоо энэ функцын ач холбогдлыг ухаарахгүй байж магадгүй. Гэвч та хэрвээ owner drawn components хийж эхлэхээр эсвэл own graphical compoment -aa бичиж эхлэхээрээ хэрэгцээг нь мэдрэх болно. procedure TForm1.Button1Click(Sender: TObject); Var R: TRect; begin R:=Rect(20,100,120,150); DrawText(Canvas.Handle,'This text is too long.',-1, R, DT_END_ELLIPSIS); end; Дээрх код ажиллахад үүсэх үр дүнд текст ингэж харагдана. Хэрвээ та тэгш өнцөгт дотор текстээ багтахгүй урт гэж мэдвэл flag -ийг хэрэглэж чадах боллоо. DT_CALCRECT flag нь текстийн багтаахад хэрэглэх өндрийг боддог. Энэ flag –ийг хэрэглэж байхад харин текстээ бичиж өгөхгүй . Windows текстийг багтаахад хэр зэрэг өндөртэй тэгш өнцөгт байхыг хэлж өгнө. Тэгээд Windows багтах өндрөөр нь тэгш өнцөгтийн зүүнээс эхлэн өөрчилж гүйцэтгэдэг байна. Энэ flag олон мөр текстийг бичихэд маш чухал ач холбогдолтой байдаг. Доорх жишээнд windows -оос текстээ багтаах тэгш өнцөгтийнхөө өндрийг асууж, тэр өндрөөр нь тэгш өнцөгтөө зураад дээр нь текстээ бичиж байгаа кодчилолыг бичив. procedure TForm1.Button1Click(Sender: TObject); Var R: TRect; S: string;
  • 163. begin R:=Rect(20,150,150,200); S:='This is very long string which will '+'run into multiple lines of text'; DrawText(Canvas.Handle, Pchar(s),-1,R,DT_CALCRECT or DT_WORDBREAK); Canvas.Brush.Style:=bsSolid; Canvas.Rectangle(R.Left,R.Top,R.Right,R.Bottom); Canvas.Brush.Style:=bsClear; DrawText(Canvas.Handle, Pchar(s),-1,R, DT_WORDBREAK); end; DrawText -ийн 2 дах параметр string биш текст параметр болохоор массивын заагчийг шаарддаг учираас Pchar(s) гэж бичсэн байна. Тэмдэглэл: Хэрэв та Delphi 1.0 –ийг ашиглаж байгаа бол String –г Pchar луу болгохдоо StrPCopy функцыг хэрэглээрэй. Жишээ нь: Var Temp: array [0..3]of Char; R : TRect; S : string begin DrawText(Canvas.Handle, StrPCopy(Temp,S), -1, R,DT_CALCRECT or DT_WORDBREAK); Харин Delphi 1.0 –ээс дээших хувилбаруудад бол Pchar –г өмнөх жишээтэй адил хэрэглээрэй . Энэ кодчилолоо формынхоо OnPaint event дээр тавиад програмаа ажиллуулаарай. Мөн текстийнхаа уртыг өөрчлөөд үзээрэй. Ингэхэд энэ нь ямар ч асуудалгүй та хичнээн ихийг нэмж бичсэн ч тэгш өнцөгт таны текстийн гаднаар хүрээлэгдсэн байх болно. Зөвлөгөө: Хэрэв танд текст бичих олон cонголт хэрэгтэй байгаа бол DrawTextEx функцыг хэрэглээрэй. Win32API-ийн online help –с мэдээллийг аваарай. Тэмдэглэл: DrawText дээр текст бичих нь TextOut -ийг хэрэглэхээс арай удаан байдаг. Хэрвээ таны зургийн боловсруулалт хурдан байх шаардлагатай бол TextOutм-ийг хэрэглэх нь зохимжтой. Гэхдээ энэ 2 нь зарчмын хувьд хоорондоо ялгаагүй юм. DrawText нь маш өргөн хэрэглээтэй.
  • 164. Bitmap зурах Bitmap зурах нь нилээн хэцүү юм шиг санагддаг. Харин та үүнийг үзсэнийхээ дараа маш хялбархан зүйл байна гэж бодох болно. Тэгэхээр TCanvas –д Btmap зурахад зориулагдсан хэдэн method –ууд байдаг. Эдгээрээс хамгийн их хэрэглэгддэг method бол Draw. Энэ нь Canvas дээрх гарах байрлалыг зааж өгөхөд л хангалттай. Одоо хэдэн жишээ авъя. procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); Canvas.Draw(0,0,Bitmap); Bitmap.Free; end; Энэ жишээнд өгөгдсөн зургийн файлаас TBitmap обьект үүсгэж формын зүүн дээд буланд гаргаж үзүүлж байна. Bitmap –даа ямар ч өөрчлөлт оруулахгүйгээр гаргаж үзүүлбэл Draw -ийг хэрэглээрэй. Хэрвээ хэмжээг нь өөрчилж гаргамаар байгаа бол StretchDraw method -ийг хэрэглээрэй. Ингэхдээ Bitmap -ийнхаа гарах тэгш өнцөгтийн хэмжээг зааж өгнө. Хэрвээ Bitmap -ийн өөрийнх нь хэмжээнээс томоор заавал зураг чинь stretched болж гарна. Харин жинхэнэ хэмжээнээс нь багаар зааж өгвөл багасгаж гаргах болно. Жишээ нь: procedure TForm1.Button1Click(Sender: TObject); Var Bitmap: TBitmap; R: TRect; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('c:co.bmp'); R:=Rect(0,0,100,100); Canvas.StretchDraw(R,Bitmap);
  • 165. Bitmap.Free; end; Тэмдэглэл: StretchDraw –аар bitmap -ийн жинхэнэ харагдах харьцааг өөрчлөх гэж оролдсоны ч хэрэггүй. Яагаад гэвэл Bitmap -ийнхаа жинхэнэ өндөр өргөнийхөө харьцааг хадгалж хамгаалсан байдаг. Мөн өөр нэг CopyRect method байдаг. Энэ method үндсэн гарах тэгш өнцөгтийнхөө бие ба хуваагдах тэгш өнцөгтийнхөө очих биеийг зааж өгөхөд болно. Нэг ёсондоо bitmap -аа хэсэгт хувааж үзүүлэх боломж өгч байгаа юм. Жнь: Var Bitmap: TBitmap; Src: TRect; Dst: TRect; I, X, Y :Integer; Strips: Integer; Stripsize: Integer; OldPal: Hpalette; Begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile(‘factory.bmp’); Strips :=6; Stripsize:=(Bitmap.Height div Strips); OlsPal:= SelectPalette(Canvas.Handle,Bitmap.Palette,True); For I:=0 to Pred(Strips) do begin Src:=Rect(0,I*Stripsize) . Энд зургаа оруулж ирээд зурааснуудад зүсч санамсаргүйгээр байрлалыг үзүүлж байна. Энэ кодыг өөрөө үндсэн формынхоо OnPaint handler оруулж туршиж үзээрэй. Тэгэхээр илүү ойлгомжтой болно. Зураг onPaint event ажиллах болгонд зурагдах болно. Тэмдэглэл: Өмнөх жишээнд Palette функцыг ашиглаж байхад формын palette -ийг Bitmap Palette property –д тогтоож өгсөн. Учир нь canvas –т Palette байдаггүй. Иймээс формдоо API -г ашиглаарай. Хэрвээ Palette -аа
  • 166. тогтоож өгөөгүй бол формдээр Bitmap -ийг гарч байхад өнгө буруу гарна. CopyRect method bitmap -ийг гаргахад бүтэц хэрэглэгддэг. Иймээс уг функцийг хэргэлж байхад нэмэлт алхам шаардлагатай. Бас нэг өөр bitmap drawing method байдаг тухай дурьдахыг хүсч байна. the BrushCopy method үндсэн тэгш өнцөгтийн очих тэгш өнцөгт, зураг, transparent color -ийг зааж өгөх боломжийг олгодог. Online help BrushCopy –д энэ method -ийг хэрэглэхээсээ илүү ImageList component -ийг хэрэглэхийг зөвлөдөг. BrushCopy method нь ImageList –ийг бодвол хэрэглэхэд хялбар, гоё харагдуулах боловч хугацаа илүү зарцуулдаг. Хэрвээ transparent background –тай bitmap -ийг хэрэглэж байгаа бол заавал BrushCopy -г хэрэглээрэй. Offscreen Bitmap Offscreen bitmaps, мөн bitmaps memory гэж дуудаж болдог. Энэ нь Windows програмчлалд энгийнээр хэрэглэгддэг. Offscreen bitmaps танд зургаа санах ойд хадгалчихаад дараа нь Draw method –оор үзүүлэх боломж олгодог. Offsreen Bitmaps help богино хугацаанд дэлгэцэнд гаргахын тулд ашиглагддаг. Энэ нь олон удаа шууд зурахад гардаг анивчих үзэгдлээс зайлсхийдэг. Мөн complex Bitmap програмчлахад маш зүгээр байдаг. Зургаа санах ойд хадгалаад дэлгэцэнд үзүүлэхад бэлэн болгож бэлтгэдэг. OffscreenBitmaps Microfofts DirectX SDK animation –д хамгийн өргөн дэлгэрсэн шинэ технологи. Offscreen Bitmap -ийн процесс 3 алхамаас бүрдэнэ. Үүнд: 1. Bitmap memory үүсгэнэ. 2. Bitmap memory дээр зурна. 3. Bitmap memory –г дэлгэц руу хуулах. Memory Bitmap үүсгэх Bitmap memory (санах ой ) үүсгэх нь хялбар байдаг. Memory Bitmap –аа үүсгэж байхад цаг тутамд TBitmap объект үүсэж байх болно. Энэ үед memory bitmap -д файлаа хадгална. Дараа нь memory bitmap үүсгээд, хэмжээг зааж өгч гаргана. Жишээ нь: Form дээр нэг button авч түүнийхээ OnClick event –д туршиж үзээрэй. Button дарах бүрд тэгш өнцөгт санамсаргүйгээр зурагдан дэлгэцэнд харагдах болно. Bitmap memory хялбархан зурагдах ба canvas –т Bitmap –аа хуулдаг. Хэрэв 256 өнгөт video adapter хэрэглэж байгаа бол өнгөнүүд dithered болно. Учир энь жишээнд Palette хийгээгүй болно. Тэмдэглэл: Memory Bitmap үүсгэж байхдаа Bitmap ийн өнгө video үзүүлэх өнгөний тохиргоотой ижил байх ёстой. Хэрвээ video display 256 өнгөн дээр сонгосон бол Bitmap 256 өнгөтэй байна. харин 24 - 32 bit video display - тай бол memory bitmap 32k, 64k эсвэл 16 сая өнгөтэй байх болно. Memory Bitmap –г хадгалах Memory Bitmap –г хадгалахдаа SaveToFIle процедурыг дуудна.
  • 167. BITMAP.SAVETOFILE(‘TEST.BMP’); Та нар програмынхаа дэлгэцийг амархан үүсгэж чаддаг. Энэ бүгдийг та үнэндээ memory Bitmap –д дэлгэцийнхээ хэсгийг хуулж байгаа юм. Multimedia Programming Multimedia programming гэдэг үг нь олон утгыг илэрхийлдэг. Учир нь multimedia program -д боломжийн бүх өргөн хүрээг өөртөө агуулсан байдаг. Multimedia нь ердийн wave audio, MIDI video clips, animation зэргийг багтаадаг. Зарим хүмүүс multimedia програмчлалыг тоглоомын програмчлалтай андуурдаг. Тоглоомын програмчлал нь multimedia –тай гарцаагүй холбоотой болдог. Гэвч sound, video –той илүү холбоотой. Одоо graphics эсвэл multimedia API -ийн тухай тодорхой хэлбэл OpenGL эсвэл DierctDraw -ийн тухай авч үзье. Graphics програмчлалын тухай их мэдээлэлтэй ном хэрэглэвэл сайн мэргэжих болно. Delphi 4.0 Unleased (ISBN: 0-672-312-859) ном сайн сонголт байх болно. TMediaPlayer компонент VCL нь хялбарханаар Multimedia удирдах MediaPlayer компонентоор хангадаг. Энэ компонент нь Component Palette –ийн System tab -д байрладаг. Wave files, AVI video -г тоглуулж чадна. TMediaPlayer –ийг хэрэглэхэд маш амархан. Зөвхөн Wave file тоглуулахын тулд би PlaySound функцыг өмнөх жишээнд хэрэглэсэн. Энэ контролд Play, Pause, Stop, Next, Previous, Step, Back, Record, Eject гэсэн button -ууд байдаг. MediaPlayer -ийн формыг үзүүллээ. Энэ MediaPlayer-ийг хэрэглэх маш энгийн юм. FileName property –д multimedia файлын нэрийг оноосноор товчин дээр дарахад тоглуулж эхэлдэг. Ингэхдээ .wave, .mid, .avi file –уудыг сонгож болно. Та MedioPlayer -аа илүү сонирхолтой хиймээр байгаа бол сайн ухаж төвхөж үзээрэй. Зарим нөхцөлд MediaPlayer -ийн visual control bar их зүгээр харагддаг. Магадгүй та MediaPlayer –аа control bar (Items –гүйгээр) хиймээр байгаа бол MediaPlayer –ийн Play, Start, Stop, Rewind кодыг нарийн аргаар хийгээрэй. Хэрвээ Media Player -ийн runtime үед харагдуулахгүйг хүсвэл Visible –г False утгатай болгоорой. Wave Audio ба Windows API Windows API function –ний тухай энгийн зүйлүүдийг яримааргүй байна. Wave файлыг тоглуулхад Win32API –ийн PlaySound функцийг ашиглаж болно. Эхлээд та нар Mmsystem –ээ өөрийнхөө хэрэглэгчдийг list болгохоор нэмнэ. Дараа нь PlaySound функцээ доорх байдлаар дуудна.
  • 168. PlaySound(‘test.wav’,0,SND_FILENAME); Амархан байгаа биз? PlaySound –н эхний параметрт ямар файл тоглуулахаа зааж өгнө. Сүүлийн параметрт дуу хэрхэн тоглогдох flag -ийг тогтоож өгнө. Дискнээс wave audio тоглуулж байхдаа сүүлчийн параметрт та SND_FILENAME гэж тогтоож өгнө. Та өөр flag зааж өгч болно. Харин энэ тохиолдолд зөвхөн PlaySound функц нь мөн дискэндээр файлтай ижил sounds system тоглуулж чадна. Cистемийн дууг тоглуулахдаа эхний параметрт нь sound alies -ийг зааж өгнө. Харин flags параметрт SND_ALIES гэж жишээндээ зааж өгчээ. PlaySound (‘SystemAsterisk’,0,SND_ALIES); Энэ код нь системийн дуу Asterisk –ийг тоглуулна. Системийн дууны жагсаалтыг олж авхыг тулд Сontrol Panel –ийн Sound аpplet –ийг ажиллуул. Хэрвээ системийн дуу олдохгүй бол windows default дууг тоглуулна. Default дуу нь ding байдаг. Тэмдэглэл: Win32API MessageBeep функц мөн system sound -г индексийн дугаараар нь тоглуулдаг. Win32 online help –с MessageBeep -н тухай бүх мэдээллийг хараарай. Play sound функц дуудах үед 2 өөр чухал flags байна. • SND_ASYNC flag нь дууг асинхрон тоглохыг зөвшөөрдөг. Энэ flag хэрэглэгдэж байхад дуу тоглож эхлэхдээ шууд програмын тоолуурыг програмруу буцаадаг. Энэ нь таны програм дараагийн командаа ажилуулж байхад sound тоглосоор байх болно гэсэн үг. • SND_SYNC flag нь дууг тоглож дуусах хүртэл програмын тоолуурыг програмруу буцаахгүйгээр зааж өгдөг. SND_SYNC нь PlaySound –н default учираас энэ flag-г тодорхойлж өгөх хэрэггүй. Энд маш олон flag-ууд PlaySound -р дууг яаж тохируулахад хэрэглэгдэнэ. Бүрэн мэдээллийг Win32 online help дээр PlaySound функц гэсэн хэсгээс хараарай. MediaPlayer –ийн Properties, Method, ба Event TMediaPlayer –т маш олон property байдаг. Тэдгээрийн ихэнх нь ойлгоход хялбар, харин зарим нь бага зэргийн төвөгтэй байдаг. TmediaPlayer -ийн үндсэн гол шинж чанаруудыг жагсааж бичив.
  • 170. TMediaPlayer –т мөн олон method байдаг.
  • 171. roperty Тайлбар TMediaPlayer компонентод зөвхөн нэг event байдаг. OnNotify event нь команд гүйцэтгэж дуусхад дуудагддаг. Харин зөвхөн Notify property -гийн утга true үед та алдааг шалгаж болно. NotifyValue Property нь утгыг харах үйлдлийг амжилттай эсэхийг заана. Wave Audio Multimedia -гийн олон үндсэн үйлдлүүдийн нэг нь Wave audio тоглуулах юм. энэ нь магадгүй ердийн үйлдэл юм. Wave file synchronously тоглуулж байхад: Play.wait:=true; Player.filename:=’testwav.wav; Player.open; Player.play; Энд wave property true wave файлын тоглох төлөв нь synchronously байна. Player.FileName := ‘test.wav’; Player.Open; Player.StartPos := 1000; Player.EndPos := 3000; Player.Play; Тэмдэглэл: Хэрэв StartPos, EndPos –ийн утгууд буруу байвал wave файлыг тоглуулж чадахгүй. Буруу өгөгдөл гэдэгт startPos, EndPos –ээсс их эсвэл EndPos –ийн утга Media файлын уртаас их зэрэг багтана. Дууны хэмжээг тохируулах Wave төхөөрөмжийн дууг тохируулах нь харьцангуй амархан зүйл юм. Windows API үүнийг хийнэ. WaveOutgetvolume ба WaveOutsetvolume функцүүд дууны цар хүрээг тохируулж чадна. Volume нь integer утга авна. Өндрийг нь баруун, сулыг нь зүүн талын volume тохируулгаар хийнэ. Тэг утга нь дуугүй ба $FFFF (hex) байвал хамгийн чанга гэх мэтчилэн өгнө. waveOutSetVolume(0, $FFFFFFFF); WaveOutsetVolume функц нь зөвхөн wave бүтээгдэхүүний дууг тохируулна. Master дууг зөвхөн multimedia mixer control -оор тохируулдаг. Wave Audio бичлэг хийх Уг сэдэв нь тийм амар зүйл биш. Яагаад гэвэл wave файл бичихдээ эхлээд
  • 172. бичигдэх wave файлаа нээнэ. Энэ нь бичихтэйгээ ижил параметртэй шинэ файл байна. Тэгээд дараа шинэ өгөглөө бичнэ. Filename property -ийн name -ийг өөрчлөх ба түүндээ хадгална. Энэ бүгд бага зэрэг төвөгтэй. Жишээ нь: Filename DUMMY.wav энэ файл 22050kHz –ийн WaveFormat -тай болно. Товчин дээр дарах үед та wave audio -оор бичиж эхэлнэ. Энэ үед бичих үйл явц эхэлчихсэн ба удирдлага таны application руу буцаана. Одоо зогсоох хэрэгтэй . Доор жишээнд үзүүлэв. procedure TForm1.StartBtnClick(Sender: TObject); begin with MediaPlayer do begin FileName := ‘dummy.wav’; Open; Wait := False; StartRecording; end; end; procedure TForm1.StopBtnClick(Sender: TObject); begin with MediaPlayer do begin { Бичих процесийг зогсоож байна } Stop; { файлын нэрийг өөрчилөн, хадгална} FileName :=’new.wav’; { Хадгалах ба хаана } Save; Close; end; end; Тэмдэглэл: Бичиж байх үед энэ алхамыг wave audio recording гүйцэтгэх шаардлагатай. MediePlayer -ийн байрлалыг олохын тулд Record method дууд. Бичлэг хийх үзүүлэлтүүд нь дараах байдалтай байна. Үүнд: хурд, хоолойны тоо (mono, stereo) bits –н тоо, (ихэвчлэн 8 эсвэл 16) зэрэг хэв маягууд байдаг. Ердийн wave form -ийн тоглуулах давтамж нь 8000kHz, 11025KHz, 22050kHz, 44150kHz байдаг. Хамгийн өндөр давтамжтай audio бичлэг дээд зэргийн чанартай. Магадгүй та тоглоом хийгээгүй бол stereorecord -ийг хэрэглэхгүй байх. Мөн bits -ийн тоо нь дуу бичлэгийн чанарт нөлөөлдөг. Энэ нь ихэвчлэн 8 эсвэл 16 байдаг. Тэмдэглэл: Өндөр чанартай дууг бичих дискны ихэнх зайг ихээр эзэлдэг. Wave file -аа stereo -оор бичиж байхад нэг хоолойгоор бичсэн файлаас хэмжээ нь 2 дахин их болдог. 16 bits –г хэрэглэх нь wave файлаа 8 bits дээр тавьж 2 дахин бичсэнтэй адил юм. Файлаа 22050kHz хурдтай, тоон ба 8 bits per -тай бичсэн бол энэ нь 200K. Үүний адилаар 22050kHz stereo 16 bits per-р бичсэн бол 800K болно. Ихэнхдээ stereo, 16 bits per -ээр бичих нь дискны зайг ихээр эзэлдэг. 22050kHz, тоо нь 8 bits per -ээр бичих нь зүгээр
  • 173. байдаг ба дууны чадал файлын хэмжээнд тохирдог. MIDI Audio MIDI audio –гийн талаар ихийг нурших хэрэггүй байх. Үүнийг та MediePlayer -ийн FileName property –д MIDI файл гэж сонгоод Play method –ийг дуудахад болно. Ихэнх sound card нэг зэрэг 2 wave file –ийг тоглуулах боломж өгдөггүй. Үүнтэй адил нэгэн зэрэг нэгээс олон file-ийг MIDI file –д тоглуулах боломжгүй байдаг. Хэдийг ийм боловч MIDI file болон wave file 2 -ийг зэрэг тоглуулах боломжийг олгодог. Энэ нь тоглоом тоглож байхад Music Track ба Sound effect нэгэн зэрэг тоглуулж байдгийг хэлж байгаа юм. Та ингэж Wave, MiDI файлуудыг зэрэг тоглуулмаар байвал MediaPlayer -ийн компоненттэй ажиллана. Тоглуулахдаа MediaPlayer –аа MIDI файлд, PlaySound –аа wave файлд хэрэглээрэй. MIDI file ихэвчлэн тоглоомын background дуунд хэрэглэгддэг. Хэрвээ MIDI file -аа ийм байдлаар хэрэглэж байгаа бол дуу төгсгөлдөө хүрэх үед дахин эхлүүлж байгаарай. TMediaPlayer –нь ийм дууг үргэлжилснээр нь тоглуулж чаддаггүй. Ийм боловч та MideaPlayer-н OnNotify event –ийг давтах эффект болгож хэрэглээрэй. Үүний дараа OnNotify event handler –аар хангах хэрэгтэй. Энэ event handler –т амжилттай тоглож дууссаны дараа MIDI дахин эхлүүлэх кодчилол хэрэгтэй. Жишээ нь: procedure TForm1.MediaPlayerNotify(Sender: TObject); begin with MediaPlayer do if NotifyValue = nvSuccessful then begin Position := 0; Play; end; end; Энэ жишээ нь NotifyValue property -г nvSuccessfull утгатай эсэхийг шалгаж байна. Position 0 байна. Энэ нь файл дахин тоглож эхэлснээр play method дуудагдана гэсэн үг. Энэ бүгд маш энгийн байна. Хэдэн ярвигттай асуудлууд бий. Тэдгээрийн талаар мэдэж авах ёстой. Эхнийх нь Position property 0 гэж өгсөн. Энэ нь файлыг дахин эхлэлд нь эргүүлэх нөлөөтөй. Хэвээ autoRewind property true утгатай байвал энэ нь боломжгүй. Хоёр дах нь энд нилээд хэдэн MediaPlayer үйл ажиллагаа байна. түүнийг мэдэж авах . Энд OnNotify event NotifyValue нь successful утгатайгаар дуудагдаж байгаа үйлдэл юм. Жишээлбэл утга нь nvSuccesfull утгатай байвал команд дуусахаас хамааран Stop командын үүрэг гарна. CD Audio CD тоглуулах нь харьцангуй амархан. CD тоглуулахдаа Device Type property –г dtCDAudio -аар тогтоож мөн Play button дарагдахад эсвэл Play method дуудаарай. CD Audio тоглуулахын тулд CDAudio –д Different TimeFormat хэрэглэгддэгийг ойлгох хэрэгтэй. Та TMSF –ийг хэрэглэж байгаа бол (цаг, минут, секунд, фрайм) TimeFormat тодорхой мөр эсвэл current байрлалаас тодорхой мөр лүү гэсэн мэдээлэлтэй болно. Ямар нэг
  • 174. минут , секунд эсвэл фраймын утгыг мөрийн дугаар болгож тавья. Жишээнд current track дотрох playing position-г string –р зааж өгч байна.: var Time : Integer; Track : Integer; Minutes : Integer; Seconds : Integer; TimeStr : string; begin MediaPlayer.TimeFormat := tfTMSF; Time := MediaPlayer.Position; Track := mci_TMSF_Track(Time); Minutes := mci_TMSF_Minute(Time); Seconds := mci_TMSF_Second(Time); TimeStr := Format(‘Track Time: %2.2d:%2.2d’, [Minutes, Seconds]); Label1.Caption := ‘Track: ‘ + IntToStr(Track); Label2.Caption := TimeStr; end; Эхлээд TimeFormat –ийг TMSF гэж өгч байна. Дараа нь Time дуудагдаж current position -ний хэмжигдхүүн хадгалагдаж байна. Track, Minute, Second гэсэн өөр утгууд windows Time-ийн (mci_TMSF_Track ) гэсэн өөрчлөлтйиг авч байна. MM system unit –д macro -yудыг агуулагддаг. Хэрэв эдгээр макронуудыг хэрэглэвэл энэ хэсгээ та өөрийнхөө uses List -д нэмээрэй. Өөрсдийнхөө цагийн утгуудыг авч дууссаны дараа Time string мөрийн цагийг үзүүлэхээр үүсгэнэ. Тэгээд мөрийн дугаар ба мөрийн цаг Label component -д гарч ирнэ. MSF (minute,second,frames) –ийг гэсэн TimeFormat хэрэглэж байгаа CD global level авах болно. Жишээ нь MSF TimeFormat – ийг current podition –г CD –ний эхлэл гэсэн хуучин хэвд оруулахад хэрэглээрэй. Үүнтэй ижил MSF TimeFormat -ийг CD -ний current position -г CD дээрх 30 минутын хэмжээтэй мөрд гэж зааж өгч болно. Доорх жишээ нь мөрний тухайд биш яаж буцааж хуучин хэвд нь оруулан үзүүлж байгааг харуулав. CD дээрх минут ба секундийг current position : var Time : Integer; Minutes : Integer; Seconds : Integer; TimeStr : string; begin MediaPlayer.TimeFormat := tfMSF; Time := MediaPlayer.Position; Minutes := mci_MSF_Minute(Time); Seconds := mci_MSF_Second(Time); TimeStr := Format(‘Total Time: %2.2d:%2.2d’, [Minutes, Seconds]); Label3.Caption := TimeStr; end; Энэ жишээ нь СDPlayer тоглуулах програмыг агуулсан байна. Мөн
  • 175. TMediaPlayer Audio CDPlayer -ийг үүсгэхэд хэрхэн хэрэглэгдэж байгааг багтаасан байна. AVI Video TmediaPlayer -ээр AVI video тоглуулахын тулд AVI файлаа сонгоод Play method –оо дуудна. (эсвэл Play button дарна.) Хэрэв default MediaPlayer – ийн тохиргоо хэрэглэж байгаа бол тусдаа цонх нь pop up болж AVI үүндээр гарах болно. Мөн Display Property -г ямар нэг цонх төрлийн компонентийг зааж өгснөөр video тэр компонентийн мужид тоглох болно. Жишээ нь: Panel дээр AVI video -гоо тоглуулбал дараах хэлбэртэй бичнэ. MediaPlayer.Display := AVIPanel; Panel дээр AVI video тоглуулж байхад дүрс харагдах болно. Хэрэв video нь Panel -ийн тэгш өнцөгтөөс том тэр video Panel –д хайчлагдаж хэмжээг нь бүрэн гаргахгүй болгоно. Үүнийг Strech эсвэл Shrink болгож video -гоо харвал DisplayRect property -г Stretch эсвэл Shrink гэж зааж өгөөрөй. MEDIAPLAYER.DISPLAYRECT := AVIPANEL.CLIENTRECT; Үүнд AVI video –ны олон төрлийн format байна. Гэвч бүх AVI –г system дүүрэн тоглохгүй. Хэрвээ баталгаатай тоглуулахыг хүсвэл standard Microfoft AVI video type -ийг оруулаарай. Яагаад таны хэрэглэгч гарцаагүй Microsoft AVI суулгасан байна. Тайлан бэлдэх ба QuickReport, Crystal Report Тайланг маш олон хэлбэр янзаар тодорхойлж болно. Бидний зорилго бол өгөгдөлийн сангаас шаардлагатай өгөгдөлийг боловсоруулан гаргаж хэвлэж авах юм. - - TquickRep - - TpageHeaderBand - - TtitleBand - - TcolumnHeaderBand - - TdetailBand - - TsummaryBand - - TpageFooterBand TquickRep - - bands - - Dataset - - Frame - - Options - - Page - - PrinterSetings - - ReportTitle - - Unit - - Zoom Тайлан боловсоруулах хэргэсэлүүд нь өөрсдийн тогтсон бүтэц форматтай байдаг ч бүгдээрээ өгөгдөл дүрсэлж харуулах бараг ижил тогтсон дэс дарааласан групүүптэй байдаг. Харин тэдгээрийн боломж
  • 176. өгөгдөлийн сантай хэр зохицон ажиллах, ашиглах үеийн, хэргэлэгчийн орчин зэрэг хүчин зүйлүүдээр ялгаатай байдаг. Хялбар тайлан Дараах зүйлүүдээс тогтно. TquickRep бол өгөгдөлийг бүлэглэн гарагч юм. Бүлэглэх гэдэг нь: тайлан хэд хэдэн хэсгээс тогох бүрдэх бөгөөд тэдгээр дээр тайлангийн хэсэг нь орших юм. Энгийн халбар тайлан гаргахад дараах component шаардлагатай. -Ttable -Tquickrep - деталчлан харуулах хэсэг(BANDs) -QrdbText 1. Ttable –д тайланд ашиглах өгөгдөлийн санг нээх 2. Tquickrep –н Dataset –д Ttable-г зааж өгөх 3. TquickRep-н Band’s –г нээж Has Detail –г true болгох 4. TqrdbText –г Detail хэсэгт байрлуулж Dataset болон datafield-г зааж өгнө. - - TpageHeaderBand Хуудас бүрийн дээд хэсэгт харуулах зүйлийг байрлуулна. - - TtitleBand Тайлангийн гарчиг . Хэвлэгдэх зүйлийн эхэнд нэг удаа гарна.
  • 177. - - TcolumnHeaderBand Хуудас бүрийн эхэнд хэвлэгдэх зүйлийг - - TdetailBand Бичлэг бүрийг харуулах
  • 178. - - TsummaryBand Detail бүрийн талбаруудын нийлбэр олох, тооцоолох гм үйлдэл хийдэг - - TpageFooterBand
  • 179. Хуудас бүрийн дор гарах өгөгдөлийг Web Програмчлал Вэб програмчлал нь 2 үндсэн хэсэгт хуваагддаг. 1. Статик Вэб програмчлал 2. Динамик Вэб програмчлал Статик Вэб програмчлал нь үндсэн тагуудыг ашиглссан HTML (Hyper Terminal Markup language) скрипт юм. Вэб нь үндсэн(basic) HTML –ын тухайн таг эхэлсэн бол түүгийг заавал дуусгах ёстой гэсэн дүрмийг баримталдаг. Үндсэн HTML програмчлал нь 2 хэсгээс бүрддэг. 1. Толгой 2. Эх бие Толгой хэсэгт зарлалт буюу тодорхойлолтууд байдаг. Эх бие хэсэгт нь бидний нүдэнд харагдах мэдээлэл байралдаг. Толгой болон эх бие нь тогтсон бүтэцтэй байдаг. Жишээлбэл толгой нь хэсэг нь: <HTML> <HEAD> <TITLE>My First Web Page< /TITLE >
  • 180. <STYLE> …</STYLE> <SCRIPT LANGUAGE=”JAVASCRIPT”> </SCRIPT> </HEAD> байдаг бас бие хэсэг нь: <BODY> …. </BODY> </html> Статик вэб хуудасыг зарим талаар хөгжүүлж DHTML гаргасан. Энэ нь үндсэн хэсэг дээрээс хэмэгдэж Layer … гэх мэтчлэн тагууд нэмэгдсэн. Динамик вэб програмчлал нь үндсэн HTML-тэй адил боловч ялгарах онцлог нь тусгай програмчлалын хэл дээр үндэслэгдэж үүсдэгт оршно. Динмамик HTML –д дараах хэлүүд хамаарна. - - PHP - - ASP - - JSP - - CFM - - CGI зэрэг орно. Яагаа эдгээр прогамчлалын хэлийг динамик нэрлэх болсон нь сервэр дээрх скрипрт нь боловсруулагдаж хэрэглэгчдэд зөвхөн үр дүн нь очдог. Жишээлхэд JavaScript програмчлал нь хэрэглэгчдэд ил, нууцлалтгүй байдаг. Жишээлбэл PHP прогамчлалыг хэл дээрх скриптыг үзие. <? Print(‘<html><head><title>My first web page</title></head>’); $too=5; $too=$too*$too; print(‘<body>Too=$too’); print(‘</body></hrml>’); ?> Инээгд Delphi програмчлалын хэл дээр яаж Web application бичих талаар үзие. TABLE BD.1. NETMASTERS ACTIVEX INTERNET CONTROLS. Control Description TNMDayTime Obtains the date and time from Internet daytime servers. TNMEcho Sends text to and receives text from Internet echo servers. TNMFinger Obtains information about a user from an Internet finger server.
  • 181. TNMFTP Performs file transfers between networked machines using FTP (File Transfer Protocol). TNMHTTP Performs file transfers using HTTP (Hypertext Transport Protocol). Hypertext documents are normally viewed in a Web browser. You use THTTP to retrieve Web documents that don't need to be displayed in a Web browser. TNMMsg Sends simple ASCII text messages using TCP/IP. TNMMSGServ Receives messages sent with the TNMMsg control. TNMNNTP Sends messages to and receives messages from Internet news servers using NNTP (Networking News Transfer Protocol). TNMPOP3 Retrieves email messages from mail servers using POP3 (Post Office Protocol). TNMUUProcessor Encodes or decodes MIME or uuencoded files. TNMSMTP Sends email through SMTP (Simple Mail Transfer Protocol) mail servers. TNMStrm Sends data streams to a network or Internet stream server. TNMStrmServ Receives streams sent by the TNMStrm control. TNMTime Obtains the date and time from Internet time servers. TNMUDP Transfers data across networks using UDP (User Datagram Protocol). TPowersock Encapsulates the Winsock API. TNMGeneralServer Used for general TCP/IP servers. THTML Displays HTML (Hypertext Markup Language) files. This is a Web browser component. TNMURL Converts URL data to a readable string and string data to URL format. TABLE BD.2. NATIVE VCL INTERNET COMPONENTS. Component Description TClientSocket Manages a TCP/IP client socket connection. Жишээ: Web Browser 1. New Application үүсгэ 2. Panel 60 өдөртэй дээд хэсэгт байрлуулах 3. Panel дотроо combobox тавих (URL),3 button тавих 4. Statusbar тавих 5. HTML control-г Client-ээр тавих Дараа нь URL combobox –н ард
  • 182. Onclick if URLComboBox.Text <> `' then HTML.RequestDoc(URLComboBox.Text); OnKeyPress if Key = Char(VK_RETURN) then begin Key := #0; if URLComboBox.Text = '' then Exit; URLComboBoxClick(Sender); end; Progressbar гүйлгэх procedure TWebMain.HTMLUpdateRetrieval(Sender: TObject); var Total : Integer; Done : Integer; Percent : Integer; begin Total := HTML.RetrieveBytesTotal; Done := HTML.RetrieveBytesDone; if (Total = 0) or (Done = 0) then Percent := 0 else Percent := ((Done * 100) div Total); StatusBar.SimpleText := Format( `Getting Document: %d%% of %dK', [Percent, Total div 1024]); end; OnEndRetrieval StatusBar.SimpleText := `Done';