Главная » Delphi » Архитектура CLX

0

Итак, библиотека VisualCLX состоит из классов  Object  Pascal, по сути являющихся оболочками классов  библиотеки Qt. Это очень  похоже на то, как классы  библиотеки VCL инкапсулируют стандартные интерфейсы  API и элементы управления Windows. Одной из главных  целей  создания CLX было  максимальное упрощение переноса су ществующих   приложений VCL в архитектуру  CLX.  В результате  иерархия классов CLX имеет  общие  черты с иерархией классов  VCL (рис. 13.1 и 13.2). Темно серые прямоугольники на рис. 13.1 соответствуют основным базовым  классам VCL.

Тем не менее, иерархии классов  в этих  двух библиотеках не являются полностью идентичными. В частности, в CLX добавлено несколько новых  классов,  а некоторые из них были перемещены в другие ветви  иерархии. На рис. 13.2 эти отличия отмече ны  светло  серыми  прямоугольниками. Например,  класс  компонента  CLX  TTimer больше  не является прямым потомком класса  TComponent, как это  было  в VCL. Те перь  он  является производным от  нового класса  THandleComponent, который,  в свою  очередь, является базовым для тех  невизуальных компонентов, которые осно ваны на элементах управления Qt. Также  обратите внимание на компонент CLX TLa- bel, который больше  не  является графическим элементом управления. Теперь его класс стал производным от нового класса TFrameControl. Библиотека Qt предостав ляет широкие возможности настройки границ элементов управления, реализованных в классе TFrameControl.

Таким   образом,  класс  TWidgetControl в  CLX  является  эквивалентом  класса

TWinControl в VCL. Изменение названия класса связано с переходом на базу библио

теки Qt, в которой вместо приставки Win используется слово Widget. Этим была под

черкнута независимость элементов управления VisualCLX от системы Windows.

Следует отметить, что класс TWinControl также  определен в CLX как псевдоним для  класса  TWidgetControl. При  разработке Kylix и  CLX одной  из  самой  первых идей была возможность использования одного  ресурсного файла  для определения как компонентов CLX, так и компонентов VCL. Предполагалось, что  во время  компиля ции приложения будут использованы директивы условной  компиляции, которые, оп ределив платформу, внесут  в раздел  uses соответствующие модули  (VCL или  CLX). Однако такой  подход  годится только  для очень  простых компонентов. На практике, при  разработке совместно используемых модулей,  в исходный код приложений при ходится вносить более значительные изменения.

Рис. 13.1. Иерархия базовых классов VCL

НА ЗАМЕТКУ

Разработка компонента, который использовал бы один и тот же исходный файл для VCL и CLX, — это не то же самое, что разработка компонента CLX, который может ис- пользоваться одновременно и в Delphi 6 и в Kylix. В настоящей главе описывается именно последний процесс.

К  счастью, изменения  в  иерархии  классов, представленной  на  рис. 13.2,  мало влияют на сам процесс разработки приложений. Для большинства компонентов VCL, входящих в состав  Delphi, существуют эквиваленты в VisualCLX (например TEdit, TListBox, TComboBox и  т.д.).  Изменения в иерархии классов  больше  затрагивают разработчиков компонентов.

Рис. 13.2. Иерархия базовых классов CLX

НА ЗАМЕТКУ

Чрезвычайно удобным средством для изучения новой иерархии классов является бро- узер объектов (Object Browser), входящий в состав Delphi 6 и Kylix. Если открыть в нем класс TWinControl, являющийся псевдонимом класса TWidgetControl, то можно увидеть, фактически, две идентичных иерархии классов.

Между структурами VCL и CLX гораздо больше  сходства, чем  можно  увидеть  на представленных рисунках.  Например, класс TCanvas в обеих  структурах  практически идентичен (хотя  его внутренняя реализация для VCL и CLX, конечно же, отличается). Для VCL класс TCanvas предоставляет доступ к графическому контексту устройства вывода  в системе Windows через свойство TCanvas.Handle. Для CLX класс TCanvasчерез то  же свойство TCanvas.Handle предоставляет доступ  к модулю прорисовки библиотеки Qt.  Таким  образом свойство Handle используется для доступа  к низко уровневым функциям графического интерфейса устройств вывода как в приложениях VCL, так и в приложениях CLX.

Компоненты CLX были разработаны так, чтобы  упростить преобразование уже существующих  приложений VCL в приложения CLX. В результате интерфейсы кате гории public и published во многих  компонентах практически идентичны для обо их  архитектур.  Это  означает,  что  такие   события  как  OnClick,  OnChange и  On- KeyPress (а  также  соответствующие им  методы   обработки Click(), Change() и KeyPress()), реализованы и в VCL, и в CLX.

Преобразование приложений

Библиотека CLX имеет  много общего  с VCL. Тем не менее, между ними существует и немало  отличий, связанных с различием платформ. Этот  касается в основном раз работчиков компонентов, так как им придется учитывать в программном коде разли чия операционных систем.  Например, все обращения к функциям интерфейса  API Win32 (описаны в модуле Windows.pas) должны  быть  заменены, если компонент бу дет использоваться в Kylix.

Кроме  того,  при  преобразовании приложений следует  учитывать несколько во просов, связанных с динамическими библиотеками RTL (например чувствительность к регистру  символов в именах  файлов и символы  разделители в путях).  Некоторые компоненты VCL перенести в среду Linux  просто невозможно. Это относится, в част ности, к компоненту VCL для доступа к интерфейсу электронной почты Messaging API (MAPI). MAPI в Linux  не существует,  вследствие чего  для создания подобного компо нента  необходимо использовать другие механизмы.

При  преобразовании приложений для использования в среде  Linux  встречаются некоторые нюансы, связанные с самой  платформой. Например, модель  COM  непо средственно в Linux  не  используется, однако  поддерживаются некоторые ее  интер фейсы. Также  не рекомендуется применять в компонентах CLX технологию Owner Draw, использующуюся во многих  элементах управления VCL для среды  Windows,  по тому что  она  конфликтует со стилями Qt.  К другим  особенностям VCL, которые не поддерживаются в CLX, относятся: закрепление объектов, поддержка двунаправлен ных наборов данных и азиатских символов.

К тому же разработчики часто  сталкиваются с тем, что для одних  и тех же элемен тов  управления в CLX и  VCL применяются различные модули.  Например, модулю VCL Controls.pas в CLX соответствует модуль  QControls.pas. В данном  случае проблема заключается в том, что при разработке компонента или приложения CLX, в Delphi 6 происходит обращение и к модулям VCL. Это часто  приводит к случайному смешению вызовов модулей CLX и VCL в модулях компонентов. В некоторых случаях такие  компоненты нормально работают в среде  Windows,  однако  при  их переносе в Kylix компилятор выдаст  сообщение об ошибке, так  как модули  VCL в Linux  не  ис пользуются.

НА ЗАМЕТКУ

Специалисты Borland рекомендуют разрабатывать компоненты CLX при помощи Kylix в среде Linux. Это позволит избежать случайного применения модулей VCL. Но многие разработчики, скорее всего, все равно предпочтут работать в Delphi 6, а затем прове- рять компоненты в Kylix.

Кроме  всего прочего, при  разработке компонентов и приложений CLX необходи мо учитывать чувствительность системы Linux  к регистру символов. В частности, это имеет  значение при работе с именами файлов и путями. Эту особенность необходимо учитывать также  и в разделе uses, при  указании  имен  модулей,  поскольку  при  отли чии регистра символов в именах  модули не будут найдены компилятором Kylix. Пакет Delphi не чувствителен к регистру символов, однако  при  работе с ним к разработчи кам тоже  предъявляются соответствующие требования. Например, регистр символов должен  строго соблюдаться в имени процедуры Register(), которая используется в модулях, экспортируемых из пакета.

Обойдемся без сообщений

В системе Linux  (или,  если  говорить точнее, XWindows)  нет  такой  системы сооб щений, как  в Windows  (например wm_LButtonDown, wm_SetCursor или  wm_Char). Когда  компонент CLX используется в среде  Linux, системные сообщения обрабаты ваются  соответствующими классами  Qt. При  этом  очень  важным  моментом является то, что сообщения обрабатываются классами Qt даже в среде Windows.

Учитывая вышеизложенное, методы  обработки сообщений, которые используют ся в компонентах VCL (в частности CMTextChanged()), должны  быть  заменены ди намическими методами (например TextChanged()). Более подробно данный вопрос будет рассмотрен в следующих разделах. Сейчас же отметим лишь то, что в некоторых случаях сообщения в VCL обрабатываются совсем не так, как в CLX.

Простые компоненты

В настоящем разделе будут подробно рассмотрены некоторые компоненты VCL, преобразованные в компоненты CLX. Первый из них — это компонент Spinner, в ко тором реализованы такие  базовые возможности, как прорисовка, обработка нажатий клавиш,  перенос фокуса, работа с мышью и обработка событий.

Следующие  три  компонента являются расширениями базового компонента Spin- ner,  причем  каждый   следующий   расширяет  предыдущий. В  первом  компоненте потомке добавлена обработка событий мыши  и отображение пользовательских кур соров;  во втором — отображение изображений, извлеченных из компонента ImageL- ist; а в третьем — подключение к одному их полей  набора данных.

НА ЗАМЕТКУ

Все модули, представленные в настоящей главе, могут использоваться как в Delphi 6, так и в Kylix.

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

По теме:

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