Maraqlıdır

Komponentləri dinamik yaratmaq (Run-Time)

Komponentləri dinamik yaratmaq (Run-Time)

Delphi-də proqramlaşdırma zamanı dinamik bir komponent yaratmağa ehtiyac yoxdur. Bir komponenti bir formaya salsanız, Delphi, forma yaradıldıqda avtomatik olaraq komponentin yaradılması ilə işləyir. Bu məqalə proqram vaxtında komponentləri yaratmaq üçün düzgün yolu əhatə edəcəkdir.

Dinamik komponentlərin yaradılması

Komponentləri dinamik şəkildə yaratmağın iki yolu var. Bir yolu, bir forma (və ya digər TComponent) yeni komponentin sahibi etməkdir. Vizual bir konteyner alt komponentləri yaradan və sahibi olduğu kompozit komponentlər qurarkən bu çox yaygın bir tətbiqdir. Bunu etmək, sahib olan komponent məhv edildikdə yeni yaradılan komponentin məhv olmasını təmin edəcəkdir.

Bir sinifin bir nümunəsi (obyekti) yaratmaq üçün onu "Yarat" metodu adlandırırsınız. Create konstruktor, obyekt metodları olan Delphi proqramlaşdırmasında qarşılaşacağınız demək olar ki, bütün digər metodlardan fərqli olaraq sinif metodudur.

Məsələn, TComponent Create konstruktorunu aşağıdakı kimi elan edir:

konstruktor yaradın (AOwner: TComponent); virtual;

Sahibləri ilə dinamik yaradılması
Dinamik bir yaradılış nümunəsi, burada Özü bir TComponent və ya TComponent nəslindəndir (məsələn, TForm nümunəsi):

ilə TTimer.Create (Self) edin
başlamaq
Aralıq: = 1000;
Aktivləşdirilib: = Yalan;
OnTimer: = MyTimerEventHandler;
son;

Pulsuz Çağırış ilə Dinamik Yaradılış
Bir komponent yaratmaq üçün ikinci yol istifadə etməkdir nil sahibi kimi. Diqqət yetirin ki, bunu etsəniz, yaratdığınız obyekti artıq ehtiyacınız olmadığı müddətdə açıq şəkildə azad etməlisiniz (və ya yaddaş sızması yaratacaqsınız). Nilin sahibi kimi istifadə edilməsinə dair bir nümunə:

ilə TTable.Create (nil) do
cəhd edin
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Açıq;
Düzəliş et;
FieldByName ('Məşğul'). AsBoolean: = Doğru;
Poçt;
nəhayət
Pulsuz;
son;

Dinamik yaradılması və obyekt istinadları
Əvvəlki iki nümunəni metodu yerli və ya sinifə aid olan dəyişənə Yaratmaq çağırışının nəticəsini təyin etməklə artırmaq mümkündür. Bu tez-tez komponentə istinadlar daha sonra istifadə edilməli olduqda və ya "İlə" blokları ilə əlaqəli problemlərin qarşısını almaq lazım olduqda arzu olunur. İşdə TTimer obyektinə istinad olaraq bir sahə dəyişənini istifadə edərək yuxarıdan TTimer yaratmaq kodu:

FTimer: = TTimer.Create (Özü);
FTimer ilə
başlamaq
Aralıq: = 1000;
Aktivləşdirilib: = Yalan;
OnTimer: = MyInternalTimerEventHandler;
son;

Bu misalda "FTimer" forma və ya vizual konteynerin (və ya "Özü" nə aiddir) özəl bir sahə dəyişənidir. Bu sinifdəki metodlardan FTimer dəyişəninə daxil olduqda, istinaddan istifadə etmədən əvvəl etibarlı olub olmadığını yoxlamaq çox yaxşı bir fikirdir. Bu Delphi'nin Təyin edilmiş funksiyasından istifadə etməklə edilir:

təyin olunarsa (FTimer), onda FTimer.Enabled: = Doğru;

Sahibləri olmadan dinamik yaradılması və obyekt istinadları
Bunun bir dəyişməsi, heç bir sahibi olmayan komponent yaratmaq, ancaq sonradan məhv etmək üçün arayış saxlamaqdır. TTimer üçün tikinti kodu bu kimi görünür:

FTimer: = TTimer.Create (nil);
FTimer ilə
başlamaq

son;

Və məhv kodu (ehtimal ki, formanın dağıdıcısında) bu kimi bir şeyə bənzəyirdi:

FTimer.Free;
FTimer: = nil;
(*
Və ya obyekt istinadını sərbəst buraxan və arayışı nil ilə əvəz edən FreeAndNil (FTimer) prosedurundan istifadə edin.
*)

Obyekt istinadını nil-ə təyin etmək obyektləri azad edərkən vacibdir. Pulsuz ilk zəng, obyekt istinadının nil olub olmadığını yoxlamaq üçün yoxlanılır və bu olmadıqda obyektin məhvedicisini məhv edir.

Sahibsiz dinamik yaradılması və yerli obyekt istinadları

Budur TTable obyektinə istinad olaraq yerli dəyişəndən istifadə edərək yuxarıdan TTable yaratma kodu:

localTable: = TTable.Create (nil);
cəhd edin
yerliTable ilə
başlamaq
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
son;

// Daha sonra, əhatə dairəsini dəqiq göstərmək istəsək:
yerliTable.Open;
yerliTable.Edit;
yerliTable.FieldByName ('Məşğul'). AsBoolean: = Doğru;
yerliTable.Post;
nəhayət
yerliTable. Pulsuz;
yerliTable: = nil;
son;

Yuxarıdakı nümunədə, "localTable" bu kodu ehtiva edən eyni üsulla elan edilmiş yerli bir dəyişəndir. Qeyd edək ki, hər hansı bir obyekti sərbəst buraxdıqdan sonra ümumiyyətlə nil nişanını təyin etmək çox yaxşı bir fikirdir.

Xəbərdarlıq Sözü

ƏHƏMİYYƏTLİ: Etibarlı bir sahibi konstruktora ötürməklə pulsuz bir zəng qarışdırmayın. Əvvəlki texnikaların hamısı işləyəcək və etibarlıdır, lakin aşağıdakılar olmalıdır kodunuzda heç vaxt baş vermir:

ilə TTable.Create (self) do
cəhd edin

nəhayət
Pulsuz;
son;

Yuxarıdakı kod nümunəsi lazımsız performans hitlərini təqdim edir, yaddaşa bir az təsir edir və səhvləri tapmaqda çətinlik çəkmək potensialına malikdir. Səbəbini öyrənin.

Qeyd: Dinamik olaraq yaradılmış bir komponentin sahibi varsa (Yaratma konstruktorunun AOwner parametri ilə təyin olunmuşdur), onda həmin sahə komponentin məhv edilməsinə cavabdehdir. Əks təqdirdə, artıq komponentə ehtiyacınız olmadıqda açıq şəkildə Pulsuz zəng etməlisiniz.

Əvvəlcə yazdı Mark Miller

Delphi-də müxtəlif ilkin komponent sayımları ilə 1000 komponentin dinamik yaradılması üçün bir test proqramı yaradıldı. Test proqramı bu səhifənin aşağı hissəsində görünür. Diaqram, həm sahibləri ilə, həm də olmadan komponentləri yaratmaq üçün aldığı vaxtı müqayisə edərək, test proqramından bir sıra nəticələr göstərir. Qeyd edək ki, bu vuruşun yalnız bir hissəsidir. Komponentləri məhv edərkən oxşar bir performans gecikməsini gözləmək olar. Sahibləri ilə komponentləri dinamik şəkildə yaratmaq vaxtı, forma və yaradılan komponentlərin sayından asılı olaraq, sahibləri olmayan komponentlər yaratmaqdan 1200% - 107960% daha yavaşdır.

Test Proqramı

Xəbərdarlıq: Bu test proqramı sahibi olmadan yaradılan komponentləri izləmir və sərbəst buraxmır. Bu komponentləri izləmədən və sərbəst buraxmadan dinamik bir yaradılması kodu üçün ölçülən vaxtlar dinamik bir komponent yaratmaq üçün real vaxtı daha dəqiq əks etdirir.

Mənbə Kodunu yükləyin

Xəbərdarlıq!

Bir Delphi komponentini dinamik şəkildə hazırlamaq və bir müddət sonra açıq şəkildə sərbəst buraxmaq istəyirsinizsə, həmişə sahibi kimi sıfırdan keçin. Bunu etməməsi lazımsız bir risk, habelə performans və kod baxım problemləri ilə nəticələnə bilər. Daha çox məlumat üçün "Dinamik hazırlayan Delphi komponentləri haqqında bir xəbərdarlıq" məqaləsini oxuyun ...


Videoya baxın: 30 полезных автотоваров с Aliexpress, которые упростят жизнь любому автовладельцу Автоподборка 19 (Avqust 2021).