Главная » Delphi » Реализация компонента TRunBtnItem

0

Конструктор TRunBtnItem.Create() создает  экземпляр компонента TddgRun- Button. Каждый  элемент TRunBtnItem в коллекции обслуживает собственный эк земпляр TddgRunButton. Следующие две строки конструктора требуют пояснения:

FRunButton := TddgRunBut- ton.Create(TRunButtons(Collection).FLaunchPad); FRunButton.Parent := TRunButtons(Collection).FLaunchPad;

При  выполнении первой строки кода создается экземпляр компонента TddgRun- Button —   FRunButton. Владельцем экземпляра  FRunButton является  переменная FLaunchPad, которая представляет собой  экземпляр компонента TddgLaunchPad и поле объекта TCollection, передаваемого в качестве параметра. Необходимо ис пользовать экземпляр FLaunchPad в качестве владельца экземпляра FRunButton, по тому что  ни  экземпляр компонента TRunBtnItem, ни  объект TRunButton не  могут быть  владельцами (так  как они  являются потомками класса  TPersistent). Запомни те, что владельцем может быть только  потомок класса TComponent!

Хотелось бы обратить внимание на проблему, возникающую  при  использовании экземпляра класса FLaunchPad в качестве владельца экземпляра FRunButton. Экзем пляр  FLaunchPad сделан владельцем FRunButton во время  разработки. Обычное по ведение механизма взаимодействия с потоками заставит Delphi  при  сохранении фор мы записать в поток  экземпляр класса  FRunButton как компонент, принадлежащий экземпляру FLaunchPad. Но этого как раз и не нужно, поскольку  экземпляр FRunBut- ton создается в конструкторе компонента TRunBtnItem на основе информации, за писанной в поток  в контексте компонента TRunBtnItem. Ниже  показано, каким обра зом   предотвратить  запись   в   поток    компонентов  TddgRunButton компонентом TddgLaunchPad во избежание подобного нежелательного поведения.

Вторая строка приведенного выше фрагмента кода назначает экземпляр FLaunch- Pad родителем экземпляра FRunButton, чтобы  тот  отвечал за отображение компо нента  FRunButton.

Деструктор TRunBtnItem.Destroy() освобождает экземпляр FRunButton перед вызовом унаследованного деструктора.

При  определенных обстоятельствах необходимо переопределить метод  Trun- BtnItem.Assign(). Примером таких  обстоятельств может  служить  ситуация, когда приложение запускается первый раз  и форма считывается из  потока. Именно с по мощью  метода  Assign() экземпляру компонента TRunBtnItem выдается указание присвоить потоковые значения своих  свойств свойствам компонента, которого он контролирует (в данном случае это компонент TddgRunButton).

Другие  методы  —  это  просто методы  доступа  к различным свойствам компонента

TRunBtnItem (они разъясняются в комментариях, содержащихся в листинге).

Реализация компонента TRunButtons

Метод  TRunButtons.Create() присваивает указателю   FLaunchPad ссылку  на параметр типа  TddgLaunchPad —  LaunchPad, для того  чтобы  на него  можно  было ссылаться в дальнейшем.

Метод  TRunButtons.Update() вызывается  при  изменении  одного  из  экземпля

ров  компонента  TRunBtnItem.  Этот  метод  содержит  определенный  алгоритм,  вы полняющийся при  такого  рода  изменении, и используется для вызова  метода  компо нента   TddgLaunchPad,  который  перерисовывает  экземпляры  TRunBtnItem.  Был также  добавлен открытый метод  UpdateRunButtons(), который принудительно (по желанию пользователя) перерисовывает элементы.

Остальные методы компонента TRunButtons являются методами доступа к свой

ствам, они описаны в комментариях к листингу 12.11.

Реализация компонента TddgLaunchPad

Конструктор и деструктор  компонента TddgLaunchPad не  отличаются большой сложностью. Метод TddgLaunchPad.Create() создает  экземпляр объекта TRunBut- tons и  передает ему  себя  в  качестве параметра  конструктора. Деструктор  Tddg- LaunchPad.Destroy() освобождает экземпляр компонента TRunButtons.

Переопределение метода  TddgLaunchPad.GetChildren() —  очень  важный  мо мент.  Благодаря ему предотвращается запись  в поток  экземпляров компонента TddgRunButton, хранимых в коллекции, как компонентов с владельцем Tddg- LaunchPad. Запомните: это необходимо, так как они должны  создаваться не в контек сте  объекта TddgLaunchPad, а в контексте экземпляров компонента TRunBtnItem. Поскольку ни один  компонент TddgRunButton не передается в процедуру  Proc, они не будут записываться или считываться из потока.

Метод  TddgLaunchPad.UpdateRunButton() используется для  отображения эк земпляров TddgRunButton, которые содержатся в коллекции. Логика, реализованная в этом методе, гарантирует, что кнопки никогда  не “выйдут” за пределы панели TddgLaunchPad. Поскольку компонент TddgLaunchPad —  потомок класса  TScroll- Box, прокрутка будет осуществляться в вертикальном направлении.

Остальные методы — просто методы доступа к свойствам. Они описаны в коммен

тариях листинга 12.11.

Наконец, регистрируем  редактор свойств класса  коллекции TRunButtons в про цедуре  Register() данного модуля. В следующем разделе как раз и рассматривается этот редактор свойств, а также один из способов редактирования списка компонентов в диалоговом окне редактора свойств.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии