Главная » Delphi » Дополнения времени разработки

0

Все действия по переносу компонента TddgSpinner из VCL в CLX были достаточ но очевидны и просты. Незначительные сложности возникали лишь при  использова нии свойства InputKeys.

Тем не менее, при добавлении компонентам CLX новых  функций, различия между

VCL и CLX становятся очевидными.

Рассмотрим исходный код  компонента, представленный в листинге 13.2.  В этом модуле реализован класс TddgDesignSpinner, который является потомком класса TddgSpinner. Дополнительная функция заключается в изменении формы курсора мыши,  когда он оказывается над одной  из кнопок (рис. 13.4). Кроме  того,  компонентпроизводного класса будет обладать возможностью изменять числовое значение поля при щелчке  на кнопке  “Плюс” или “Минус” прямо  во время  разработки (рис. 13.5).

end.Судя по комментариям, включенным в исходный код, реализация двух новых  воз можностей компонента CLX — это не такое уж простое дело, так как в VCL для них ис пользовались сообщения Windows. Как уже упоминалось ранее, Linux  не поддержива ет  сообщения,  поэтому   в  компоненте  CLX  для  реализации  новых   возможностей должны  использоваться другие механизмы.Прежде всего следует отметить, что в CLX назначить элементу  управления курсор намного сложнее, чем  в VCL. В среде  Windows  для  этого  используется ресурсный файл  с курсором,  причем для  получения дескриптора курсора  вызывается функция API LoadCursor. Затем  этот  дескриптор используется при  обработке сообщения wm_SetCursor, отправляемого системой Windows  каждому элементу  управления, ко торый нуждается в обновлении указателя  мыши.

В CLX используется другой подход.  Во первых, библиотека Qt не поддерживает ре сурсы курсоров. В модуле Qt.pas определены несколько методов QCursor_create(), каждый  из которых использует собственный способ  создания курсора  мыши.  Для того, чтобы  применить один  из стандартных курсоров Qt,  необходимо передать соответст вующее целочисленное значение в метод QCursor_create(). В то же время, для созда ния пользовательского курсора  используются два массива  байтов, содержащих битовую схему изображения. В первом массиве  хранятся биты черного и белого цветов, а во вто ром — маска, определяющая прозрачные области в изображении курсора.

Для  того  чтобы   отобразить курсор  мыши  в соответствующий момент   времени, вместо  обработки сообщения wm_SetCursor используется переопределенный метод обработки события MouseMove(). В тот  момент, когда  курсор  мыши  находится над одной  из кнопок, вызывается функция QWidget_setCursor(), изменяющая форму курсора.  В противном случае  при  помощи метода  QWidget_UnsetCursor() восста навливается исходная форма курсора.

В VCL обработка сообщений мыши  во время  разработки реализована через обра ботку сообщения компонента cm_DesignHitTest. К сожалению, это  сообщение от сутствует в CLX, поэтому  вместо  него  используется переопределенный метод DesignEventQuery(). Этот метод  позволяет разработчикам компонентов обращать ся к обработчикам событий компонентов Qt во время  разработки. Если он возвращает значение True, то элемент управления реагирует на событие. В данном  примере ис пользовались только  входные события мыши,  поэтому  в первую очередь нужно выяс нить,  соответствуют ли эти входные события нашим  критериям. Если соответствуют, то следует определить, расположен ли курсор мыши над одной из кнопок.

Метод  Change() в классе  TddgDesignSpinner должен  быть  переопределен,  по тому что изменения свойства Value выбранного компонента должны  синхронно ото бражаться в инспекторе объектов. Если метод  Change() не будет переопределен, то инспектор объектов не сможет  отобразить изменения значений, сделанных при  по мощи  щелчка  мыши  на кнопках непосредственно в конструкторе  форм. Единствен ной коррекцией, внесенной в этот метод,  является замена  ссылки  Form.Designer на Form.DesignerHook.

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

По теме:

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