Динамично креирање Делпхи компоненти (у току рада)

Најчешће када програмирате у Делпхију не морате динамички да креирате компоненту. Ако испустите компоненту на образац, Делпхи аутоматски обрађује стварање компоненте када се облик створи. Овај чланак ће покрити исправан начин за програмско креирање компоненти током извођења.

Стварање динамичких компоненти

Постоје два начина за динамичко стварање компоненти. Један од начина је да образац (или неки други ТЦомпонент) направите власником нове компоненте. Ово је уобичајена пракса за изградњу сложених компоненти где визуелни спремник ствара и поседује поткомпоненте. То ће осигурати да се новостворена компонента уништи када се уништи власничка компонента.

Да бисте креирали инстанцу (објекат) класе, ви зовете њену "Цреате" методу. Конструктор Цреате је а метода класе, за разлику од готово свих других метода на које ћете наићи у Делпхи програмирању, а то су објектне методе.

На пример, ТЦомпонент декларише Цреате конструктор на следећи начин:

конструктор Цреате (АОвнер: ТЦомпонент); виртуално;

Динамична креација са власницима

instagram viewer

Ево примера динамичког стварања, где Ја је потомак ТЦомпонент или ТЦомпонент (нпр. примерак ТФорм-а):

са ТТимер-ом. Креирајте (Селф) урадите
започети
Интервал: = 1000;
Омогућено: = Лажно;
ОнТимер: = МиТимерЕвентХандлер;
крај;

Динамична креација са експлицитним позивом на бесплатно
Други начин креирања компоненте је употреба нула као власник. Имајте на уму да ако то учините, такође морате изричито ослободити објект који креирате чим вам више није потребан (или ћете произвести цурење меморије). Ево примера коришћења нил-а као власника:

са ТТабле-ом. Креирајте (нил) урадите
покушати
ДатаБасеНаме: = 'МиАлиас';
ТаблеНаме: = 'МиТабле';
Отворено;
Уредити;
ФиелдБиНаме ('заузето'). АсБоолеан: = Тачно;
Пошта;
напокон
Бесплатно;
крај;

Динамичко креирање и референце објекта
Два претходна примера могуће је побољшати додељивањем резултата Креирај позив променљивој локалној методи или припадности класи. Ово је често пожељно када се спомињу саставни део треба користити касније или када сцопинг проблеме који потенцијално могу да изазову блокови „Витх“ треба избегавати. Ево ТТимер кода за креирање одозго, користећи варијаблу поља као референцу на инстантирани ТТимер објект:

ФТимер: = ТТимер. Креирајте (Селф);
са ФТимер до
започети
Интервал: = 1000;
Омогућено: = Лажно;
ОнТимер: = МиИнтерналТимерЕвентХандлер;
крај;

У овом примеру „ФТимер“ је променљива приватног поља облика или визуелног контејнера (или шта год да је „Селф“). Када приступате ФТимер варијабли са метода из ове класе, веома је добра идеја да проверите да ли је референца валидна пре него што је користите. То се ради помоћу додељене функције Делфа:

ако је додељено (ФТимер) онда ФТимер. Омогућено: = Тачно;

Динамичко креирање и референце објекта без власника
Варијација у томе је креирање компоненте без власника, али одржавање референце за касније уништавање. Конструкцијски код ТТимера изгледао би овако:

ФТимер: = ТТимер. Креирај (нула);
са ФТимер до
започети
...
крај;

А код за уништење (вероватно у деструктору форме) изгледао би овако:

ФТимер. Бесплатно;
ФТимер: = нил;
(*
Или користите поступак ФрееАндНил (ФТимер) који ослобађа референцу објекта и замењује референцу нил.
*)

Постављање референције објекта на нулу критично је приликом ослобађања објеката. Позив на Фрее најприје провјерава је ли референца објекта нула или не, а ако није, позива деструктор објекта Дестрои.

Динамичко креирање и референце локалног објекта без власника

Ево ТТабле кода стварања одозго, користећи локалну варијаблу као референцу на инстантирани ТТабле објект:

лоцалТабле: = ТТабле. Креирај (нула);
покушати
са локалном таблицом
започети
ДатаБасеНаме: = 'МиАлиас';
ТаблеНаме: = 'МиТабле';
крај;
...
// Касније, ако желимо експлицитно одредити опсег:
лоцалТабле. Отворено;
лоцалТабле. Уредити;
лоцалТабле. ФиелдБиНаме ('заузето'). АсБоолеан: = Тачно;
лоцалТабле. Пошта;
напокон
лоцалТабле. Бесплатно;
лоцалТабле: = нил;
крај;

У горњем примеру, "лоцалТабле" је а локална променљива декларисан на исти начин који садржи овај код. Имајте на уму да је након ослобађања било којег предмета генерално добра идеја поставити референцу на нулу.

Реч упозорења

ВАЖНО: Не мешајте позив на Фрее са давањем ваљаног власника конструктору. Све претходне технике ће радити и важеће су, али следеће би требало никад се не појављују у вашем коду:

са ТТабле-ом. Креирајте (само) радите
покушати
...
напокон
Бесплатно;
крај;

Горњи пример кода уводи непотребне поготке перформанси, мало утиче на меморију и има потенцијал да уведе тешко проналажење грешака. Сазнати зашто.

Напомена: Ако динамички створена компонента има власника (одређено параметром АОвнер конструктора Цреате), тада је тај власник одговоран за уништавање компоненте. У супротном, морате изричито назвати Бесплатно када компонента више не треба.

Чланак изворно написао Марк Миллер

У Делфима је направљен тестни програм како би се временски створило динамично стварање 1000 компоненти са различитим бројем почетних компоненти. Тестни програм појављује се на дну ове странице. Графикон приказује скуп резултата из програма тестирања, упоређујући време потребно за стварање компоненти и са власницима и без њих. Имајте на уму да је ово само део хита. Слично одлагање перформанси може се очекивати при уништавању компонената. Време за динамичко креирање компоненти са власницима је 1200% до 107960% спорије него за креирање компоненте без власника, овисно о броју компоненти у облику и компоненти која се налази креирано.

Програм тестирања

Упозорење: Овај тест програм не прати и бесплатне компоненте које су креиране без власника. Не пратећи и ослобађајући ове компоненте, времена измерена за динамички код за креирање тачније одражавају стварно време за динамичко креирање компоненте.

Преузмите изворни код

Упозорење!

Ако желите да динамички инстанцирате Делпхи компоненту и изричито је ослободите нешто касније, увек унесите нил као власника. Ако то не учините, можете увести непотребан ризик, као и проблеме са перформансама и одржавањем кода. Прочитајте чланак „Упозорење о динамички инстантизацији Делпхи компоненти“ да бисте сазнали више ...