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

Как же получить доступ к свойству, если оно закрыто? Очень просто. Нужно привести компонент к виду родителя:

TStringGrid(DBGridl).RowHeights[l] := 100.

В этом примере мы изменяем высоту первой строки компонента DBGrid. На рис. 1.6 показан результат работы кода, а на компакт-диске можно найти проект, использующий такой нехитрый прием.

Бывают случаи, когда нужно получить доступ к закрытым (private или protected) свойствам или методам компонента. По идее, к закрытым вещам невозможно получить доступ, но это только идея, которая на практике легко взламывается

ПРИМЕЧАНИЕ -

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

1.8.2. Взлом компонентов

Рис. 1.5. Иерархия компонента DBGrid

1.8.2. Взлом компонентов

Рис. 1.6. Пример увеличения высоты отдельной строки в DBGrid

Все, что находится в разделе protected, можно без проблем использовать, сделав всего пару манипуляций. Например, у кнопки TButton есть protected метод Сгеа-teWnd. Если попытаться вызвать его напрямую, то возникнет ошибка Попробуем взломать этот класс.

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

TMyButton = class(TButton) end:

Никакие свойства и методы этому классу не нужны. Теперь к закрытому методу можно получить доступ, написав следующую строку:

TMyButtonC Buttonl).CreateWnd:

Вот так, через дружественный класс, мы получили доступ к закрытому методу и, возможно, сэкономили массу времени на переписывании необходимого кода, который был всего лишь закрыт.

Разработчики фирмы Borland закрывают методы не просто так. Если что-то было закрыто, это значит, что использование из других классов нежелательно или даже опасно. Именно поэтому пользоваться этим методом нужно очень осторожно и после использования тщательно протестировать пример на работоспособность.

ПРИМЕЧАНИЕ -

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

Глава 2

1.8.1. Когда нужно создавать свои компоненты || Оглавление || Оптимизация


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31