Delphi World - Решение за динамично създавани компоненти

delphi

Ако просто искате да създадете компоненти от типа, от който се нуждаете по време на изпълнение, разгледайте delphi\doc\VB2Delph.wri и следвайте неговите препоръки, все още няма по-добър начин да научите тази тема. Този съвет е относно използването на RTTI в Delphi.

Първо, във вашето приложение трябва да регистрирате всички класове, които ще създадете някъде във вашия код. Това може да стане с помощта на функциите RegisterClass(), RegisterClasses() и RegisterClassAlias().

Това може да ви накара да се замислите за ограниченията, но Delphi е строг език. Ако искате наистина динамично създаване на обекти в свободно въведена среда с късно свързване, използвайте динамичен език като Smalltalk. Подозирам, че Delphi използва този механизъм за регистрация, за да регистрира всички компоненти в DCL, когато се стартира, като по този начин позволява всеки компонент да бъде създаден по време на проектиране.

Създаване на компоненти. Използвайте функцията FindClass(), за да получите препратка към класа на компонента, който искате да създадете, и извикайте неговия метод Create. Лесно, нали? В примера съм прехвърлил SomeComponent към TControl, след което мога да задам родителското свойство (мога да направя това, защото знам, че всички класове, които съм регистрирал, са наследници на TControl). За да може визуалният компонент да се показва във формуляра, трябва да зададете родителското свойство.

Сега, след като сте създали компонента си, как да зададете свойствата му, без да използвате най-големия блок в регистъра във вселената? Много просто: GetPropInfo() се използва за получаване на информация за свойство от структура на информация за типа по време на изпълнение (RTTI), а след това се използва набор за задаване на стойностите.функции SetXXXXProp(). (Забележка: тези функции не са документирани в помощните файлове на Delphi. OO програмистите, както разбирам, използват примери от кода на други хора и не преоткриват собственото си колело.) Всяка функция SetXXXXProp() има сателитна функция GetXXXXProp(), която ви позволява да получите стойностите на свойствата на обекта.

Можете също да зададете стойностите на свойствата Set, Class и Method, но това ще бъде малко по-сложно. Малко по-късно ще обясня как може да стане това.

Това е всичко. Ще си прекарате страхотно, като се вглеждате в изходния код на VCL и се чудите кога ще го видите сами.

Това е чудесен начин, но има потенциал за масова злоупотреба. Необходимо е да разберете други начини за постигане на тази цел и да изберете подходящата техника, когато създавате вашите проекти в Delphi.