Delphi komponentlərinin yaradılması. Delphi Reference Guide - Öz Komponentlərinizi Yaradın

"Haqqında" forması məlumat məqsədləri üçün istifadə olunur. Çox vaxt proqramın adını, məqsədini, müəlliflərini və lisenziya müqaviləsini ehtiva edir. Çox vaxt o, əsas menyuda Help->Proqram haqqında... altında yerləşir.

Delphi-də (Delphi, Delphi) "Haqqında" forması yaratmaq üçün aşağıdakı şəkildəki kimi müntəzəm forma yaratmalısınız:

Delphi 7-də hər hansı forma yaratmaq üçün biz File->New->Form menyusundan aşağıdakı əmrdən istifadə edirik və daha yeni mühitdə, məsələn Delphi XE2-də layihə hazırlayarkən bir qədər fərqli əmrdən istifadə etmək lazımdır: File- >Yeni->VCL Forması - Delphi .

Formanı yaratdıqdan sonra tələb olunan ölçüləri təyin etməlisiniz və aşağıdakı parametrləri etmək tövsiyə olunur:

  • Mövqe xüsusiyyətini təyin edin. Burada defolt dəyər poDesigned-dir və bu, açılan formanın proqram yaradıldığı zaman olduğu yerdə görünməsini diktə edir. Buna görə də, onu elə qurmalısınız ki, forma çağırıldığı formaya nisbətən mərkəzdə görünsün. Bunun üçün Position xassəsini poOwnerFormCenter olaraq təyin edin.
  • Siz həmçinin sürüşdürmə çubuqlarının görünməsinin qarşısını almaq üçün AutoScroll xassəsini deaktiv edə bilərsiniz.
  • Forma qısa statik məlumatlardan ibarət olacağından, icra zamanı formanın ölçüsünü dəyişməyə ehtiyac yoxdur. Buna görə də, BorderStyle xassəsini bsSingle olaraq təyin edin.
  • Siz həmçinin BorderIcons-da iç içə xassələri konfiqurasiya etməlisiniz. BiMinimize və biMaximize xassələrini false olaraq təyin etməlisiniz ki, bu da sizə müvafiq olaraq formanı minimuma endirməyə və genişləndirməyə imkan verməyəcək.

Təsvir edilən bütün parametrlərə əlavə olaraq, formanı fonla da bəzəyə bilərsiniz. Bunu etmək üçün, Delphi 7-də yazırsanız, Əlavə sekmesinde yerləşən komponentlər palitrasından Image yerləşdirmək lazımdır. Mülkiyyətdə dərhal alClient dəyərini təyin etməlisiniz, bu, şəkil üçün konteyneri uzatacaq. bütün formaya.

Həmçinin, TLabel istifadə edərkən Şəffafı doğru olaraq təyin edə bilərsiniz. Bu seçim etiketin fonunu şəffaf edəcək, köməkçi fon istifadə olunarsa, daha gözəl görünəcək.

Nəticə

Düşünürəm ki, bu yazını burada bitirəcəyəm. Bu material Delphi proqramçılarına yeni başlayanlar və ya sadəcə proqram yazmaqla maraqlananlar üçün faydalı olacaq. Hər hansı bir çətinliklə qarşılaşsanız, şərhlərdə yazın və bacardığım qədər sizə Delphi-də “Proqram haqqında” formasından istifadə etməyə kömək edəcəm. Mən də bu forma və onun başqa formadan çağırışı ilə test layihəsini arxivə yerləşdirdim.

Komponentinizi yaratmazdan əvvəl onun üçün əcdad seçməlisiniz. Komponentinizin əcdadı kim ola bilər?

Adətən TComponent, TControl, TWinControl, TGraphicControl, TCustomXXXXXX, eləcə də komponent palitrasının bütün komponentlərinin əcdadları kimi istifadə olunur.
Məsələn, komponent palitrasının Dialoqlar səhifəsində yerləşən TOpenDialog komponentini götürək. İşini yaxşı yerinə yetirir, ancaq bir kiçik narahatlığı var. Onu hər dəfə istifadə etdikdə, hər dəfə Seçimlər xassəsinin dəyərini dəyişməlisiniz. Və, bir qayda olaraq, bunlar eyni hərəkətlərdir.
OpenDialog1.Options:= OpenDialog1.Options + ;

belə ki, bu dialoqla açmağa çalışdığımız fayl əslində diskdə mövcud olsun.
Artıq özümüz üçün bir tapşırıq seçmişik, qalan yalnız bir komponent yaratmaqdır. Menyudan Component/New Component... əmrini seçməklə və dialoq pəncərəsində seçməklə komponent üçün boşluq yaradırıq.
Ata növü: TOpenDialog
Sinif Adı: TOurOpenDialog
Palitra Səhifəsi: Testimiz
Ok düyməsini kliklədik və indi gələcək komponentimiz üçün şablonumuz var.

Bu komponent üçün konstruktoru ləğv edirik, yəni. ümumi bölmədə sətir daxil edin:

konstruktor Yarat (AOwner: TComponent); ləğv etmək;

Bu sətirə klikləməklə Ctrl + Shift + C bu metod üçün şablon yaradır, içərisinə aşağıdakı sətirləri daxil edirik:

miras qalmış Yarat (AOwner); (İrsi konstruktora zəng edin)
Seçimlər:= Seçimlər + ; (Bizə lazım olan hərəkətləri həyata keçiririk)

Diqqət edin: Ctrl + Shift + yuxarı/aşağı oxlar klaviatura qısa yolları sizə metod bəyanı və onun həyata keçirilməsi arasında keçid etməyə imkan verir.

Yaradılmış Komponent Komponenti Quraşdırılır/Komponent Quraşdırılır...
Yeni Paketə Quraşdırın
Paket faylının adı: C:Program FilesBorlandDelphi4LibOurTest.dpk
Paketin təsviri: Bizim sınaqdan keçirilmiş paketimiz

Komponentimizin standart ilə eyni işarəyə sahib olması xoşunuza gəlmirmi? Sonra onun üçün özümüzü yaradaq.
Bunun üçün Tools/Image Editor-a zəng etməliyik. Yeni *.dcr faylı yaradın.
Resurs/Yeni/Bitmap şəklini ona daxil edin. Şəklin ölçüsünü 24x24 pikselə təyin edin. Və sonra - yaradıcılığınız ...
Diqqət edin: şəklin aşağı sol küncündəki nöqtənin rənginə uyğun gələn nöqtələrin rəngi ŞƏFFAF sayılacaq!
Rəsminizi yaratdıqdan sonra onun adını Bitmap1-dən TOurOpenDialog-a dəyişdirin və faylı OurOpenDialog.dcr olaraq yadda saxlayın.
Komponenti paketdən çıxarın və yenidən quraşdırın (yalnız bu halda *.dcr faylına keçid əlavə olunacaq).
Tərtib edin, quraşdırın və uğurlar!

vahid OurOpenDialog; interfeys istifadə edir Windows, Mesajlar, SysUtils, Classes, Graphics, Controls, Formalar, Dialoqlar; növü TOurOpenDialog = sinif(TOpenDialog) özəl(Şəxsi bəyannamələr) qorunur ictimai(ictimai bəyannamələr) konstruktor Yarat (AOwner: TComponent); üstələmək; nəşr edilmişdir son; prosedur qeydiyyatdan keçin; həyata keçirilməsi prosedur qeydiyyatdan keçin; başlamaq RegisterComponents("Nümunələr", ); son; (TOurOpenDialog) konstruktor TOurOpenDialog.Create(AOwner: TComponent); başlamaq miras qalmışdır Yarat (AOwner); (İrsi konstruktora zəng edin) Seçimlər:= Seçimlər + ; (Bizə lazım olan hərəkətləri həyata keçiririk) son; son.

Komponent bəyannaməsi kimi bölmələrdən ibarətdir özəl, qorunan, ictimai və dərc edilmişdir. Onlar nə deməkdir?
Bunlar görmə direktivləridir.
Bölmədə elan edilən hər şey özəl, yalnız sinfin elan olunduğu modulun daxilində mövcuddur (özəl bəyannamələr). Burada, bir qayda olaraq, xassə dəyərlərini saxlayan dəyişənlər, habelə onlara daxil olmaq üçün üsullar (prosedurlar və ya funksiyalar) elan edilir.
Bölmədə elan edilən hər şey qorunur, şəxsi bölmədə olduğu kimi, həmçinin bu sinfin nəsilləri üçün də mövcuddur (developer interfeysi).
Burada əmlak dəyərlərinə daxil olmaq üsullarını elan edə bilərsiniz (komponentinizin uşaqlarına bu üsulları dəyişdirməyə icazə vermək istəyirsinizsə),
həmçinin TCustomXXX tipli komponentlərdə xassələri, metodları və hadisələri (hadisələrə reaksiya metodları).
Bölmədə elan edilən hər şey ictimai, komponentin hər hansı istifadəçisi üçün əlçatandır (iş vaxtı interfeysi).
Metodlar adətən burada elan edilir. Dərc olunmuş bölmədə yalnız xassələr və hadisələr elan edilə bilər (onlar xassə kimi elan edilir).
Onlar proqram dizaynı (dizayn mərhələsi interfeysi) zamanı mövcuddur.

Xüsusiyyətlər

Xüsusiyyətləri yazın massiv- müntəzəm Object Pascal massivləri, lakin sonuncudan fərqli olaraq, onlar təkcə rəqəmli qiymətlərlə deyil, həm də sətirlərlə indeksləşdirilə bilər. Təəssüf ki, bu tip mülkiyyət xüsusi mülkiyyət redaktoru tələb edir (Obyekt Müfəttişində əmlak redaktorunun üç nöqtəli düyməsi var [...]), belə ki, əmlakın altındakı nümunədə ArrayProp bölməsində elan edilmişdir ictimai.

növü TOurComponent = sinif(TComponent) özəl( Şəxsi bəyannamələr ) FArrayProp: massiv of tam; funksiyası GetArrayProp(aIndex: integer): tam; prosedur SetArrayProp(aIndex: tam ədəd; const Dəyər: tam); qorunur(Qorunan bəyannamələr) ictimai(ictimai bəyannamələr) əmlak ArrayProp: tam ədəd oxumaq GetArrayProp yaz SetArrayProp; nəşr edilmişdir(Dərc edilmiş bəyannamələr) son;

Mülkiyyət spesifikatorları

Spesifikator default xassə dəyərinin forma faylında saxlanıb saxlanmayacağını müəyyən edir. Əmlak dəyəri dəyərə uyğundursa default- forma faylındakı dəyər saxlanmır, dəyərlər bərabər deyilsə - saxlanılır. Komponenti formada yerləşdirməklə və siçanın sağ düyməsi ilə "Mətn kimi bax" menyu elementini seçməklə bunu yoxlaya bilərsiniz. Defoltəmlakın ilkin dəyərini göstərilənə təyin etmir. Bu komponentin konstruktorunda edilməlidir.

vahid Bizim Komponent; interfeys istifadə edir Windows, SysUtils, Classes, Graphics, Formalar, Controls; növü TOurComponent = sinif(TComponent) özəl( Şəxsi bəyannamələr ) FMyInteger: Tam ədəd; qorunur(Qorunan bəyannamələr) ictimai(ictimai bəyannamələr) konstruktor Yarat (AOwner: TComponent); üstələmək; nəşr edilmişdir(Dərc edilmiş bəyannamələr) əmlak MyInteger: Tam ədəd oxumaq FMyInteger yaz FMyInteger default 10; son; həyata keçirilməsi konstruktor TOurComponent.Create(AOwner: TComponent); başlamaq miras qalmışdır Yarat (AOwner); Fİnteger:= 10; son; son.

Spesifikator defolt standart xüsusiyyət dəyərini ləğv edir. Bu spesifikator adətən miras alınmış əmlakın standart dəyərini ləğv etmək üçün istifadə olunur.
Misal üçün: əmlak Avtomatik Ölçü defolt;

Spesifikator saxlanılır forma faylında xassə dəyərinin nə vaxt saxlanacağını müəyyənləşdirir. sonra saxlanılır dayana bilir doğru(həmişə saxla) yalan(heç vaxt saxlamayın) və ya Boolean nəticəsini qaytaran funksiyanın adı.

əmlak OneProp: tam ədəd oxumaq FoneProp yaz SetOneProp saxlanılır yalan; əmlak TwoProp: tam ədəd oxumaq FTwoProp yaz SetTwoProp saxlanılır Doğru; əmlak ThreeProp: tam ədəd oxumaq FThreeProp yaz SetThreeProp saxlanılır Fuct;

Və son şey:
Komponentlər panelində nümayiş üçün komponentə şəkil əlavə etmək üçün sizə lazımdır: - onu 24*24 ölçüsündə faylın adı.dcr ilə yaratmaq (resursda şəklin adı onun adına bərabərdir) komponent, böyük hərflərlə)
- şəkli komponentin yanında yerləşdirin.

Ətraf mühitdə Delfi bir proqramçı layihə ilə işləyir - hansı faylların toplusu Delfi proqram yaradır. Bir layihə bir tətbiqə uyğun gəlir. Bir sıra layihə faylları Delfi avtomatik yaradır və dəyişdirir. Proqramçı layihəyə öz fayllarını əlavə edə bilər ( Paskal- modullar, qrafik fayllar, DLL– kitabxanalar, komponent kitabxanaları, resurslar və s.).

Layihədə aşağıdakı elementlər olmalıdır:

· .DPR uzantılı əsas layihə faylı ( D elfi PR obyekt). Layihədə bu uzantıya malik yalnız bir fayl ola bilər. Bu dildə kiçik mətn faylıdır Obyekt Paskal, layihənin bütün formalarına istinadları ehtiva edən və tətbiqi işə salan;

· bütün layihə formalarının faylları. Hər bir forma üçün eyni adlı bir cüt fayl yaradılır - fayl Paskal-adi uzantısı olan modul .PAS və .DFM ( uzantısı olan forma resurs faylı D elfi F və ya M ). Layihənin istənilən forması həmişə öz modul-resurs fayl cütlüyünə malik olmalıdır. Bunun əksi lazım deyil, yəni. layihəyə proqramın hər hansı forması ilə bağlı olmayan modullar və resurs faylları daxil ola bilər;

· proqram resurs faylı (*.RES). O, formalara daxil olmayan proqram resurslarını ehtiva edir;

layihə variantları faylı (*.DOF – D elfi O seçimlər F ile). Bu fayl proqramın işə salınması üçün tərtibçi direktivləri və seçimlərinin dəyərlərini, əlaqələndirici parametrlərini, işçi qovluqların adlarını və əmr xətti parametrlərini saxlayır.

Nümunə proqram

Növbəti layihə üzərində işə başlamazdan əvvəl, ilk növbədə, gələcək layihənin faylları üçün ayrıca bir qovluq (kataloq) yaratmalısınız. Bu qaydaya həmişə riayət edilməlidir, əks halda çox keçmədən müxtəlif layihələrin faylları bir kataloqda o qədər “qarışacaq” ki, onları layihə üzrə çeşidləmək olduqca çətin olacaq. Gələcəkdə belə bir qovluğun yaradıldığını güman edəcəyik, onu çağıraq PO_EVM, bu, cari layihə qovluğu olacaq.

başlayaq Delfi. Yükləmə uğurlu olarsa, monitor ekranında Şəkil 1-də nə göstərildiyini görəcəyik. Əsas pəncərənin başlıq çubuğunda Delfi yazısı var Delphi 3 - Layihə 1. Layihə və proqramımızın adı belədir. Ərizə forması pəncərəsinin başlıq çubuğu deyir Forma 1. düyməsini sıxsanız F12 və ya düyməni basın Dəyişdirin
Forma/vahid
(sürətli giriş alətlər paneli) və ya menyu elementini seçin Forma / Vahid Baxın/Değiştirin, sonra kod redaktoru pəncərəsi ön plana keçəcək və biz səhifənin məzmununu görəcəyik Vahid 1 təqdim edən redaktor Paskal- modul kodu Vahid 1. Kod redaktoru pəncərəsinə layihənin əsas proqramının kodunu ehtiva edən başqa bir səhifə əlavə edək. Bunu etmək üçün menyu elementini seçin Baxış/Layihə Mənbəyi. Aşağıda kod redaktorunun iki səhifəsinin məzmunu verilmişdir: müvafiq olaraq əsas proqramın Paskal kodu və layihənin əsas formasının modulunun Paskal kodu.

Layihə fayllarını yaradılmış kataloqda saxlayın PO_EVM. Bunu etmək üçün düyməni basın Hamısını saxla sürətli giriş panelində seçin və ya menyu elementini seçin Layihəni Fayl/Saxla.... Ortaya çıxan standartda Windows- fayl saxlama pəncərəsində qovluğu seçin PO_EVM və ardıcıl olaraq yadda saxlayın Paskal-forma modul kodu və Paskal-adlandırılmış fayllardakı proqram kodu IDE_Un1.pasIDE_Pr.dpr müvafiq olaraq.

proqram IDE_Pr;

IDE_Un1 ‘IDE_Un1.pas’ (Form1);

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

vahid IDE_Un1;

Windows, Mesajlar, SysUtils,

siniflər, Qrafika, İdarəetmə,

TForm1 = sinif (TForm)

(Şəxsi bəyannamələr)

(İctimai bəyannamələr)

İndi qovluğun məzmununa baxsanız PO_EVM, onda aşağıdakı layihə fayllarını ehtiva edəcək: IDE_Pr.dof– layihə variantları faylı; IDE_Pr.dpr– əsas layihə faylı; IDE_Pr.res– layihə resurs faylı; IDE_Un1.pas– Forma modulu üçün Paskal kod faylı; IDE_Un1.dfm– forma resurs faylı.

Bəzi standart mühit parametrlərini dəyişdirmək məqsədəuyğundur, xüsusən də proqramın tərtib edilməsi və əlaqələndirilməsi prosesi ekranda görünsün, həmçinin proqramın icrası üçün hər işə başlamazdan əvvəl bütün dəyişdirilmiş layihə faylları avtomatik olaraq saxlansın. Bu, dialoq qutusunda edilə bilər Ətraf Mühit Seçimləri..., menyudan çağırıla bilər Alətlər/Ətraf Mühit Seçimləri…. Səhifədə Üstünlüklər Fəsildə Masaüstü məzmunu açarı vəziyyətinə qoyun Yalnız masaüstü, Fəsildə Avtomatik saxlama seçimləri nöqtələrdə açarları quraşdırın Redaktor fayllarıİş masası, və bölməsində Tərtib etmək və icra etmək keçid quraşdırın Kompilyator tərəqqisini göstərin .

Ən sadə proqram Delfi artıq icraya hazırdır. Düyməni basaraq Qaç Tez Giriş Alətlər Panelində və ya düyməsində F9, proqramın tərtibi və əlaqələndirilməsi proseslərini müşahidə edə bilərsiniz, bundan sonra proqramımız icra olunmağa başlayacaq. Vizual olaraq, proqram ekranda standart ilə boş bir pəncərə kimi təqdim olunur Windows- proqram simvolu, formanın adı və üç pəncərə idarəetmə düyməsi olan başlıq çubuğu. Proqramdan çıxın və ətraf mühitə qayıdın Delfiüçün standart olaraq həyata keçirilir Windows yol - düymələrin birləşməsi Alt-F4 və ya tətbiqi bağla düyməsini klikləməklə. İndi layihə faylları qovluğunun məzmununa baxırsınızsa PO_EVM, onda siz orada daha iki faylın göründüyünü görə bilərsiniz: IDE_Un1.dcu və IDE_Pr.exe - tərtib edilmiş forma modul faylı və yükləmə (icra edilə bilən) proqram faylı. IDE_Pr.exe faylı avtonom şəkildə icra edilə bilər, yəni. ətraf mühitdən kənarda Delfi. Ətraf mühiti tərk etdikdən sonra Delfi, qovluqda başqa bir fayl yaradılır IDE_Pr.dsk– fərdi istifadəçi mühiti parametrləri olan fayl.

Proqram yaradan proqramçının təxmini hərəkət ardıcıllığını verək” Kalkulyator +/-“. Bu proqram, belə demək mümkünsə, həqiqi ədədlər üzərində toplama və çıxma əməliyyatlarını yerinə yetirmək üçün nəzərdə tutulmuşdur. Başladıqda proqram pəncərəsi (forma) şəkildəki kimi görünməlidir. 7.

Forma üç giriş/çıxış xəttini ehtiva edir (növün komponentləri TEdit) iki operand daxil etmək və nəticəni çıxarmaq; beş düymə (dörd komponent növü TB düyməsi və bir - TBitBtn) – sıfırlama, əməliyyatın növü və nəticəsinin göstərilməsi ( C, + , , = ), proqramdan çıxmaq (Bağlamaq); operandları və nəticəni göstərmək üçün üç etiket (tip komponentləri TLabel); Hesablama nəticəsinin çıxış sahəsini vurğulamaq üçün ayırıcı interfeys elementi (komponent TVBevel).

İlkin vəziyyətdə, buraxıldıqdan sonra Delfi və göstərilən adlarla iki layihə faylını saxlayaraq, boş formamız var. Sonra, tətbiqin interfeys hissəsinin qurulması qaydası belə idi (hərəkətlərinizin nəticələri Şəkil 7-də komponentlərin yeri ilə müqayisə edilə bilər):

1. Forma mülkiyyəti Başlıq obyekt müfəttişində biz dəyərdən dəyişirik Forma 1 sətir dəyərinə Kalkulyator +/-. Formanın başlıq sətrində forma adının dəyərindəki dəyişiklik dərhal nəzərə çarpır;

2. Səhifədə Standart Komponent palitrası komponent şəklinə sol klikləyin Etiket, sonra siçan göstəricisini formanın yuxarı sol küncünə aparın və ora sol klikləyin. Komponentin şəkli formada bu yerdə görünəcək. Etiket yazısı ilə Etiket1. Komponent şəkli perimetr ətrafında altı qara kvadratla vurğulanır - ölçü markerləri (ölçü markerləri). Markerlərlə vurğulamaq bu komponentin hazırda aktiv olduğunu bildirir. Standart siçan istifadə edərək Windows- Texnikalardan istifadə edərək, komponentin ölçüsünü dəyişdirə və onu forma ətrafında hərəkət etdirə bilərsiniz. Başqa bir forma komponentini aktivləşdirmək üçün siçanın sol düyməsi ilə üzərinə klikləmək kifayətdir. Obyekt Müfəttişi nişanlarının məzmunu həmişə aktiv komponentə uyğun gəlir, başqa bir komponent aktivləşdirildikdə, Obyekt Müfəttişi sahələrinin tərkibi avtomatik olaraq dəyişir. Mülkiyyəti dəyişdirək Başlıq komponent Etiket mənadan Etiket1 dəyərinə 1-ci operand. Bu komponentin Name xassəsinə qiymət verək funt_1 .

3. Eyni şəkildə davam edərək, biz ikinci etiket komponentini birincidən bir qədər aşağı yerləşdirəcəyik və xassələri müvafiq olaraq təyin edəcəyik Başlıqad dəyərlər 2-ci operandfunt_2 .

4. Eyni səhifədə Standart Komponent palitrası komponenti seçin Redaktə et(redaktə sətri) və onu birinci etiketin sağındakı formada yerləşdirin. Əmlak ad dəyər təyin edin ed_1, və əmlak Mətn Gəlin onu boş edək.

5. Eyni şəkildə davam edərək, ikinci redaktə xəttini ikinci etiketin sağında yerləşdirəcəyik və xassələri müvafiq olaraq təyin edəcəyik. Mətnad boş sətir dəyərləri və ed_2 .

6. Komponent palitrasının Əlavə səhifəsində Bevel komponentini seçin və onu elə yerləşdirin ki, o, ikinci etiketin və ikinci giriş xəttinin altındakı “nəticə” xəttini təmsil etsin. Əmlak ad, bərabərdir Eğim1, biz dəyişməyəcəyik.

7. Komponentin altında Eğik Hesablamaların nəticəsini göstərmək üçün başqa bir cüt “etiket – giriş xətti” yerləşdirək. Xüsusiyyətlər ad dəyərlər təyin edək funt_3ed_3, əmlak lb_3.Baş yazı- məna Nəticə, və əmlak Mətn komponent ed_3– boş sətirin dəyəri.

8. Cari arifmetik əməliyyatı təsvir etmək üçün başqa bir etiket yerləşdirək: (?, +, –) - əməliyyat müəyyən edilməyib, toplama əməliyyatı, çıxma əməliyyatı. Bu etiketi operandların daxil edilməsi üçün komponentlərin sol sərhədlərinə yaxın, ilk iki etiket arasında yerləşdirək (bax. Şəkil 7). Əmlak ad dəyər təyin edin lb_oper, və əmlak Başlıq- məna ? . Gəlin həm də alt xassəni təyin edək Ölçüəmlakda Şrift bu etiket üçün bərabərdir 14 ;

9. Komponentləri uyğunlaşdıraq. Standart Windows- Bu üsuldan istifadə edərək komponentləri - etiketləri seçirik. Bunu etmək üçün düyməni basıb saxlayın Shift, etiket komponentlərində ardıcıl olaraq sol siçan düyməsini sıxmaqla biz hər üç etiketi eyni vaxtda aktivləşdiririk. İndi sağ klikləsəniz, qanunlara uyğun olaraq Windows 95 Kontekst menyusu görünməlidir - və görünür. Elementi seçək Bir lign...(düzləşdirmə). İndi ekranda bir pəncərə görürük Hizalanma. Paneldə seçin üfüqi paraqraf Sol tərəflər və düyməni basın Tamam. Nəticədə, hər üç etiket komponenti ən sol komponentin sol kənarına uyğunlaşdırılacaq. Bənzər hərəkətlərdən istifadə edərək, hər üç redaktə xəttini hizalayacağıq. Redaktə sətirləri eyni zamanda üçünün hamısını seçmək və kontekst menyusunda elementi seçməklə ölçüyə uyğunlaşdırıla bilər. Ölçü…. Komponentlərin ölçüsünün dəyişdirilməsi və hərəkət etdirilməsinin "zərif" işi adətən siçan ilə deyil, müvafiq olaraq shift düymələri basılarkən kursor düymələri ilə həyata keçirilir. ShiftCtrl. Bu hərəkətlər yalnız bir komponentlə deyil, həm də seçilmiş komponentlər qrupu ilə həyata keçirilə bilər.

10. İndi formada idarəetmə düymələrini yerləşdirək. Onlardan beşimiz var (bax. Şəkil 7). İlk dörd düymə sıfırlama düyməsi, əməliyyat düymələri (əlavə (+) və çıxma (–)) və nəticə düyməsidir. Beşinci düymə proqramı bitirmək üçün düymədir. Səhifədə Standart Komponent palitrası, Button komponentini seçin və onu ilk redaktə sətirinin sağına qoyun. Xüsusiyyətlər Başlıqad müvafiq olaraq düymələrin dəyərlərini təyin edin Cbtn_Clear. Eynilə, digər üç düyməni formada yerləşdiririk, çağırırıq (mülk ad) onların btn_sum,btn_subbtn_rez, adları ilə (əmlak Başlıq) + ,= (şək. 7-ə baxın). Qrupdakı düymələri seçdikdən sonra mürəkkəb xüsusiyyətə iki dəfə klikləyin Şrift Obyekt müfəttişində. Sahədə Ölçü xassələri Şriftşrift ölçüsünü təyin edin 14 xal. Bu dəyəri təyin etdikdən sonra düymələrdəki simvolların ölçüsü artacaq.

11. Beşinci düymə – proqramı bitirmə düyməsi – səhifədən seçilir Əlavə. Bu, bu səhifədəki ilk komponentdir - kimi bir düymə BitBtn(yazı və işarəsi olan əmr düyməsi). Düyməni Şəkil 7-də göstərildiyi kimi yerləşdirdikdən sonra əmlak dəyərləri siyahısından seçin mehriban məna bkClose. Bu seçim düymənin vizual atributlarını və funksionallığını tamamilə müəyyən edir.

12. Proqramın interfeys hissəsinin qurulması prosesini yekunlaşdırmaq üçün şəkli 7-də göstərilən ölçülərə qədər azaldacağıq.

Bununla, tətbiqin yaradılmasının birinci mərhələsi başa çatır - interfeysin qurulması. Qeyd etmək lazımdır ki, interfeysin qurulmasının istənilən mərhələsində siz istənilən vaxt proqramı icra etmək üçün işə sala bilərsiniz. Yuxarıda təsvir olunan addımların yerinə yetirilməsi prosesində biz bir sətir və ya bircə Paskal operatoru yazmadıq. Ərizə formasının modul mətnindəki bütün qeydlər Delfiözü edir. Bu nöqtədə, forma modulunun interfeys hissəsində dəyişikliklər baş verdi - formada yerləşdirdiyimiz komponentlərin təsvirləri və standart modullar əlavə edildi. Delfi Düymələr, StdCtrls, ExtCtrls.

Windows, Mesajlar, SysUtils, Siniflər,

Qrafika, İdarəetmə elementləri, Formalar, Dialoqlar,

Düymələr, StdCtrls, ExtCtrls;

TForm1 = sinif (TForm)

lb_Oper: TLabel;

btn_Clear: TB düyməsi;

btn_sum: TB düyməsi;

btn_sub: TB düyməsi;

btn_rez: TB düyməsi;

bb_Close: TBitBtn;

İndi proqramımızı konkret məzmunla doldurmağın vaxtı gəldi, yəni. çıxış xəttinə daxil edilmiş nəticə ilə iki operandın toplama və çıxma əməliyyatlarını proqramda həyata keçirmək. Proqram istifadəçinin proqramı işə saldıqdan sonra başlaya biləcəyi çox konkret hadisələrə cavab verməlidir. Proqrama aşağıdakı hadisələrə cavab verməyi öyrədəcəyik: komanda interfeysi düymələrinə kliklər (bizdə onlardan beşi var) və səhv daxil edilmiş operand dəyərləri (operandlar yalnız rəqəmlər olmalıdır) halında istifadəçiyə məlumat verin. Etəcəyimiz hər şey çağırılır hadisə idarəedici kodunun yazılması.

Əvvəlcə, bu və ya digər düyməyə basıldıqda nə baş verməli, hansı hallarda və hansı məzmunlu mesajların ekranda görünməli olduğunu şifahi olaraq müəyyən edək:

1. “Sil” düyməsini klikləyin ( İLƏ) - hər üç redaktə xəttini silin və sual işarəsini göstərin ( ?) ;

2. “Qatla” düyməsini ( + ) - əməliyyat işarəsinin şəklini artı işarəsinə (+) dəyişdirin;

3. “Çıxar” düyməsini klikləyin ( ) - əməliyyat işarəsinin şəklini mənfi işarəyə dəyişdirin (–);

4. “Hesabla” düyməsini klikləyin ( = ) - redaktənin ilk iki sətirində məlumatların düzgünlüyünü yoxlayın. Əgər verilənlər düzgündürsə (rəqəmlər), onda müvafiq hesab əməliyyatını yerinə yetirin və nəticəni çıxış sətirində göstərin. Mənbə məlumatında bir səhv aşkar edilərsə, səhvin yerini göstərən bu barədə bir mesaj göstərilməlidir.

İndi yuxarıdakı nöqtələrin hər birini Paskal koduna tərcümə edək (tərcümə edək). Hər bir komponentdə hadisələrin siyahısı var (siyahı ikinci səhifədə verilir ( Hadisələr) obyekt müfəttişi) reaksiya verə biləcəyi (işləyə biləcəyi). Bizim vəzifəmiz müəyyən bir hadisə baş verdikdə yerinə yetiriləcək kodu yazmaqdır. Düymələr üçün Delfi bir neçə hadisə idarəedicisi müəyyən edilmişdir, biz “Düymə üzərində bir klik” hadisə idarəedicisi ilə maraqlanacağıq (siçan göstəricisi komponentin üzərində olarkən sol siçan düyməsini sıxmaq) Düymə). Bu işləyici adlanır OnClick. Hər bir hadisə idarəedicisi ayrıca prosedur kimi formatlanır. Bu prosedurun adını mühitin özü formalaşdırır. Delfi.

Gəlin “Sil” düyməsinə bir klik üçün hadisə idarəedicisi yazaq. Bunu etmək üçün formada "Sil" düyməsini seçin ( İLƏ). Səhifənin aktivləşdirilməsi Hadisələr Obyekt müfəttişi pəncərəsində. Yazının yanındakı sağ sütundakı boş sahəyə iki dəfə klikləyin OnClick. Ondan sonra Delfi avtomatik olaraq kod redaktoru pəncərəsini göstərir IDE_Un1 və TForm1.btn_ClearClick proseduruna mətn daxil etmək üçün mətn kursorunu yerləşdirir:

prosedur TForm1.btn_ClearClick(Sender: TObject);

sanki bizi bu yerdən yazmağa dəvət edir Paskal-bu prosedurun kodu. Ətraf mühitin yaratdığı prosedurun adına diqqət yetirin Delfi. O, komponentin (düymənin) yerləşdiyi formanın adından, bu komponentin adından (btn_Clear) və hadisə idarəedicisinin adından ibarətdir – Click. Şifahi alqoritmimizin birinci bəndinin məzmunundan sonra prosedurun gövdəsinə aşağıdakı sətirləri daxil edirik. Paskal-kod:

lb_Oper.Caption:=’?’; (əməliyyat növü müəyyən edilməmişdir (etiket – ?))

ed_1.Mətn:=”; (birinci operanda daxil olmaq üçün xətti təmizləyin)

ed_2.Mətn:=”; (ikinci operanda daxil olmaq üçün xətti təmizləyin)

ed_3.Mətn:=”; (nəticəni göstərmək üçün xətti təmizləyin)

Oxşar şəkildə davam edərək, biz “Qətlə” interfeys düymələri üçün “Komponentə bir dəfə sol klik” hadisəsi üçün hadisə idarəçiləri yaradacağıq ( + ) və "Çıxar" ( ):

– “Əlavə et” düyməsi üçün kod xətti lb_Oper.Caption:=’+’;

– “Çıxar” düyməsi üçün kod sətri lb_Oper.Caption:=’-‘;

Hadisə idarəedicisi OnClick"Hesabla" düyməsi üçün ( = ) aşağıdakıları ehtiva edir Paskal-kod:

prosedur TForm1.btn_rezClick(Sender: TObject);

Val(ed_1.Text,r1,i);

Əgər mən<>0 sonra başlayın

ShowMessage('Birinci operandda xəta');

Val(ed_2.Text,r2,i);

Əgər mən<>0 sonra başlayın

ShowMessage('İkinci operandda xəta');

case lb_oper.Caption of

‘+’ : ed_3.Text:=FloatToStr(r1+r2);

‘-‘ : ed_3.Text:=FloatToStr(r1-r2);

else ShowMessage('Əməliyyat növü müəyyən edilməmişdir');

TForm1.btn_rezClick hadisə idarəedicisində iki operandın ədədi dəyərlərini və istifadə üçün i tam dəyişənini saxlamaq üçün iki yerli real dəyişən r1 və r2 təqdim edilir. Paskal-prosedur Val sətir dəyişənini rəqəmsal təsvirə çevirmək üçün. Bu işləyici proqramın verbal alqoritminin dördüncü bəndini həyata keçirir. Əvvəlcə istifadəçinin daxil etdiyi sətir və birinci operandın simvollarının düzgünlüyü yoxlanılır. Əgər bu rəqəm deyilsə, onda ShowMessage proseduru vəziyyətə uyğun mesajı göstərir və Exit proseduru prosedur kodunun icrasını bitirir. Məlumat düzgündürsə, r1 dəyişəni birinci operandın ədədi qiymətini alacaq. İkinci operand oxşar şəkildə yoxlanılır və əgər burada hər şey normaldırsa, onda r2 dəyişəni ikinci operandın ədədi qiymətini alacaq.

Case operatoru hansı simvoldan asılı olaraq r1 və r2 dəyişənləri üzərində arifmetik əməliyyat həyata keçirir ( + , , ? ) lb_oper etiketinin Caption xassəsinin qiymətini təyin edir. Arifmetik əməliyyatın işarəsi müəyyən edilmədikdə (bizim üçün bu simvoldur ? ), sonra müvafiq mesaj verilir və əməliyyat yerinə yetirilmir.

Qeyd edək ki, qaydalara görə gözlənildiyi kimi Paskal, mühit tərəfindən avtomatik olaraq forma modulunun interfeys hissəsinə Delfi prosedur başlıqları əlavə edildi - düymələrə basma hadisəsi idarəediciləri:

prosedur btn_sumClick(Sender: TObject);

prosedur btn_ClearClick(Sender: TObject);

prosedur btn_subClick(Göndərən: TObject);

prosedur btn_rezClick(Sender: TObject);

Bununla biz həqiqi ədədlərin toplanması və çıxılması əməliyyatlarını yerinə yetirən sadə kalkulyatorun yaradılması tapşırığının proqram təminatının icrasını başa çatdıra bilərik. Onu da qeyd edirik ki, tətbiqimiz səhv mənbə məlumatları üzərində əməliyyatlarla bağlı xətalardan 99% qorunur (niyə 100% olmasın?).

Alt proqramlar - xüsusi əməliyyatları yerinə yetirmək üçün Delfi dilində prosedur və funksiyalardan istifadə olunur. Delphi-də bir çox standart iş rejimi var, lakin siz dəyişə biləcək məlumatlar üzərində tez-tez təkrarlanan əməliyyatları yerinə yetirmək üçün hələ də özünüz yaratmalısınız.

Ümumiyyətlə, var proqramlaşdırma texnikası"yuxarıdan aşağı". Proqramlaşdırma Metodologiyası“Yuxarıdan aşağıya” tapşırığı alt proqramlar şəklində yazılmış bir neçə sadə tapşırığa bölür. Bunlar da öz növbəsində, lazım gələrsə, proqramçının qarşısında duran problemlər məqbul mürəkkəblik səviyyəsinə (yəni sadəlik!) çatana qədər bölünür. Belə ki, bu proqramlaşdırma texnikası sonradan xüsusi alqoritmlərlə doldurulan alt proqram deskriptorlarından ibarət sözdə skelet yaratmaqla proqramların yazılmasını asanlaşdırır. Boş alt proqram təsviri başqa cür "stub" adlanır.

prosedurlar, Və funksiyaları eyni nəticələr əldə etməyə imkan verir. Amma yenə də fərq var.

Delphi proseduru sadəcə olaraq tələb olunan əməliyyatları yerinə yetirir, lakin öz hərəkətlərindən heç bir nəticə qaytarmır. Nəticə bu prosedurun icrası zamanı proqramda baş verən dəyişikliklərdir. Xüsusilə, prosedur dəyişənlərin dəyərlərini dəyişdirə, komponent hüceyrələrinə yeni dəyərlər yaza, fayla yaza və s.

Delphi funksiyası həmçinin yuxarıda göstərilənlərin hamısını etməyə imkan verir, lakin əlavə olaraq təyin edilmiş nəticəni qaytarır özünə məna. Yəni funksiya çağırışı edə bilər ifadədə iştirak etmək təyin operatorunun sağında. Beləliklə, funksiya daha çox yönlü bir obyektdir!

Alt proqramın təsviri açar sözdən ibarətdir prosedur və ya funksiyası, ardınca mötərizə içərisində parametrlərin siyahısı ilə rejimin adı. Nə vaxt funksiyaları ardınca iki nöqtə və qaytarılan dəyər növü. Aşağıda adi nöqtəli vergül tələb olunur! Alt proqram kodunun özü "məntiqi mötərizə" içərisindədir başlamaq/bitmək. Funksiya üçün siz onu kodda funksiyanın adı olan dəyişənə və ya xüsusi qorunan dəyişənə təyin etməlisiniz. Nəticə(tercihen) funksiyanın qaytarılan dəyəri. Nümunələr:


Bu şəkildə təsvir edilmiş alt proqram ilk çağırışdan əvvəl əsas proqrama yerləşdirilməlidir. Əks halda, tərtib zamanı sizə “naməlum identifikator...” bildirişi alacaqsınız ki, bunu izləmək həmişə əlverişli deyil. Çıxış yolu var - bütün proqram məlumatlarının təsvirlərinin yerləşdirildiyi yalnız alt proqram başlığını yerləşdirin.

Parametrlər identifikatorların vergüllə ayrılmış siyahısı, ardınca iki nöqtə və növdür. Müxtəlif növ identifikatorların bir neçə siyahısı varsa, onlar nöqtəli vergüllə ayrılır. Hər şey adi məlumat təsviri vəziyyətində olduğu kimidir. Bunlar sözdə olanlardır formal seçimlər. Bir alt proqram çağırarkən, onlar ilə əvəz olunur faktiki- rəsmi olanlarla eyni tipli vergüllə ayrılmış məlumatlar.
Alt proqramın təsvirindəki parametrlər olmaya bilər, sonra birbaşa əsas proqramdan verilənlərlə işləyir.

İndi biz yerli məlumat anlayışını təqdim etməliyik. Bu verilənlərdir - dəyişənlər, sabitlər, istifadə olunan və yalnız bu alt proqramın çağırılması zamanı mövcud olan alt proqramlar. Onlar da bu alt proqramda təsvir edilməlidir. Onların təsvir yeri başlıq və məntiqi blokun başlanğıcı arasındadır - açar söz başlamaq. Adlar yerli məlumatlar adlara uyğun ola bilər qlobal. Bu halda, yerli dəyişən istifadə olunur və onu dəyişdirir təsir etməyəcək eyni adlı qlobal birində.
Yerli tiplər, dəyişənlər və sabitlər kimi, lokal prosedurlar və funksiyalar təqdim edilə bilər ki, bunlar da yalnız verilmiş alt proqram daxilində təsvir oluna və istifadə edilə bilər.

İndi bir nümunə. İki ədədi cəmləmək üçün proqram yazaq. Bu, bir düymənin (komponent Düymə), alt proqramımızın icra ediləcəyi üzərinə klikləməklə və iki giriş xətti (komponentlər) Redaktə et), operandları daxil edəcəyik. Gəlin başlayaq prosedurdan.

var
Form1: TForm1;
A, B, Cəmi: Tam ədəd;
prosedur Cəm (A, B: Tam ədəd);

həyata keçirilməsi

($R *.dfm)

prosedur
başlamaq
A:=StrToInt(Edit1.Text);
B:=StrToInt(Edit2.Text);
Cəmi (A, B);
Başlıq:=IntToStr(Cəmi);
son;

prosedur Cəm (A, B: Tam ədəd);
başlamaq
Cəmi:=A+B;
son;

Prosedurumuz çağırılan düyməyə klik işləyicisindən sonra yerləşir. Prosedur başlığı verilənlərin təsviri blokuna daxil edildiyi üçün proqram dəqiq işləyir. Ancaq yenə də bu vəziyyətdə toplama əməliyyatı bir şəkildə qeyri-müəyyən şəkildə həyata keçirilir.
İndi də eyni şeyi edək funksiyaları.

var
Form1: TForm1;
A, B, Cəmi: Tam ədəd;
funksiyası

həyata keçirilməsi

($R *.dfm)

prosedur TForm1.Button1Click(Göndərən: TObject);
başlamaq
A:=StrToInt(Edit1.Text);
B:=StrToInt(Edit2.Text);
Cəm:=Cəm(A, B); // Məncə, indi hər şeyin haradan gəldiyi daha aydın görünür
Başlıq:=IntToStr(Cəmi);
son;

funksiyası Sum(A, B: Tam ədəd): Tam ədəd;
başlamaq
Nəticə:=A+B;
son;

Böyük verilənlər strukturlarının parametrlər kimi istifadəsinin xüsusiyyətləri var, məsələn, bir neçə min (və ya daha çox) elementdən ibarət massivlər. Böyük həcmdə verilənləri alt proqrama köçürərkən, sistem resurslarının və vaxtın böyük xərci ola bilər. Buna görə də, dəyərlərin özündən başqa elementlərin ötürülməsindən istifadə olunur (transfer "dəyərinə görə", əvvəlki nümunələrdə olduğu kimi) və dəyişənin və ya sabitin adına istinadlar (keçir "adı ilə"). Bu, adla keçmək istədiyimiz parametrlərdən əvvəl açar söz daxil etməklə əldə edilir var.

funksiyası Cəm(A, B: Tam ədəd; var Arr: massiv of Integer): Tam ədəd;

Delphi tərəfindən yaradılmış alt proqramımızın təsvirinə və düyməni basma işləyicisinin təsvirinə (bu da alt proqramdır!) nəzər salsaq görərik ki, işləyicinin (Button1Click) adından əvvəl TForm1. Bildiyimiz kimi, Delphi-də nöqtə obyekti və onun atributlarını (xüsusiyyətləri və metodları) ayırır. Beləliklə, Delphi Form1 obyektində metod kimi Button1Click yaradır. Üstəlik, məktub T obyekt Button1Click-in sadəcə obyektin metodu deyil, obyektin sinifinin metodu olduğunu göstərir. Hələlik bununla məşğul olmayaq, amma biz də eyni şeyi edəcəyik. Prosedurumuzu və ya funksiyamızı TForm1 sinfinin metodu kimi təsvir etməklə, biz onun içindəki sinif obyektlərindən onun adını göstərmədən istifadə etmək imkanı əldə edirik ki, bu da daha əlverişlidir. Yəni, əgər biz alt proqramımızda Formada yerləşdirilmiş hər hansı komponentlərdən istifadə etsək (məsələn, Button1), onda yazırıq.

Button1.Width:=100; //Düymə eni
amma yox
Form1.Button1.En:=100;

Həmçinin Sender parametri kimi daxili dəyişənlərdən istifadə etmək mümkün olur. Hər bir işləyicidə bu obyekt mənbəyə, yəni verilmiş rutini çağıran obyektə işarə edir. Məsələn, bizim toplama prosedurumuzda Göndərən = Düymə1. Bu dəyişəni təhlil etdikdən sonra müəyyən hərəkətlərə qərar verə bilərsiniz.

Alt proqramı sinif metodu kimi təsvir etdikdən sonra biz onun təsvirini Delphi-nin onları yerləşdirdiyi yerdə - TForm1 sinfinin təsvirində yerləşdirməliyik. Button1Click prosedurunun təsvirinin harada yerləşdiyinə özünüz baxın. Bunun üçün, Button1Click rutininin içərisində kursorla klikləyin CTRL+Shift və kursor idarəetmə düyməsi " Yuxarı"və ya" Aşağı" eyni vaxtda. Alt proqramın təsvirinə keçid olacaq (geri qayıtmaq üçün bu hərəkəti yenidən təkrarlayın). Alt proqramınızın təsvirini onun yanında, yeni sətirdə yerləşdirin. Nəzərə alın ki, TForm1 artıq yazılmır.

Rekursiya- vacib və güclü prosedurların və funksiyaların mülkiyyəti Delphidə. Rekursiya Bu, əməliyyat zamanı alt proqramın özünə istinad etmək qabiliyyətidir. Rekursiya olmadan, proqramın oxunmasını çətinləşdirən döngələrdən istifadə etməli olacaqsınız. Alt proqrama rekursiv zəng dərhal baş verənlərin mənasını aydınlaşdırır. Təbii ki, əmin olmalısınız ki, alt proqramın şərti olmalıdır, yerinə yetirildikdə sonrakı rekursiya dayanır, əks halda alt proqram dövrəyə keçəcək.

Delphi 5 | ilə peşəkar proqramların hazırlanması İnkişaf Alətləri | ComputerPress 2" 2001

Delphi komponentlərinin yaradılması

Delphi komponentlərinin yaradılmasına giriş

Borland Delphi istifadə edərək proqramlar hazırlayarkən aşağıdakı səbəblərə görə komponentlər yaratmaq rahatdır:

  1. İstifadə rahatlığı. Komponent formada yerləşdirilir və onun üçün xassə dəyərləri təyin etməli və hadisə idarəedici kodunu yazmalısınız. Buna görə də, əgər layihədə onlarla əlaqəli idarəetmə vasitələrinin və hadisə idarəedicilərinin hər hansı bir kombinasiyası iki yerdə baş verirsə, onda müvafiq komponent yaratmaq barədə düşünməyin mənası var. Nəzarət vasitələrinin və onlarla əlaqəli hadisə idarəedicilərinin birləşməsi iki dəfədən çox baş verirsə, onda bir komponentin yaradılması tətbiqi inkişaf etdirərkən səylərə qənaət etməyə zəmanət verilir.
  2. Qrup layihəsinin inkişafının sadə təşkili. Qrup inkişafında layihənin ayrı-ayrı hissələri komponentlər kimi müəyyən edilə bilər və iş müxtəlif proqramçılara həvalə edilə bilər. Komponentlər tətbiqdən ayrıca düzəldilə bilər, bunu etmək olduqca asandır.
  3. Kodu digər proqramçılarla paylaşmağın sadə və effektiv yolu. Bir çox saytlar var, məsələn http://www.torry.net/, burada sərbəst paylanmış komponentləri tapa və ya nominal ödənişlə ala bilərsiniz.

Xüsusiyyət Paketləri

Delphi-də komponentlər paketlərdə saxlanılır. İstifadə olunmuş komponent paketlərinin siyahısını Komponent/Paketləri Quraşdırma menyu elementindən istifadə etməklə çağırmaq olar (lakin nədənsə bu dialoqda Layihə Seçimləri başlığı var).

Bu dialoq qutusundan istifadə edərək, siz yeni paket əlavə edə bilərsiniz (Əlavə et) və ya mövcud paketi silə bilərsiniz (Sil). Silinmə faylın diskdən fiziki olaraq silinməsi deyil, inkişaf mühitindən bu paketə olan keçidin silinməsi deməkdir. Yeni paket əlavə etdikdə onun içində saxlanılan komponentlər palitrada görünür, onu sildikdə isə əksinə, yox olur. Paketi silmək əvəzinə, siyahıda paket adının işarəsini silməklə onun məzmununu inkişaf mərhələsində "gizlədə" bilərsiniz. Siz həmçinin komponentlərə və onların nişanlarına (Komponentlər) baxa bilərsiniz. Nəhayət, siz istifadəçi tərəfindən əlavə edilmiş paketləri redaktə edə bilərsiniz (Edit) - Delphi ilə gələn paketləri redaktə etmək mümkün deyil (Edit düyməsi boz rəngdədir).

Bu dialoqda siz layihənin necə yaradılacağını təyin edə bilərsiniz: iş vaxtı paketlərindən istifadə etməklə və ya onlarsız. Buradan aydın olur ki, komponent paketlərinin iki növü var: icra zamanı paketi (iş zamanı işləyən paket) və dizayn vaxtı paketi (inkişaf zamanı istifadə olunan paket). Onların hamısı DLL-lərdir (dinamik olaraq yüklənmiş kitabxanalar).

Layihə icra zamanı paketləri ilə qur seçimi aktiv edilməklə tərtib edilibsə, icra vaxtı paketləri (*.bpl genişləndirilməsi) layihə ilə birlikdə son istifadəçiyə çatdırılır. Tətbiqin özü (*.exe və ya *.dll) bu halda kiçikdir, lakin kifayət qədər böyük *.bpl faylları onunla birlikdə köçürülməlidir. Mütəxəssislərin fikrincə, layihənin icra müddəti paketləri ilə çatdırılması, yalnız Delphi-də yazılmış beş və ya daha çox modulu (*.exe və ya *.dll) ehtiva etdikdə, təqdim olunan faylların həcmində üstünlük verir. Bu modullar birlikdə işlədikdə əməliyyat sisteminin resursları saxlanılır, çünki RAM-a yüklənmiş bir paket bir neçə modula xidmət edir.

Dizayn vaxtı paketləri (*.dcp uzadılması) yalnız inkişaf mərhələsində istifadə olunur. İnkişaf zamanı onlar formada komponentlərin yaradılmasını dəstəkləyirlər. Tərtib edilmiş Delphi layihəsinə komponent paketindən deyil, *.dcu fayllarından kod daxildir. *.dcp faylı *.dcu faylından yaradılsa da, *.pas faylında dəyişikliklər edilibsə və paket yenidən tərtib olunmayıbsa, onların məzmunu eyni olmaya bilər. Kompilyasiya yalnız proqramçılar tərəfindən yaradılmış paketlər üçün mümkündür. Bu, yuxarıdakı dialoq qutusunda Redaktə et düyməsini klikləməklə əldə edilir. Bundan sonra, paketi manipulyasiya etməyə imkan verən bir forma görünür.

Paket iki hissədən ibarətdir. Contains bölməsi bu paketin komponentlərini (*.pas- və *.dcu-files) və onların nişanlarını (*.dcr-fayllar) təşkil edən modulların siyahısını ehtiva edir. Tələb olunan bölmədə bu komponentlərin işləməsi üçün tələb olunan digər paketlərə keçidlər var. Paketə yeni komponentin əlavə edilməsi Əlavə et düyməsi ilə, mövcud komponentin silinməsi isə Sil düyməsi ilə həyata keçirilir. Kompilyasiya düyməsini klikləməklə paket tərtib edilənə qədər paketə edilən hər hansı dəyişiklik inkişaf mühitində görünməyəcək. Nəhayət, Quraşdırma əmri paketin məzmunu əvvəlki dialoq qutusunda paket adının işarəsini silməklə inkişaf mühitindən silindikdə mövcuddur.

Seçim əmri paketi tərtib etmək üçün layihə variantlarına oxşar variantları seçməyə imkan verir. Bunlar müəyyən paketin hansı növ paket olduğunu müəyyən etmək üçün istifadə edilə bilər: iş vaxtı, dizayn vaxtı və ya hər ikisi (standart paket növü). Seçimlər lazımi modulları axtarmaq və kompilyasiya nəticələrini saxlamaq üçün kataloqları müəyyən edir. Onlar həmçinin sazlama üçün tələb olunan hərəkətləri müəyyənləşdirirlər: məqbul dəyərlərin diapazonunu yoxlamaq və ya yoxlamamaq, optimallaşdırmaları necə yerinə yetirmək, I/O səhvlərini necə idarə etmək. Nəhayət, seçimlərə paket versiyası məlumatı daxil ola bilər. Tətbiq iş vaxtı paketləri ilə birlikdə paylanırsa, bu çox vacibdir: quraşdırma proqramını işləyərkən versiya məlumatı paketlərin köhnəlmiş versiyalarını düzgün şəkildə əvəz etməyə imkan verəcək və əksinə, əgər siz proqramdan daha əvvəlki versiyanın paketini quraşdırmağa çalışırsınızsa. biri verilmiş kompüterdə artıq mövcuddur, sonuncunun üzərinə yazılmayacaq.

Komponent Şablonlar

Delphi dizayn zamanı formada seçilmiş bir neçə ümumi komponentdən sadə kompozit komponentlər yaratmağa imkan verir. Komponentlər/Komponent Şablonunu Yarat menyu elementindən istifadə etməklə müvafiq ekspert çağırılır. Bu menyu elementi formada ən azı bir komponent seçildikdə mövcuddur. Onu seçdikdən sonra Komponent Şablon Məlumatı informasiya qutusu görünür.

Bu dialoqda siz yeni komponentin yerləşdirilməli olduğu komponentlər palitrasında sinfin adını və səhifənin adını göstərməlisiniz. Bu adda səhifə komponentlər palitrasında yoxdursa, o yaradılacaq. Siz həmçinin uyğun *.bmp faylını yükləməklə yeni komponent üçün təklif olunan ikonanı dəyişə bilərsiniz.

Şablon yaradıldıqda, həm Obyekt Müfəttişində proqramçı tərəfindən dəyişdirilmiş xassələr, həm də seçilmiş idarəetmə elementləri ilə əlaqəli hadisə idarəediciləri yadda qalır. Bu halda, hadisə işləyiciləri digər (formada seçilməyən) komponentlərə, qlobal dəyişənlərə, metodlara və s.-ə edilən zəngləri süzmədən tamamilə yadda saxlanılır. Müvafiq olaraq, əgər belə komponentlər (dəyişənlər, metodlar) başqa layihədə yoxdursa, o zaman belə bir layihəni tərtib etməyə çalışarkən Naməlum İdentifikator diaqnostik mesajı alınacaq.

Şablonlardan nə vaxt istifadə etməlisiniz? İlk növbədə, əsas sinifdə standart olaraq mövcud olan hər hansı xassələri dəyişdirmək lazım olduğu hallarda. Məsələn, proqram sarı mətnin sətirini redaktə etmək üçün idarəetmədən istifadə edir. Formada TEdit komponentini yerləşdirmək, Color xassəsini sarı rəngə dəyişmək, bu komponenti işarələmək və şablon kimi saxlamaq olar. Bundan sonra siz bu şablona daxil ola bilərsiniz və formada yerləşdirilən komponent sarı rəngə sahib olacaq. Bununla belə, bu fürsətdən sui-istifadə etməməlisiniz, çünki dəyişdirilmiş rənglə idarə üçün yeni sinif yaradılacaq və bütün virtual metodlar yaddaşda təkrarlanacaq. Bu, əməliyyat sisteminin resurslarına mənfi təsir göstərəcək.

Hadisə idarəediciləri ilə birlikdə bir sıra komponentləri bir formadan digərinə köçürmək lazım olduqda komponent şablonlarından istifadə etmək də rahatdır. Bunun üçün onların hamısı seçilir, yeni formada yerləşdirilən komponent şablonu yaradılır. Bu halda, təkcə komponentlərin özləri deyil, həm də Kopyala/Yapışdır əmrlərini çağırarkən əldə edilə bilməyən hadisə işləyiciləri də köçürüləcək - sonuncu halda hadisə idarəediciləri itiriləcək.

Komponent Şablonunu Yarat əmri ilə yaradılan komponentlər standart üsulla yaradılan adi komponentlərdən (aşağıda təsvir edilmişdir) tamamilə fərqlidir. Vizual olaraq, əsas fərq budur: əgər şablon bir neçə idarəetmə elementini ehtiva edirsə, onda belə bir komponent formada yerləşdirildikdən sonra fərdi idarəetmə seçib onu silə bilərsiniz - qalanları isə formada qalacaq. Standart komponentlər üçün, əgər onlar bir neçə idarəetmə elementini ehtiva edirsə, onlardan birini seçmək və onu silmək mümkün deyil - komponent seçilir və tamamilə silinir.

Sadə Komponentin Yaradılması

Yeni komponent yazarkən aydın olmalısınız ki, komponent son istifadəçilər üçün deyil, proqramçılar üçün yazılmaqdadır. Bu vəziyyətdə, proqramçının komponentin həyata keçirilməsinin təfərrüatlarını araşdırmaması, sadəcə olaraq onun ifşa etdiyi xassələrdən və hadisələrdən istifadə etməsi arzu edilir. Bu, çox hərtərəfli sınaq nəticəsində əldə edilir. Yeni komponent hətta aydın şəkildə nəzərdə tutulmadığı hallarda da sınaqdan keçirilməlidir.

Problemi aşağıdakı kimi qoyaq. Siz basıldıqda səs siqnalı verən düymə yaratmalı və onu komponent kimi həyata keçirməlisiniz ki, proqramçı onu formada yerləşdirib istifadə edə bilsin. Ümumiyyətlə, komponentləri nəzərdən keçirərkən, biz çox vaxt ən sadə xarici effektlərdən istifadə edəcəyik: səs siqnalı, mesajın göstərilməsi və s. Bu o deməkdir ki, xarici effektlərin istifadə olunduğu yerlərdə istənilən kifayət qədər mürəkkəb kod yerləşdirilə bilər. Sadəcə, hazırda onunla maraqlanmırıq.

Komponentin yaradılması Komponent/Yeni komponentlər menyu elementini seçməklə başlayır. Bundan sonra dərhal Yeni Komponent dialoqu görünür.

Bu dialoqda siz əcdad sinfini, yeni yaradılmış sinfin adını, palitrada yeni komponentin yerləşdiriləcəyi səhifəni, yeni komponentin həyata keçirilməsini ehtiva edən modulun adını və keçid yolunu müəyyən etməlisiniz. o. Əgər yeni komponentdə yolu təsvir olunmayan digər modullardan istifadə olunursa, onda onlar Axtarış yolu sahəsində müəyyən edilməlidir.

Beləliklə, birinci (və bəlkə də əsas) vəzifə əcdad sinfini seçməkdir. Açılan siyahıda, palitrada mövcud olan bütün komponentlər, standart Delphi paylanmasına daxil olmayanlar da daxil olmaqla, əcdad sinfi kimi təklif olunur. Yaradılan sinfə xassələrinə görə mümkün qədər yaxın olan sinfi əcdad sinfi kimi seçmək lazımdır. Tapşırığımız üçün, məsələn, TWinControl-u əcdad olaraq seçə bilərik, lakin bu halda düymələrin kliklərinin bütün vizual effektlərini həyata keçirməliyik və s. Buna görə də, əcdad olaraq TButton-u seçirik.

Yeni yaradılmış sinfin adı komponentin məzmununu əks etdirməlidir və heç bir halda artıq qeydiyyatdan keçmiş komponentin adı ilə üst-üstə düşməməlidir! Bu dialoqun doldurulması mərhələsində adlar uyğunluq üçün yoxlanılmır - belə bir səhvlə əlaqəli sərgüzəştlər daha sonra başlayacaq...

Səhifə seçərkən bilməlisiniz ki, mövcud olmayan səhifənin adını qeyd etsəniz, yenisi yaradılacaq.

Nəhayət, həm Quraşdır, həm də OK düymələrini kliklədiyiniz zaman yeni komponenti həyata keçirmək üçün şablon yaradılacaq. Bununla belə, Quraşdırma düyməsini kliklədikdə, şablon komponentlər palitrasına yerləşdiriləcək və OK düyməsini sıxdıqda, o, sadəcə olaraq yaradılır. Quraşdırma düyməsini istifadə etmək tövsiyə olunur. Komponent quraşdırıldıqdan sonra onu formada yerləşdirmək olar. İndi komponentin icra koduna edilən bütün dəyişikliklər layihə ilə birlikdə tərtib ediləcək və proqramçı dərhal səhv mesajları alacaq. Komponent quraşdırılmayıbsa, səhvləri tapmaq üçün onu paket redaktoru vasitəsilə tərtib etmək lazımdır (yuxarıya bax) Kompilyasiya düyməsini klikləməklə, daha az rahatdır.

Beləliklə, Quraşdırma düyməsini kliklədikdən sonra, bu komponentin yerləşdiriləcəyi paketi müəyyən etməyə imkan verən başqa bir dialoq görünür.

Bu dialoqun iki səhifəsi var, onlardan birincisində mövcud paketlərdən birini seçə, ikincisində isə yenisini yarada bilərsiniz. Paketin qısa mətn təsvirini təqdim etmək çox məqsədəuyğundur; bu, Komponent/Paketləri quraşdır əmri ilə çağırılan dialoqda göstəriləcək (yuxarıya bax). Paketi seçdikdən və OK düyməsini basdıqdan sonra paket redaktoru çağırılır, burada yeni komponentin həyata keçirilməsi üçün yeni yaradılmış modul avtomatik olaraq yerləşdirilir. Onu bağlamaq yox, ekranın künclərindən birinə keçirmək faydalıdır ki, siçan düyməsini sıxmaqla işə salınsın.

Eyni zamanda, kod redaktorunda yeni komponenti təsvir etmək üçün "boşluq" yaradılacaq:

Vahid ButtonBeep; interfeys Windows, Mesajlar, SysUtils, Classes, Graphics, Controls, Formalar, Dialoqlar, StdCtrls istifadə edir; type TButtonBeep = class(TButton) private ( Private declarations ) protected ( Protected declarations ) public ( Public declarations ) published ( dərc edilmiş bəyannamələr ) end; prosedur reyestri; icra proseduru Reyestr; RegisterComponents("Nümunələr", ); son; son.

Yeni sinif özü dörd bölməni elan edir, mənası bu seriyanın əvvəlki məqaləsinin (ComputerPress No. 1 "2001) "Dəyişənlərin və metodların görünməsi" bölməsində ətraflı təsvir edilmişdir. Bundan əlavə, yeni sinif Bu modulun bir komponent kimi quraşdırılması zamanı Delphi inkişaf mühiti tərəfindən çağırılan qeydiyyat proseduru, bu komponentin yerləşdiyi palitrada, mötərizədə isə sinifin adı var. Register metodu bir parametr kimi bir sıra sinif növlərini götürür, çünki bir modulda bir neçə komponent yerinə yetirilə bilər, məsələn, onlar vergüllə ayrılır.

Prosedur reyestri; RegisterComponents("Nümunələr", ); son;

Qarşıda duran vəzifəni həll etməyə davam edək - cızıltı yaradan bir düymə yaratmaq. Birincisi, qeyri-ciddi bir şey edək (lakin sonradan məlum olduğu kimi, səhv) - düymə konstruktorunda OnClick hadisə idarəçisi təyin edin. Bunun üçün şəxsi bölmədə yeni BtClick(Sender:TObject) metodunun başlığını müəyyənləşdiririk və həyata keçirmə bölməsində həyata keçiririk:

Prosedur TButtonBeep.BtClick(Sender:TObject); başlanğıc siqnalı; son;

konstruktor Yarat(AOwner:TComponent); ləğv etmək;

məcburi ləğv direktivi ilə! Onu icra bölməsində həyata keçirək:

Konstruktor TButtonBeep.Create(AOwner:TComponent); miras alınmış Yaratmağa başlayın (AOwner); OnClick:=BtClick; son;

Bundan sonra komponenti kompilyasiya edək. Nümunələr səhifəsindən formada düymə qoyaq və layihəni icra üçün işə salaq. Düymənin basıldığı zaman səs siqnalı verdiyinə əmin ola bilərsiniz!

İndi inkişaf mühitinə qayıdaq və obyekt inspektorunda OnClick hadisə idarəçisi təyin edək. Hadisə idarəedicisində mətni forma başlığında göstərəcəyik:

Prosedur TForm1.ButtonBeep1Click(Sender:TObject); start Caption:="Test"; son;

Layihəni işə salaq və düyməni basmağa çalışaq. Formanın başlığı dəyişir, lakin düymə səs verməyi dayandırır! Səhv ondadır ki, biz OnClick düyməsinin bir hadisəsi üçün iki işləyici təyin etməyə çalışdıq: biri BtClick komponentinin daxilində, digəri isə obyekt müfəttişindən istifadə etməklə təyin edilmişdir. TButtonBeep konstruktorunu işlədikdən sonra ilk BtClick işləyicisi ilə əlaqəmiz oldu. Sonra resurslar yüklənir və ButtonBeep1Click metodu OnClick hadisə idarəçisinə təyin edilir. Bu halda, ilk işləyiciyə - BtClick-ə keçid geri qaytarılmayacaq şəkildə itirilir.

Buna görə də, yeni komponentlər yazarkən, həmişə obyekt müfəttişindən istifadə edərək xassələri və hadisə idarəedicilərini dəyişdirməyi düşünməlisiniz. Əgər əmlak (hadisə) dəyişməməlidirsə, Obyekt Müfəttişində göstərilməməlidir. Və artıq görünürsə, onu gizlətməlisiniz (bu barədə daha sonra danışacağıq). Proqramçının obyekt müfəttişindəki hər hansı xassələri dəyişdirmək hüququ var və bundan sonra komponent işləməyi dayandırarsa, komponentin tərtibatçısı günahkardır, lakin heç bir halda ondan istifadə edən proqramçıdır.

Bu problemi necə düzgün həll edə bilərik? Komponentlər yaratmağın bir yolu mövcud metodları yenidən yazmaqdır. TButton komponentinin mənbə kodunun həyata keçirildiyi StdCtrls.pas faylına baxarkən qeyd edə bilərsiniz ki, onun yenidən yazıla bilən dinamik Click metodu var. Buna görə də komponenti yaradarkən Delphi eksperti tərəfindən yaradılmış mənbə koduna yenidən qayıdırıq (konstruktoru və BtClick metodunu çıxarırıq). Sonra ictimai bölmədə metodun başlığını təyin edirik:

Prosedur Klik; ləğv etmək;

və burada metodun həyata keçirilməsi:

Prosedur TButtonBeep.Click; miras alınan Klik başlamaq; səs siqnalı; son;

Düymənin basıldığı zaman cızıltı verdiyini yoxlaya bilərsiniz. Bundan əlavə, obyekt inspektorunda hadisə idarəedicisi təyin edilərkən, bu işləyici icra olunur və səs siqnalı itmir! Komponent düzgün şəkildə həyata keçirilir.

Bu nümunədən istifadə edərək, kod yazarkən mümkün səhvləri təhlil etmək faydalıdır:

  1. Klik metodunun başlığını təyin edərkən unudulmuş ləğv direktivi. Düymə səs verməyi dayandırır, buna görə də Klik üsulu çağırılmır.
  2. Klik prosedurunun həyata keçirilməsində əcdad metoduna (irsi Klik) unudulmuş zəng. Düymə basıldıqda səs siqnalı verməyə davam edir, lakin obyekt müfəttişində təyin edilmiş hadisə idarəedicisindəki kod yerinə yetirilmir. Buna görə də, TButton sinfinin Click metodu OnClick hadisəsini qaldırır.

İndi palitrada TButtonBeep komponentinin işarəsini dəyişdirək. Varsayılan olaraq, yeni komponent üçün əcdad komponentinin simvolu istifadə olunur. Bunun üçün Tools/Image Editor əmrindən istifadə edərək Şəkil Redaktoruna zəng edin. Redaktorda File/New/Component Resource File (*.dcr) əmrini çağırın. Resurs/Yeni/Bitmap əmrindən sonra 32x32 ölçüdə ikon təklif edən dialoq görünəcək. Bu standart ölçülər 24x24-ə dəyişdirilməlidir - bu, komponent nişanlarının olmalıdır! OK düyməsini sıxdıqdan sonra Paint redaktorunun alətlərinə bənzər standart alətlərdən istifadə edərək şəkil çəkməlisiniz. Unutmayın ki, sol alt pikselin rəngi maska ​​rəngidir - bu rəng "şəffaf" olacaq.

Bundan sonra, resursun adını simvolla yenidən təyin etməlisiniz, onun adı Bitmap1-dir; Yeni resurs adı sinfin adına uyğun olmalıdır - bizim vəziyyətimizdə TButtonBeep.

İndi siz ikon faylını bu komponent üçün Qeydiyyat prosedurunu ehtiva edən modulla eyni kataloqda və modulun adı ilə eyni adda saxlamalısınız. Yalnız fayl uzantısı *.pas deyil, *.dcr olacaq. Komponent işarəsi olan fayl hazırdır. Bununla belə, Komponentlər palitrasına baxsaq, köhnə ikonanın hələ də orada olduğunu görərik. Delphi və ya hətta əməliyyat sistemini yenidən başladırsanız, köhnə ikon hələ də palitrada qalacaq. İşarəni dəyişdirmək üçün komponent yenidən qeydiyyatdan keçməlidir. Bunu etmək üçün sizə lazımdır:

Bu nümunə sınaq məşqi hesab edilməlidir. Yeni komponent yazmazdan əvvəl sərbəst paylanmış komponentlər arasında oxşarlarının olub-olmadığını yoxlamaq lazımdır. Demək olar ki, hər hansı düymələr var: şəffaf, qaçış, dəyirmi, rəngli və s. Vəziyyət digər komponentlərlə - eyni sinfin nəsilləri ilə təxminən eynidir. Buna görə də, çox vaxt bir neçə nəzarətdən ibarət komponentləri tətbiq etməlisiniz.

Beləliklə, bu nümunədə yeni komponentlər yaratmaq üçün yenidən yazma metodunun istifadəsini araşdırdıq.

Kompleks Komponentin yaradılması

Tutaq ki, siz proqrama müştəri adlarının siyahısını daxil etməlisiniz. Eyni proqramda siz həmçinin telefon nömrələrinin siyahısını daxil etməlisiniz. Siyahıya daxil olmaq kifayət qədər ümumi əməliyyatdır, ona görə də onu komponent kimi həyata keçirməyi düşünməlisiniz.

Siyahıya yeni element daxil etmək üçün sizə redaktor lazımdır - TEdit komponenti. Bundan sonra istifadəçi siyahıya baxa bilməlidir - TListBox komponenti lazım olacaq. Bundan əlavə, TEdit-dən siyahıya cari dəyəri yazmaq, seçilmiş siyahı elementini redaktə etmək və onu silmək üçün əmrlərə ehtiyacınız olacaq. Bu əmrləri yerinə yetirməyin ən asan yolu düymələrdən istifadə etməkdir. Tapşırığı sadələşdirmək üçün formada bir düymə yerləşdirəcəyik, kliklədikdə TEdit komponentinin məzmununu siyahıya əlavə edəcəyik.

Beləliklə, biz TEdit, TListBox və TButton olan yeni komponent yaratmalıyıq. Həmişə olduğu kimi, onu Component/New Component əmri ilə yaratmağa başlayaq. Bundan sonra, əcdad sinfini, sinif adını və modul adını təyin etməli olduğunuz bir dialoq görünür. Sinif adı və modul adı ilə bağlı heç bir çətinlik yoxdur, lakin əcdad sinfinin adı aydın deyil. Üç nəzarətimiz var. Onlar üçün ortaq əcdad sinfi TWinControl-dur. Ancaq onu əcdad sinfi kimi seçsək, TButton, TEdit və TListBox kodunun çox uzun və yorucu bir tətbiqi ilə qarşılaşırıq. Belə hallarda digər komponentlərə münasibətdə “ata” ola biləcək komponenti əcdad sinfi kimi seçmək lazımdır. Delphi ilə paylanmış standart komponentlər arasında üçü var: TPanel, TGroupBox, TScrollBox. Paneli əcdad sinfi kimi seçək, lakin TPanel komponentinin özünü deyil, TCustomPanel sinfini seçək. Aşağıda TCustomPanel-in TPanel-dən seçilməsinin üstünlüklərini müzakirə edəcəyik.

Gəlin yeni sinfə TListAdd adını verək və Quraşdırma düyməsini sıxırıq. Paketi seçdikdən sonra komponent palitrada quraşdırılacaq, oradan onu yeni yaradılmış proqramın formasına yerləşdirmək olar. Bu rahatdır, çünki layihə tərtib edildikdə, komponent modulu da tərtib ediləcək və səhvlər olarsa, kompilyator mesaj göstərəcəkdir.

İdarəetmə vasitələrimizi hansısa formada yerləşdirmək və sonra onlardan komponent yaratmaq rahat olardı. Standart Delphi paketində belə bir mütəxəssis yoxdur. Buna görə də, komponentləri özünüz yaratmalı və panelə yerləşdirməlisiniz. TCustomPanel konstruktorunda idarəetmə vasitələri - TButton, TEdit və TListBox - yaratmaq məqsədəuyğundur və bu, açıq şəkildə yenidən yazılmasını tələb edir. Hələlik, nəzarətləri 100x100 kvadratda yerləşdirək. Onların koordinatlarını da konstruktorda müəyyən etmək lazımdır. Nəzərə almaq lazımdır ki, hər hansı idarəetmə elementinin konstruktoru işləndikdən sonra onun hələ valideyni yoxdur, yəni yuxarı sol küncün koordinatlarını hansı pəncərə ilə ölçməli olduğunu bilmir. Valideynləri olmayan uşaq pəncərəsinin koordinatlarını dəyişdirmək cəhdi dərhal istisnaya səbəb olacaq. Buna görə də, idarəetmə konstruktorunu çağırdıqdan sonra ilk operator ona valideyn təyin edəcək, bunun üçün biz TCustomPanel seçəcəyik. Biz də onu onların sahibi edəcəyik, bu halda dağıdıcını yenidən yazmağa ehtiyac qalmayacaq.

Beləliklə, istifadələr bölməsində TEdit, TButton və TListBox siniflərinin təsvirlərinin yerləşdiyi StdCtrls modulunu əlavə edirik və özəl bölmədə üç dəyişən təyin edirik:

Şəxsi FEdit: TEdit; FListBox:TListBox; F düyməsi: TB düyməsi;

İctimai bölmədə konstruktor başlığını məcburi ləğv direktivi ilə elan edirik:

Konstruktor Yarat (AOwner:TComponent); ləğv etmək;

Konstruktoru icra bölməsində həyata keçiririk:

Konstruktor TListAdd.Create(AOwner:TComponent); miras alınmış Yaratmağa başlayın (AOwner); FButton:=TBbutton.Create(Self); FButton.Parent:=Özü; FButton.Sol:=5; FButton.Top:=5; FButton.Width:=40; FButton.Hündürlük:=25; FEdit:=TEdit.Create(Self); FEdit.Parent:=Özü; FEdit.Sol:=50; FEdit.Top:=5; FEdit.Width:=45; FEdit.Hündürlük:=25; FListBox:=TListBox.Create(Self); FListBox.Parent:=Özü; FListBox.Left:=5; FListBox.Top:=35; FListBox.Width:=90; FListBox.Hündürlük:=60; son;

Bir daha vurğulamaq lazımdır ki, bu halda dağıdıcının yenidən yazılmasına ehtiyac yoxdur: panel bütün idarəetmə vasitələrinin sahibidir və onun dağıdıcısı çağırıldıqda, idarəetmə dağıdıcıları avtomatik olaraq çağırılacaqdır.

Paket redaktorundan istifadə edərək komponenti yenidən tərtib etdikdən sonra komponentdəki dəyişiklikləri artıq vizual olaraq, inkişaf mərhələsində görmək olar.

Diqqətinizi çəkən ilk çatışmazlıq komponenti miqyaslandırarkən idarəetmə vasitələrinin qeyri-adekvat davranışıdır. Onun ölçülərini dəyişdirərkən elementlərin ölçüləri və mövqeyi dəyişmir. Bundan əlavə, komponent kiçik edilə bilər ki, üç idarəetmə ona uyğun gəlməyəcək. Və nəhayət, komponent palitrasından formada komponenti sadə bir siçan klikləməklə quraşdırarkən, onun ölçüləri də arzuolunan dərəcədə çox şey buraxır.

Əvvəlcə komponentlərin standart ölçülərini, yəni komponentlər palitrasına kliklədiyiniz zaman avtomatik olaraq ona təyin olunanları düzəldək və sonra formaya klikləyin. Bunu etmək üçün sadəcə olaraq konstruktorda panelin yeni ölçülərini təyin etməlisiniz:

Eni:=100; Hündürlük:=100;

Sonra miqyaslaşdırarkən komponentin davranışını yaxşılaşdırmalısınız. Bunu etmək üçün ölçülərin dəyişdirildiyi barədə bir mesaj almalısınız. İdarəetmənin ölçüsü dəyişdikdə sistem ona WM_SIZE mesajı göndərir. Bu mesaj ələ keçirilməlidir. Bunu etmək üçün şəxsi bölmədə mesaj ələ keçiricisinin başlığını təsvir edirik:

Prosedur WMSsize(var Message:Tmessage); mesaj WM_SIZE;

və icra bölməsində biz onun işləyicisini həyata keçiririk:

Prosedur TListAdd.WMSize(var Message:TMmessage); miras alınmağa başlayır; əgər Genişlik<100 then Width:=100; if Height<100 then Height:=100; FEdit.Width:=Width-55; FListBox.Width:=Width-10; FListBox.Height:=Height-40; end;

Birinci ifadə standart WM_SIZE işləyicisinə (miras qalmış) çağırışdır. Onu çağırdıqdan sonra En və Hündürlük xassələri panelin yeni eni və hündürlüyünü ehtiva edəcək. Bundan sonra komponentin minimum ölçüləri müəyyən edilir, bu halda 100x100. Üfüqi və ya şaquli ölçü minimumdan azdırsa, ona minimum dəyər verilir. Daha sonra idarəetmə elementləri elə ölçülür ki, onlar bütün paneli müəyyən boşluqla doldursunlar. Komponenti paket redaktoru vasitəsilə tərtib etməklə siz artıq inkişaf mərhələsində qeyd edə bilərsiniz ki, paneldə idarəetmə elementləri miqyaslandıqda düzgün davranır, həmçinin komponentin ölçüsünü 100x100-dən az etmək olmaz.

İndi bütün layihəni işə salmaq faydalı olacaq, məlumatları bir sətirli mətn redaktoruna daxil etməyə və düyməni sıxmağa çalışın. Bu halda siyahıya heç nə əlavə olunmur. Təəccüblü deyil ki, bizim komponentimizin heç bir yerində düyməni basdıqda nə edilməli göstərilməyib. Bir düymənin klikləməsi ilə əlaqəli hadisə idarəedicisi etmək üçün siz TbuttonBeep komponentini yazarkən olduğu kimi davam edə bilərsiniz, yəni yeni sinfi - TButton nəslini təyin edin və Click metodunu yenidən yaza bilərsiniz. Bununla belə, yeni sinfi müəyyən etmək üçün sistem resursları tələb olunur (virtual üsullar çoxalır). Komponenti formada qeyd etsək və obyekt müfəttişinə baxsaq, görərik ki, TlistAdd komponenti bir neçə xüsusiyyəti və heç bir hadisəni, o cümlədən OnClick düyməsi üçün heç bir hadisə idarəedicisini ifşa etmir. Buna görə də, sonuncu fəsildə səhv metod kimi rədd etdiyimiz OnClick düymə işləyicisini yenidən təyin etdik, bu halda tətbiq olunur, çünki proqramçı obyekt müfəttişində yeni işləyici təyin edə bilməz. Beləliklə, şəxsi bölmədə yeni metodun başlığını təsvir edirik:

Prosedur BtClick(Sender:TObject);

TListAdd konstruktorunun həyata keçirilməsində biz bu işləyicini FButton.OnClick hadisə idarəedicisinə təyin edirik:

FButton.OnClick:=BtClick;

Nəhayət, BtClick metodunu tətbiq edək:

Prosedur TListAdd.BtClick(Sender:TObject); start if length(FEdit.Text)>0 sonra başlayır FListBox.Items.Add(FEdit.Text); FEdit.Text:=""; FEdit.SetFocus; son; son;

Əvvəlcə bir sətirli redaktorun boş olub olmadığını yoxlayaq: biz siyahıya boş sətirlər əlavə etməyəcəyik. Sonra redaktorun məzmununu siyahıya (FListBox.Items.Add(FEdit.Text);) köçürür və redaktoru növbəti dəyəri daxil etməyə hazırlayırıq - yəni onu mətndən təmizləyirik (artıq siyahıya köçürülmüşdür). ) və giriş fokusunu ona köçürün. İndi tətbiqi tərtib etdikdən və işə saldıqdan sonra onun düzgün işləməsinə əmin ola bilərsiniz - düyməni basdığınız zaman redaktorun məzmunu siyahıya köçürülür.

Xüsusiyyətlər və Metodların əlavə edilməsi

TPanel komponentini TListAdd komponentinin yanında yerləşdirsəniz və obyekt müfəttişində göstərilənləri müqayisə etsəniz, panel üçün kifayət qədər çox sayda xassələrin və hadisələrin, TListAdd üçün isə yalnız bir neçə xüsusiyyətin açıqlandığını görəcəksiniz. Bu arada, TCustomPanel sinfi hər iki komponentin əcdadıdır. Səbəbini anlamaq üçün ExtCtrls.pas modulunu açaq və TCustomPanel və TPanel sinifləri arasındakı fərqə baxaq. Qeyd etmək olar ki, panelin funksionallığını təmin edən bütün metodlar və dəyişənlər TCustomPanel sinif səviyyəsində müəyyən edilir. O, həmçinin TPanel üçün obyekt müfəttişində göstərilən xassələri müəyyənləşdirir, yalnız bu xüsusiyyətlər Qorunan bölmədə müəyyən edilir. TPanel sinfinin həyata keçirilməsi son dərəcə sadədir: TCustomPanel əcdad kimi müəyyən edilir və bu sinfin xüsusiyyətləri elan edilir, lakin dərc olunmuş bölmədə. TcustomPanel sinfinin xassələri və metodlarının obyekt müfəttişində görünməsi, yəni xassələri elan etmək üçün TListAdd sinfində nə etmək lazım olduğu aydın olur. TListAdd sinifinin dərc olunmuş bölməsində yazırıq:

Property Align; əmlak OnMouseDown;

Mülkiyyəti elan edərkən, onun tipini və ya istinad dəyişənlərini və ya xassəni oxumaq və ya yazmaq üçün üsulları göstərməyə ehtiyac yoxdur. Komponenti obyekt inspektorunda paket redaktoru vasitəsilə tərtib etdikdən sonra Align xassəsinin və OnMouseDown hadisəsinin görünüşünü müşahidə edə bilərsiniz. Beləliklə, TCustom... siniflərinin nəsilləri üçün proqramçının obyekt müfəttişində hansı xassələrin və hadisələrin göstərilməli, hansının göstərilməməsini seçmək imkanı var. Məhz bu səbəbdən TCustom... siniflərindən komponentlər yaratmaq üçün əcdad kimi istifadə etmək tövsiyə olunur.

İndi yeni əmlakı necə təqdim edə biləcəyinizi nəzərdən keçirək (yuxarıda etdiyimiz şey mövcud əmlakların yenidən bəyan edilməsidir). Düymədəki mətn Obyekt Müfəttişində göstərmək üçün uyğun xüsusiyyət kimi istifadə edilə bilər: TListAdd komponentindən istifadə edən proqramçıya inkişaf zamanı mətni dəyişməyə icazə verin. Bəyannamədən istifadə edərək yeni bir xüsusiyyət (gəlin onu BtCaption adlandıraq) təqdim etməyə çalışırıq:

Property BtCaption:string read FButton.Caption yaz FButton.Caption;

komponenti tərtib etməyə çalışarkən xəta ilə nəticələnir. Buna görə də, özəl bölmədə iki metodun başlıqlarını müəyyən edirik:

GetBtCaption funksiyası:string; prosedur SetBtCaption(const Value:string);

Dərc olunmuş bölmədə BtCaption mülkiyyətini elan edirik:

Əmlak BtCaption:string oxu GetBtCaption yaz SetBtCaption;

Nəhayət, icra bölməsində elan edilmiş iki metodu həyata keçiririk:

Funksiya TListAdd.GetBtCaption:string; start Nəticə:=FButton.Caption; son; prosedur TListAdd.SetBtCaption(const Value:string); start FButton.Caption:=Dəyər; son;

Paket redaktorundan istifadə edərək komponenti tərtib etdikdən sonra Obyekt Müfəttişində yeni xüsusiyyət görünür. Bu əmlakın dəyərinin dəyişdirilməsi birbaşa inkişaf mərhələsində əks olunur.

İndi yeni bir hadisə təyin edək. Bu halda, bu komponentdən istifadə edən proqramçıya redaktorun məzmununu siyahıya əlavə etməzdən əvvəl mətni təhlil etməyə imkan verən hadisə yaratmaq və siyahıya mətn əlavə etməyə icazə vermək və ya söndürmək məqsədəuyğun olardı. Buna görə də, bu üsul redaktorda mətnin cari qiymətini parametr kimi ehtiva etməli və proqramçının True və ya False dəyərini təyin edə biləcəyi Boolean dəyişəndən asılı olmalıdır. Bundan əlavə, komponentdə hər hansı hadisə idarəedicisi onu çağıran komponentin özünə istinad ötürdüyü Sender parametrindən asılı olmalıdır. Bu zəruridir, çünki Delphi inkişaf mühitində eyni hadisə idarəedicisi bir neçə fərqli komponentdən çağırıla bilər və proqramçı hansı komponentin işləyici adlandırıldığını təhlil edə bilməlidir. Beləliklə, interfeys bölməsində söz növündən sonra TListAdd təyin etməzdən əvvəl yeni metod tipini təyin edirik:

Obyektin TFilterEvent=procedure(Sender:TObject; const EditText:string; var CanAdd:boolean) yazın;

FOnFilter:TFilterEvent;

Və nəşr olunan bölmədə bu tip bir xüsusiyyəti müəyyənləşdiririk:

Property OnFilter:TFilterEvent read FOnFilter yaz FOnFilter;

Yeni xassə təyin edərkən biz metodlara deyil, FOnFilter dəyişəninə müraciət edirik - onlar burada tələb olunmur. İndi, paket redaktorundan istifadə edərək komponenti tərtib etsəniz, OnFilter hadisəsinin Obyekt Müfəttişində göründüyünü görə bilərsiniz. Bununla belə, ona bir işləyici təyin etsək və layihəni icra üçün işə salsaq, o, çağırılmaya bilər. Bunun səbəbi biz onu komponentimizin heç bir yerində çağırmamışıq. OnFilter hadisəsini çağırmaq üçün yaxşı yer, artıq tətbiq olunan FButton üçün OnClick hadisə idarəedicisindədir. Beləliklə, biz əvvəlcədən müəyyən edilmiş BtClick metodunun tətbiq kodunu dəyişəcəyik:

Prosedur TListAdd.BtClick(Sender:TObject); var CanAdd:boolean; start if length(FEdit.Text)>0 sonra başlayır CanAdd:=True; Əgər Təyin edilibsə(FOnFilter) sonra FOnFilter(Self,FEdit.Text,CanAdd); CanAdd varsa, onda FListBox.Items.Add (FEdit.Text) başlayır; FEdit.Text:=""; FEdit.SetFocus; son başqa bip; son; son;

Beləliklə, yuxarıdakı kod parçasında CanAdd boolean dəyişəni müəyyən edilmişdir. Kod yazarkən nəzərə alın ki, proqramçı OnFilter hadisə idarəçisi yarada bilməz. Buna görə də, CanAdd dəyişəninin standart dəyərini True olaraq təyin etdik - bütün sətirləri siyahıya əlavə edin. Bundan sonra, FonFilter-ə zəng etməzdən əvvəl proqramçının hadisə idarəedicisi yaradıb-yaratmadığını yoxlamaq lazımdır. Bu, boolean dəyərini qaytaran Assigned metodunu çağırmaqla əldə edilir. Göstərici üçün Assigned metodunun çağırılması P-nin yoxlanmasına bərabərdir<>sıfır. Obyekt metodu üçün biz FOnFilter yoxlamasından istifadə edə bilmərik<>nil, çünki obyekt metodu iki ünvanla xarakterizə olunur və belə bir yoxlamaya tərtibçi icazə verməyəcək. Lakin Assigned metodunun çağırılması hadisə idarəedicisinin hazırlanıb-yaratılmadığını mükəmməl şəkildə yoxlayır. Yuxarıdakı kod bir komponentdən hadisə idarəçisinə zəng etmək üçün tamamilə standart bir yoldur.

Qalan tək şey hadisə işləyicisini sınamaqdır. Formaya iki TListAdd komponenti yerləşdirək, biri üçün yalnız tam ədədləri, digəri üçün isə yalnız böyük ingilis hərfləri ilə başlayan sözləri əlavə etməyə icazə verəcəyik. Müvafiq olaraq, OnFilter hadisə işləyiciləri üçün kod belə görünəcək:

Prosedur TForm1.ListAdd1Filter(Sender: TObject; const EditText: String; var CanAdd: Boolean); var I,N:integer; başlamaq Val(EditText,N,I); Əlavə edə bilərsiniz:=I=0; son; prosedur TForm1.ListAdd2Filter(Sender: TObject; const EditText: String; var CanAdd: Boolean); start CanAdd:=False; əgər uzunluq(EditText)>0, onda CanAdd:=(EditText>="A") və (EditText)<="Z"); end;

Kodu başa düşmək asandır, yeganə xəbərdarlıq odur ki, ListAdd2Filter hadisə idarəedicisində mətnin ilk hərfini yoxlamadan əvvəl mətnin boş sətir olmadığını yoxlayır. Belə bir yoxlamanın aparılması məcburidir: Object Pascal-da sətirlər obyektlərdir, boş sətir isə sıfır göstəricisinə uyğundur. Boş bir sətirin ilk hərfini yoxlamağa cəhd etsəniz, proqram sıfırdan imtina etməyə çalışacaq, bu da istisna yaradacaq. Bu halda, bu problem deyil: TListAdd komponentindən FOnFilter hadisə idarəedicisinə zəng etməzdən əvvəl sətir sıfırdan fərqli uzunluq üçün yoxlanılır. Bununla belə, mənbə kodu sizin üçün mövcud olmayan komponentlər üçün belə yoxlama məcburidir!

Obyekt Müfəttişində Xüsusiyyətləri Gizlətmək

Tutaq ki, siz verilənlərə çıxış komponenti, məsələn, TTable sinfinin nəslini yaradırsınız. Tutaq ki, bu komponent verilənlər bazasında mövcud olan cədvəllərin siyahısını təhlil edir və bəzi meyarlara əsasən (məsələn, müəyyən tipli və müəyyən adda sahənin olması) biri iş üçün seçilir. Komponentin normal işləməsi üçün bu cədvəlin adı TableName xassəsinə daxil edilməlidir. Amma bu əmlak obyekt müfəttişində görünür! Bu komponentdən istifadə edən proqramçı inkişaf zamanı onun dəyərini dəyişə bilər ki, bu da, ehtimal ki, komponenti işlək vəziyyətə salacaq. Və o, haqlı olacaq! Xüsusiyyətlərdən və ya hadisələrdən hər hansı birini dəyişdirmək mümkün deyilsə, onlar gizlədilməlidir.

Biz TListAdd komponenti üzərində işləməyə davam edəcəyik və Kursor xassəsini model tapşırığı kimi obyekt müfəttişindən çıxaracağıq. Bu xassə TControl sinfinin nəşr edilmiş bölməsində müəyyən edilir və komponentin inkişafının əvvəlindən TListAdd üçün obyekt müfəttişində göstərilir. Buna əsaslanaraq, qorunan bölmədə bu xüsusiyyəti ləğv etməyə cəhd edə bilərsiniz. Kompilyator bu cür ləğv etməyə icazə verəcək, lakin bu, istənilən nəticəyə gətirib çıxarmayacaq: Kursor xassəsi obyekt inspektorunda olduğu kimi qalacaq... Nəşr olunmuş bölmədə müəyyən edilmiş istənilən xassə həmişə obyektdə göstəriləcək. bu sinfin bütün nəsilləri üçün müfəttiş.

Obyekt müfəttişindən əmlakı gizlətmək üçün biz Delphi tərtibçisinin iki xüsusiyyətindən istifadə edirik, yəni:

  1. Mövcud əmlakla eyni adlı yeni bir əmlak elan edilərkən, əvvəllər müəyyən edilmiş əmlak "kölgələnir".
  2. Yalnız oxumaq və ya yalnız yazmaq imkanı olan xüsusiyyətlər, dərc edilmiş bölmədə elan olunsa belə, obyekt müfəttişində görünmür.

Kursor xassəsinin gizlədilməsi üzərində işə başlamazdan əvvəl TListAdd komponentlərini formadan silmək yaxşı olar, əks halda forma resursunu oxuyarkən istisna baş verə bilər. Beləliklə, özəl bölmədə biz dəyişən FDummy:integer elan edirik (dəyişənin adı və növü istənilən ola bilər) və dərc olunmuş bölmədə yeni xassə təyin edirik:

Mülk kursoru: tam oxunuş FDummy;

Yeni xassə Kursor adlandırılmalı, onun növü yuxarıda müəyyən edilmiş dəyişənin tipinə uyğun olmalıdır, xassə yalnız oxumaq və ya yalnız yazmaq üçün olmalıdır. Komponenti paket redaktorundan istifadə edərək tərtib etdikdən sonra TListAdd komponentini yenidən formada yerləşdirməlisiniz. Kursor xüsusiyyətinin artıq Obyekt Müfəttişində görünmədiyini görə bilərsiniz.

İndi tapşırığı bir az çətinləşdirək. Tutaq ki, siz kursorun ox kimi deyil, qum saatı (crHourGlass) kimi göstərilməsini istəyirsiniz. Xüsusiyyətlərin standart dəyərini dəyişdirmək üçün yeni dəyər konstruktordakı dəyişənə təyin edilməlidir. Konstruktorda Kursora yeni dəyər təyin etməyə çalışarkən

Kursor:=crHourGlass;

Delphi kompilyatoru yeni dəyərin yalnız oxuna bilən dəyişənə təyin edilə bilməyəcəyini bildirən diaqnostik mesaj verəcəkdir. Yeni "yalnız yazmaq üçün" xüsusiyyət yaratsanız, kompilyator fərqli bir diaqnostik mesaj verəcək - uyğun olmayan məlumat növləri haqqında. Əgər siz FDummy:TCursor dəyişənini elan etsəniz və onu yalnız yazmaq üçün etsəniz, kompilyator bu təyinata icazə verəcək, lakin kursorun görünüşü dəyişməyəcək: o, yenə də ox olacaq.

Bu problemin mənasız həlli TCustomPanel-in nəsil sinfini elan etməkdir, onun konstruktorunda Kursor dəyişəninə yeni dəyər təyin etməli və ondan TListAdd komponentimizi istehsal etməlisiniz. Bu həllin iki mənfi tərəfi var:

  1. Bu, resurs tələb edir - virtual üsullar çoxalır.
  2. Bu komponentdən istifadə edəcək proqramçıdan obyekt müfəttişindəki əmlakı gizlətdik. Biz bu əmlakla işləmək istəyirik.

Buna görə də, bu problemin həlli belə görünür: TListAdd konstruktorunda operatoru elan edirik:

İrsi kursor:=crHourGlass;

və bu qədər! Bu kursoru dəyişdirmək üçün kifayətdir.

Əvvəllər biz irsi funksiya sözündən yalnız əcdad metodunu çağırmaq üçün istifadə edirdik. Bu konstruksiya əcdad sinfinə istinad kimi miras qalanın mənasını daha yaxşı anlamağa imkan verir. Siz həm xassələrə, həm də metodlara daxil ola bilərsiniz. Mülkiyyətə daxil olarkən siz onu oxuya və ya ona yeni dəyər təyin edə bilərsiniz; bu zaman miras qalmış köməkçi söz təyin işarəsinin solunda görünür. Eynilə, gizli əcdad üsullarını çağıra bilərsiniz. Ata sinfindən daha yüksək iyerarxiya çağırışları qadağandır - tikinti

İrsi irsi Kursor:=crHourGlass;

tərtib etməyəcək.

Bu nöqtədə biz bu layihəni bitmiş hesab edəcəyik. Yeni komponentdə biz mesajı tutduq, xassələri elan etdik, yeni xüsusiyyətlər və hadisələr əlavə etdik və əvvəl elan edilmiş əmlakı gizlətdik. Bütün bu üsullar komponentlər yaratmaq üçün istifadə olunur. Aşağıda başqa bir maraqlı üsula baxacağıq.

Komponentlər yaratmaq üçün çəngəl prosedurlarından istifadə

Daha əvvəl qeyd olundu ki, hər bir TWinControl uşağının mesajları qəbul edən və emal edən proseduru var. Pəncərə tutacağına (HWND) istinad varsa, onda siz bu prosedurun ünvanını təyin edə və daha da vacibi bu ünvanı ləğv edə və beləliklə, qəbul edilmiş mesajları öz üsulunuzla emal edə bilərsiniz. Bir qayda olaraq, heç kim bütün mesajlar üçün tam işləyicilər yazmır; köhnə standart metod daha tez-tez çağırılır. Bu zaman filtr kimi yeni prosedurdan istifadə edilir: hadisə gələndə kod icra olunur. Əslində, bu, TwinControl-da “casusdur”: mesaj gələndə və bəzi kod icra oluna biləndə bizə xəbər verilir. Hook proseduru düzgün həyata keçirilirsə, TWinControl mesajlarını başqası ilə paylaşdığından xəbərsiz olaraq həmişəki kimi işləməyə davam edir.

Kanca proseduru aşağıdakı kimi müəyyən edilir:

Obyektin proseduru(var Message:TMmessage);

Bu, mesaj haqqında bütün məlumatları ehtiva edən TMessage tipli dəyişəndən asılıdır. Ancaq bu proseduru müəyyən etmək kifayət deyil. O, qoşulacağı hər TWinControl üçün kopyalanmalıdır. Bu, WinAPI metodunu MakeObjectInstance çağırmaqla əldə edilir. Bu metod obyekt metodunu parametr kimi götürür, onun surətini yaddaşa çıxarır və yeni metodun ünvanını qaytarır. Aydındır ki, bu, sistemə qaytarılmalı olan sistem resurslarını ehtiyatda saxlayır. Bu, FreeObjectInstance metodunu çağırmaqla əldə edilir.

Başqa bir vacib şərt: TWinControl-u məhv etməzdən əvvəl köhnə mesaj emal proseduru ilə əlaqə bərpa edilməlidir, əks halda resurslar sistemə qaytarılmayacaq. Bu o deməkdir ki, siz GWL_WNDPROC parametri ilə Win API GetWindowLong metoduna zəng etməklə tapıla bilən köhnə prosedurun göstəricisini xatırlamalı olacaqsınız. Bu göstərici həmçinin TWinControl-un defolt hadisə işləyicilərinə zəng etmək üçün istifadə olunacaq. Əks metod, SetWindowLong, Hook prosedurunu təyin etmək üçün istifadə olunur.

Beləliklə, növbəti məşq üçün problemi formalaşdıraq. Tutaq ki, biz digər komponentləri - TWinControl nəslini - siçan düyməsini basdıqda səs siqnalı verəcək komponent yaratmaq istəyirik. Aydındır ki, proqramın icrası zamanı bu komponent göstərilməməlidir, ona görə də biz TComponent-i onun əcdad sinfi kimi seçəcəyik. Sinif adını TBeepWnd olaraq təyin edək. Şəxsi bölmədə üç dəyişən təyin edirik:

FOldProc,FNewProc:göstərici; FControl:TWinControl;

Adlardan aydın olur ki, biz FOldProc dəyişənində köhnə prosedura keçidi xatırlayacağıq, yeni prosedura keçid (MakeObjectInstance metodunu yerinə yetirdikdən sonra) FNewProc dəyişənində saxlanacaq. Və FControl dəyişəndə ​​biz Hook prosedurunun hazırda “asıldığı” idarəetmə elementinə keçid saxlayacağıq. Eyni bölmədə üç metodu müəyyən edək:

Prosedur HookProc(var Mesaj:TMMessage); prosedur HookWindow(W:TWinControl); UnhookWindow proseduru;

və icra bölməsində biz onları həyata keçiririk:

Prosedur TBeepWnd.HookProc(var Mesaj:TMMessage); start case Message.Msg of WM_LBUTTONDOWN:begin (Bizim tapşırığımız) Beep; Message.Result:=CallWindowProc(FOldProc, FControl.Handle, Message.Msg, Message.WParam, Message.lParam); son; WM_DESTROY:begin (pəncərə məhv olmaq üzrə olduqda, çəngəl çıxarın) Message.Result:=CallWindowProc(FOldProc, FControl.Handle, Message.Msg, Message.WParam, Message.lParam); UnhookWindow; son; (Defolt işləyiciyə zəng edin) else Message.Result:=CallWindowProc(FOldProc, FControl.Handle, Message.Msg, Message.WParam, Message.lParam); son; son;

Hook prosedurunun özündə reaksiyanın baş verdiyi bir mesaj tutulur - WM_LBUTTONDOWN. Bundan əlavə, istənilən Hook proseduru WM_DESTROY mesajını idarə etməlidir. Bu, məhv edilməzdən əvvəl pəncərəyə göndərilən son mesajdır. Cavabımız aşağıda təsvir edilən UnhookWindow metodunu çağıraraq əvvəlki metodu bərpa etməkdir. Nəhayət, defolt mesaj işləyiciləri CallWindowProc metodundan istifadə etməklə çağırılır. Defolt hadisə işləyicisini unutmaq, 80% hallarda bu, səhv tətbiq davranışına səbəb olacaq. Heç bir halda CallWindowProc metodunun çağırılmasının nəticəsini Mesaj dəyişəninin Nəticə sahəsinə təyin etməyi unutmamalısınız! Bu halda kod işləməyəcək!

Prosedur TBeepWnd.HookWindow(W:TWinControl); Start if csDesigning in ComponentState, then start (Komponentin dizayn və ya iş vaxtında olub olmadığını yoxlamaq) FControl:=W; Çıxış; son; əgər FControl<>nil sonra UnhookWindow; (əvvəllər quraşdırılıbsa, qarmağı çıxarın) əgər W<>nil sonra FOldProc başlayır:=göstərici(GetWindowLong(W.Handle,GWL_WNDPROC)); (Köhnə prosedurun ünvanını müəyyən edir) FNewProc:=MakeObjectInstance(HookProc); (Yaddaşda surət çıxarın) SetWindowLong(W.Handle,GWL_WNDPROC,integer(FNewProc)); (Yeni prosedur təyin et) son; FControl:=W; (Nəzarətdə arayışı saxla) sonunda;

Bu üsul yeni mesajla işləmə prosedurunu qurmaq üçün istifadə olunur. Birincisi, komponentin hansı mərhələdə olduğunu yoxlayır: inkişaf mərhələsində və ya icra mərhələsində. Əgər komponent inkişaf mərhələsindədirsə, yəni ComponentState xassəsində csDesigning bayrağı qoyulubsa, Hook proseduru quraşdırmadan sadəcə komponentə keçid saxlanılır. Bu, Delphi inkişaf mühitində Hook prosedurunun quraşdırılmasının qarşısını almaq üçün edilir. Əgər bu prosedur əvvəllər başqa idarəetmə üzərində qurulubsa, UnhookWindow metodunu çağırmaqla silinir. Bundan sonra köhnə prosedurun ünvanı xatırlanır (GetWindowLong), yeni prosedurun yaddaşında surəti hazırlanır (MakeObjectInstance) və yeni prosedurun ünvanı təyin olunur (SetWindowLong). Tam ədəddən göstəriciyə tip tökmə istifadə olunur və əksinə - adlanan metodlar olduqca uyğun olmayan tiplərdə dəyişənləri tələb edir (və ya qaytarır). Nəhayət, nəzarətə istinad özəl bölmədə müəyyən etdiyimiz FControl dəyişənində saxlanılır.

Prosedur TBeepWnd.UnhookWindow; başlamaq əgər (FControl=nil) və ya (FOldProc=nil) və ya (FNewProc=nil) sonra Exit; (Heç bir qarmaq quraşdırılmayıb) SetWindowLong(FControl.Handle,GWL_WNDPROC,integer(FOldProc)); (Köhnə pəncərə prosedurunu təyin edin) FreeObjectInstance(FNewProc); (Pulsuz resurslar) FControl:=nil; (Dəyişənləri işə salın) FOldProc:=nil; FNewProc:=nil; son;

Bu üsul köhnə hadisə işləyicisini bərpa edir. O, HookProc metodundan çağırılır və komponentin destruktorundan da çağırılmalıdır - Hook həm pəncərə dağıdılanda, həm də bu komponent məhv edildikdə çıxarılmalıdır. Köhnə metodun ünvanı ilə SetWindowLong metodu köhnə mesaj işləyicisini bərpa edir. Bundan sonra, FreeObjectInstance metoduna zəng edərək resursları sistemə qaytarmalısınız.

Beləliklə, Hook proseduru ilə işləməyin əsas üsulları müəyyən edilmişdir. İndi siz dağıdıcını yenidən yazmalısınız ki, bu komponent məhv edildikdə Hook proseduru silinsin:

Destruktor TBeepWnd.Destroy; UnhookWindow-u işə salın; irsi məhv; son;

Və nəhayət, dərc edilmiş bölmədə obyekt müfəttişində göstəriləcək bir xüsusiyyəti müəyyənləşdiririk:

mülkiyyət Nəzarəti:TWinControl oxumaq FControl yazmaq HookWindow;

Yeni komponenti quraşdırmaq üçün biz əvvəllər müəyyən edilmiş metoda müraciət edirik, o, proqram işləyərkən dərhal komponentdə Hook prosedurunu "asacaq" və düyməyə basıldıqda səs siqnalı verəcəkdir. Xatırladaq ki, Beep operatorunun yerinə istənilən icra olunan kodu yaza bilərsiniz.

Komponent olduqca sadə şəkildə sınaqdan keçirilir: o, bir neçə TWinControl nəslinin komponentlərinin yerləşdirildiyi formada yerləşdirilir. Fonda TBeepWnd komponentini seçdikdən sonra obyekt müfəttişindəki Control sahəsində siçan düyməsini sıxmaq formada müəyyən edilmiş bütün TWinControl-u ehtiva edən siyahını genişləndirir. Onlardan birini seçib proqramı işə salmalısınız. Seçilmiş komponentdə siçanın sol düyməsini sıxdığınız zaman o, cızıltı verir.

Mülk redaktorları və komponent redaktorları

Əvvəlki bölmələrdə əhatə olunan hər şey istifadəçilərə paylanacaq proqram kodunun yaradılmasına aiddir. Bununla belə, Delphi inkişaf mühiti özünü dəyişdirməyə imkan verir. Bu, xüsusi bir dil bilmək tələb etmir, çünki inkişaf mühitini dəyişdirmək üçün bütün üsullar Delphi-də yazılmışdır. Burada bu üsullar, yəni mülkiyyət redaktorları və komponent redaktorları qismən - komponentlərlə işləmək üçün alətlər yaratmaq baxımından nəzərdən keçirilir. Bu bölmədəki materialları oxuyarkən aydın başa düşməlisiniz ki, tətbiqinizlə işləyən son istifadəçi heç vaxt nə mülkiyyət redaktorunu, nə də komponent redaktorunu görməyəcək - onlar proqramçılar üçün yaradılıb və yalnız Delphi inkişaf mühitində işləyirlər.

Əmlak redaktorları

Tətbiqlərin inkişafı zamanı xüsusiyyətlər Obyekt Müfəttişində göstərilir. Xahiş edirik unutmayın ki, xassələr Obyekt Müfəttişində fərqli şəkildə redaktə edilir. Bəzi xüsusiyyətlərə (En, Başlıq) yalnız yeni mətn dəyəri təyin edilə bilər. Kursor tipli xüsusiyyət dəyər seçmək üçün klikləyə biləcəyiniz açılan siyahı təqdim edir. TFont tipli xassə solda "+" işarəsinə malikdir; Bunun üzərinə kliklədiyiniz zaman genişlənir və ayrı-ayrı sahələri dəyişdirməyə imkan verir. Bundan əlavə, sağda üç nöqtəli bir düymə (elliptik düymə) var, kliklədikdə əmlak redaktoru dialoqu görünür.

Yuxarıda göstərilən xüsusiyyətlərin hər birinin öz redaktoru var və Delphi inkişaf mühitinin böyük üstünlüyü öz mülkiyyət redaktorlarınızı yaratmaq imkanıdır. Paylanmış komponentlər arasında yeni mülkiyyət redaktorları olduqca yaygındır. Lakin onlara ehtiyatla yanaşmaq lazımdır: ilkin olaraq testləri lazım gələrsə Delphi-ni yenidən quraşdıra biləcəyiniz kompüterdə aparın. Bir qayda olaraq, onlar ixtisaslı proqramçılar tərəfindən yaradılır və kodla bağlı heç bir şikayət yoxdur, lakin onlar tez-tez paylanmış əmlak redaktoruna hər hansı DLL daxil etməyi unudurlar. Belə bir redaktor quraşdırdıqdan sonra redaktə edilə bilməyən bir sıra xüsusiyyətlər əldə edirik - köhnə redaktor bloklanır, yenisi isə işləmir...

Yeni bir əmlak redaktoru yaratmazdan əvvəl, bunu etməyə dəyər olub olmadığını düşünmək mənasızdır - yəqin ki, standart redaktorlar arasında uyğun birini tapa bilərsiniz. Əgər əmlak redaktoru yaratmalısansa, qaydaya əməl etməlisiniz: standart məlumat növləri (tam ədəd, sətir və s.) üçün redaktorlar yaratmaqdan çəkinməlisiniz. Digər proqramçılar standart redaktorlara öyrəşiblər və sizinkini bəyənməyə bilərlər. Buna görə də, siz təvazökar olmalı və redaktoru TComponent sinfi üçün deyil, öz sinfiniz üçün qeydiyyatdan keçirməli olacaqsınız. Proqramçılar əmlak redaktorunuzu bəyənirsə, onların əksəriyyəti qeydiyyatı özləri dəyişdirə biləcəklər ki, redaktor bütün komponentlər üçün işləsin. Aşağıda redaktorun qeydiyyatı məsələsini müzakirə edəcəyik.

Beləliklə, bir model problemi qoyaq ki, onun həyata keçirilməsi üçün mülkiyyət redaktorunu tətbiq etmək lazımdır. Tutaq ki, hansısa komponentin özəlliyi var - həftənin günü. Prinsipcə, həftənin gününü daxil etmək üçün açılan siyahı ilə standart redaktordan istifadə edə bilərsiniz. Bununla belə, biz istəyirik ki, inkişaf mərhələsində olan proqramçı ya onun seriya nömrəsini (1 - Bazar ertəsi, 2 - Çərşənbə axşamı və s.), Ya da milli və ya ingilis dilində mətni göstərərək həftənin gününü daxil edə bilsin. Mətn daxil edərkən böyük və kiçik hərflərin qarışdırılmasına icazə verilir.

İlk növbədə, həftənin gününü saxlayacaq bir komponent yaratmalısınız. Component/New komponent əmrini çağıraraq yeni komponent yaradaq. TComponent-i əcdad sinif kimi seçək və yeni sinfə TDayStore adını verək. Bundan sonra komponenti palitraya quraşdırın. İndi həftənin gününü hansı formada saxlayacağımıza qərar verməliyik. Aydındır ki, birmənalı identifikasiya və resurslara qənaət etmək üçün o, etibarlı diapazonları 1-7 olan tam ədəd kimi saxlanmalıdır. Bununla belə, əgər biz mülkiyyət redaktoru yaratmaq niyyətindəyiksə, mövcud növlər üçün yeni redaktorlar yaratmamaq qaydasını xatırlamalıyıq. Buna görə də biz yeni tip - TDayWeek təyin edəcəyik və onunla bütün əməliyyatlar tam ədədlərlə olduğu kimi yerinə yetiriləcək. Komponentin özəl bölməsində FDay dəyişənini təyin edək. Defolt konstruktor icra edildikdə bu dəyişən 0-a başlayacağına və bu nömrə icazə verilən dəyərlərdən kənara çıxacağına görə konstruktor yenidən yazılmalıdır. Nəhayət, obyekt inspektorunda göstərmək üçün dərc olunmuş bölmədə DayWeek xassəsini müəyyən edək. Son komponent belə görünür:

TDayWeek yazın=tam ədəd yazın; TDayStore = class(TComponent) özəl ( Şəxsi bəyannamələr ) FDay:TDayWeek; qorunan ( Qorunan bəyannamələr ) ictimai ( İctimai bəyannamələr ) konstruktor Yarat(AOwner:TComponent); ləğv etmək; nəşr edilmiş ( Nəşr edilmiş bəyannamələr ) əmlak DayHəftə:TDayHəftə oxumaq FDay yaz FDay; son; ... icra konstruktoru TDayStore.Create(AOwner:TComponent); miras alınan Yaratmağa başlayın (Sahibi); FGün:=1; son;

Yeni bir növün tərifinin nadir qurulmasına diqqət yetirməyə dəyər

TDayWeek=tam ədədi yazın;

Beləliklə, tam ədədlə eyni ölçüdə olan yeni məlumat növü təqdim edilir, bu məlumat növü üzrə bütün əməliyyatlar tam ədədlərlə aparılır; Bu əməliyyatın məqsədi mülkiyyət redaktorumuzun xüsusi olaraq ona tətbiq oluna bilməsi və digər məlumat növlərinə təsir göstərməməsi üçün yeni məlumat tipini elan etməkdir.

İndi TDayWeek mülkiyyəti üçün redaktor yaradaq. Bunu etmək üçün mövcud layihəyə yeni forma əlavə edin, onu hansısa uyğun adla (DayPropE.pas) yadda saxlayın və onu layihədən çıxarın. Bundan sonra biz formanı ayrıca fayl kimi açacağıq və orada mülkiyyət redaktorunu tətbiq edəcəyik. Birinci mərhələdə forma bizə lazım olmayacaq, amma sonra onun üzərində dialoq həyata keçirəcəyik.

Əmlak redaktorlarının yaradılması modulu DsgnIntf.pas (Dizayn İnterfeysi) adlanır, o, TPropertyEditor baza sinfini və standart xassələri redaktə etmək üçün nəzərdə tutulmuş nəsil sinifləri - TIntegerProperty, TFloatProperty, TStringProperty və s. müəyyən edir. Əmlak redaktorlarının işləmə mexanizmi aşağıdakı kimidir:

  1. Delphi inkişaf mühitində RegisterPropertyEditor metodunu çağıraraq qeydiyyata alınır. Bu üsul aşağıdakı dəyərləri parametr kimi qəbul edir:

    a) bu redaktorun nəzərdə tutulduğu redaktə üçün xassələrin növü haqqında məlumat. Bu məlumatlara görə biz TDayWeek yeni növünü təyin etməli olduq;

    b) bu ​​redaktorun tətbiq oluna biləcəyi komponent haqqında məlumat. Redaktor yalnız göstərilən komponent üçün deyil, həm də onun bütün nəsilləri üçün çağırılacaqdır. Bunu TComponent-ə təyin etsəniz, redaktor istənilən komponent üçün çağırılacaq;

    c) bu redaktorun istifadə olunduğu əmlakın adı. Əgər ad boş sətirdirsə, yuxarıdakı iki filtrdən istifadə olunur;

  2. GetValue metodu xassələrin cari dəyərini komponentdən oxumaq lazım olduqda çağırılır. İstənilən əmlak üçün bu üsul obyekt müfəttişinə yerləşdirilən sətri qaytarır.
  3. SetValue metodu proqramçı Obyekt Müfəttişində yeni bir xassə dəyəri daxil etdikdə çağırılır. Parametr kimi yeni sətir ötürülür. Metodda o, təhlil edilməli və redaktə olunan əmlakın növünə çevrilməlidir.

GetValue və SetValue üsulları yenidən yazıldıqda, yeni mülkiyyət redaktorları yaradılır; Beləliklə, indi biz yeni əmlak redaktoru yaratmağa başlaya bilərik.

DayPropE.pas modulunun istifadələr bölməsindəki DsgnIntf ​​moduluna müraciət edək və İnterfeys bölməsində yeni sinif təyin edək:

Yazın TDWPropED=class(TPropertyEditor) ictimai funksiyası GetValue:string; ləğv etmək; prosedur SetValue(const Value:string); ləğv etmək; son;

İcra bölməsi bu metodların hər ikisini həyata keçirməlidir. Bu halda, əlavə olaraq həftənin günlərinin adlarının siyahısına ehtiyacımız var - problemin ilkin tərtibində proqramçıdan həftənin gününü daxil edə bilməsi tələb olunur:

Davamlı Gün Həftəsi: sətir massivi = ("Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə", "Bazar"); DayWeekEn:array of string = ("Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə", "Bazar");