Злом компонентів

У VCL деякі компоненти приховують властивості або методи своїх батьків: мабуть, розробники вважали, що так буде краще. Найпростіший приклад з DBGrid - ми не можемо змінити висоту окремої колонки програмно, а іноді дуже хочеться. Подивимося на ієрархію компонента (рис. 1.5). Як бачите, серед батьків є TCustomGrid (сітка таблиці, від якої все і йде), а у нього є властивість RowHeights, що дозволяє змінити висоту будь-який рядка. В нащадках це властивість закрито, але воно залишається.

Як же отримати доступ до властивості, якщо воно закрите? Дуже просто. Потрібно привести компонент до виду батька:

У цьому прикладі ми змінюємо висоту першого рядка компонента DBGrid. На рис. 1.6 показаний результат роботи коду, а на компакт-диску можна знайти проект, який використовує такий нехитрий прийом.

Бувають випадки, коли потрібно отримати доступ до закритих (private або protected) властивостями або методів компонента. За ідеєю, до закритих речей неможливо отримати доступ, але це тільки ідея, яка на практиці легко зламуються

Вихідний код розглянутого тут приклад знаходиться на компакт-диску в каталозі Sources \ ch01 \ HackGrid.

Злом компонентів

Мал. 1.5. Ієрархія компонента DBGrid

Злом компонентів

Мал. 1.6. Приклад збільшення висоти окремого рядка в DBGrid

Все, що знаходиться в розділі protected, можна без проблем використовувати, зробивши всього пару маніпуляцій. Наприклад, у кнопки TButton є protected метод Сгеа-teWnd. Якщо спробувати викликати його безпосередньо, то виникне помилка Спробуємо зламати цей клас.

Створіть новий проект і помістіть на форму кнопку Тепер в розділі type модуля після опису класу форми додамо опис класу TMyButton, який буде нащадком від TButton:

Ніякі властивості і методи цього класу не потрібні. Тепер до закритого методу можна отримати доступ, написавши такий рядок:

Ось так, через дружній клас, ми отримали доступ до закритого методу і, можливо, заощадили масу часу на переписуванні необхідного коду, який був всього лише закритий.

Розробники фірми Borland закривають методи не просто так. Якщо щось було закрито, це означає, що використання з інших класів небажано або навіть небезпечно. Саме тому користуватися цим методом потрібно дуже обережно і після використання ретельно протестувати приклад на працездатність.

Вихідний код розглянутого тут приклад знаходиться на компакт-диску в каталозі Sources \ chO l \ HackButton.

Схожі статті