Достъп до компоненти на формуляр

Систематизиран и преработен материал.

Когато създава програма в средата на Borland C++ Builder, програмистът поставя много компоненти върху формата (различни бутони, менюта, таймери, графични контейнери, списъци и т.н.). Естествено възниква въпросът - как програмно да достигнем до един или друг компонент. Отговорът е прост - по името на компонента. Но например, когато няколко елемента са затворени за един манипулатор на събития, тогава въпросът как да се определи кой компонент е причинил събитието изобщо не става толкова прост. И в същото време няколко механизма на Borland C++ Builder ви позволяват да изпълнявате тази и други задачи, които възникват на практика.

Достъп чрез преобразуване на статичен тип

Директно преобразуване на типа

Този манипулатор скрива бутона, който е задействал събитието кликване:

Този манипулатор може да бъде присвоен на няколко компонента наведнъж, но само на TButton. Ако се опитате да преобразувате към друг тип компонент, програмата ще хвърли изключение за преобразуване на типа. Ако е необходимо да се извърши преобразуване от неизвестен клас, тогава могат да се използват конструкции try. catch, но е по-лесно да използвате динамичен каст - операторът dynamic_cast.

Конвертирайте в TTreeView

Следният код прави същото като предишния (скрива бутона):

Преобразуването в класа TTreeView ви позволява лесно да получите всяко свойство на обекта. Например, да кажем, че манипулаторите на събития OnClick на два бутона сочат към един и същ код Button1Click(). За бутон 2 задайте свойството Cursor на crHandPoint.

Достъп чрез динамично преобразуване на типа

Динамичното преобразуване на типове е достъпно в програмата чрез конструкцията:

Динамичното преобразуване ви позволява да опитате преобразуванеот някакъв тип обект към посочения тип и при успех се връща ненулева стойност. Така че, ако манипулаторите на щракване на два бутона от компонента TButton и един бутон от компонента TSpeedButton са затворени за един код, тогава когато бутоните на компонентите TButton са натиснати, те ще бъдат скрити и нищо няма да се случи, когато се натисне бутонът на компонента TSpeedButton:

Ако събитията на няколко идентични компонента използват едни и същи функции, тогава е препоръчително да ги затворите към един манипулатор и можете да разграничите обектите вътре в манипулатора чрез свойството Tag, като му присвоите различни стойности за компонентите.

Например, нека няколко бутона на компонента TSpeedButton имат свойствотоTag, равно на номера на бутона в съответствие с техния номер, тогава:

Чрез конструиране на ((компонентен клас*)(Подател))-> също така е възможен достъп до всяко свойство на обекта.

Достъп по номер на компонент в йерархията на обекта

Всички компоненти на формуляра също се съхраняват в масива Components. Когато даден компонент е поставен във формуляр, автоматично му се присвоява допълнителен номер в масива Components и броят на компонентите във формуляра се съхранява в свойството ComponentCount. Използвайки това, можете да получите достъп до всеки компонент на формуляр. По този начин, следната функция търси сред всички компоненти на формуляр за TLabel компоненти и сред тях за компонента с необходимия номер. След като намери необходимия компонент, записва текст в него:

Като алтернатива можете да използвате свойството Tag, за да идентифицирате конкретен компонент. Например, ако във формуляра има 100 панела, свойството Етикет на панела определя номера на панела (1-100). При предаване на числото n на функцията, всички панели с число, по-голямо от n, ще изчезнат.

Подобно на свойството Tag, можете да използвате всяко свойство, което притежава компонентът. В следния код (бркод от играта "Bricks", в която изображението може да бъде разделено на фрагменти от 4*4 до 10*10) тази конструкция се използва за позициониране на TImage в зависимост от неговия брой и коефициенти, изчислени за определяне на необходимата позиция на фрагмента от изображението:

Подчиняване на обект и определяне на вида му

С помощта на функцията ClassType() можете да определите класа източник на събитие (в примера за компонента TButton), а след това, използвайки функцията ClassParent(), можете да се придвижите нагоре в йерархията на обекта. Този код е поставен тук, защото методът ClassName() може да се използва за проверка на типа на обект, преди да го използвате.

Пример за използване на метода ClassType() за проверка на източника, причинил това събитие: