Доступ до компонентів форми

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

Створюючи програму серед 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рівну номеру кнопки, тоді:

За допомогою конструкції ((клас компонента*)(Sender))-> також можна отримати доступ до будь-якої якості об'єкта.

Доступ за номером компонента в ієрархії об'єктів

Всі компоненти на формі зберігаються також у масиві Components. При перенесенні компонента на форму йому автоматично присвоюється наскрізний номер у масиві Components, а кількість компонентів на формі зберігається як ComponentCount. Використовуючи це, можна здійснити доступ до будь-якого компонента форми. Так, наступна функція шукає серед усіх компонентів форми компоненти TLabel і серед них компоненту з необхідним номером. Після знаходження необхідної компоненти записує до неї деякий текст:

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

Аналогічно властивості Tag можна використовувати будь-яку властивість, яка має компонент. У наступному коді (шматочоккоду з гри "Bricks"у якій зображення може бути розбите на від 4*4 до 10*10 фрагментів) ця конструкція використана для позиціонування TImage залежно від його номера та коефіцієнтів, розрахованих для визначення необхідного положення фрагмента зображення:

Підпорядкованість об'єкта та визначення його типу

Використовуючи функцію ClassType() можна визначити клас джерела події (у прикладі для компонента TButton), а далі, застосовуючи функцію ClassParent(), можна рухатися вгору по ієрархії об'єктів. Цей код розміщений тут через те, що метод ClassName() може бути використаний для перевірки типу об'єкта перед його використанням.

Приклад використання методу ClassType() для перевірки джерела, що викликало цю подію: