Главная » C++, C++ Builder » Таблица свойств – приложение просмотра классов в CBuilder

0

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

В табл. 17.3 показаны все поля, которые нам понадобятся в таблице свойств (Properties). Вы удивлены?

Таблица 17.3. Таблица Properties

Поле                               Тип                Длина

ClassId               Character String            10

PropertyName      Character String          80

Как можно уложить описание целого свойства в одно-единственное поле базы данных? Где же типы? Где же функции чтения и записи? Как это все будет работать при таком описании? Расслабьтесь, все это очень просто.

Как вы помните, при определении свойства для компонента надо определить имя свойства, его тип, а также способ для пользователя получать и передавать информацию из этого свойства. Типичное описание свойства в вашем коде выглядит примерно следующим образом:

__property int AProperty = {read = FAProperty, write = SetAProperty, default = 32};

Действительно, практически вся информация из этого описания нужна для описания нового свойства в вашем компоненте. В качестве абсолютного минимума для описания вам потребуется имя свойства,  его тип и переменная-член класса для  хранения  значения  свойства (без функций чтения и записи). Это справедливо для описания всех новых свойств, добавляемых в компонент.

Однако для свойств, которые просто представлены из базового класса компонента, вовсе не обязательно  заново  определять  все,  что  было  только  что  перечислено.  Для  так  называемых

«подсаженных» (hoisted) свойств достаточно, чтобы вы указали название свойства, которое вы представляете из базового класса в секции __published. Предположим, что у нас есть следующее описание свойства в базовом классе:

protected:

__property System::AnsiString Text ={read = Text; write = SetText};

Если вы захотите использовать свойство Text в классе компонента, наследующем от этого базового класса, вам не потребуется вся информация, хранящаяся  в  этом  свойстве.  Вам потребуется лишь «подсадить» это свойство в наследующий класс компонента. Это делается написанием одной строки вроде следующей:

__published:

__property Text;

Помните, что компилятор уже знает тип свойства из базового класса. Вам нельзя менять тип свойства, поскольку это совершенно собьет пользователя с толку — у вас в Object Inspector появятся два различных свойства с различными типами. Которое из них какого типа? Зависят ли они друг от друга? И если можно использовать оба, то как их различить в коде?

Снять все эти вопросы можно, только запретив использование свойств  с  одинаковым  именем. Когда вы используете («подсаживаете») свойство из родительс кого класса, то получаете большую часть, если не всю, информации о свойстве. Хотя изменение функций чтения и записи свойства в наследующем классе, равно как и значения по умолчанию, допускается, мы не  будем обрабатывать эти несколько необычные варианты в нашем Мастере генерации компонентов. Если вы возжелаете довести дело до конца — дерзайте, попробуйте самостоятельно добавить эти возможности.

Итак, у нас есть три таблицы для хранения информации. Теперь надо решить вопрос с занесением данных в эти таблицы. Для того чтобы записывать в  них информацию, нам придется кое-что добавить в код нашего приложения просмотра классов. В принципе, вполне возможно справиться с этим при помощи управляющих элементов, восприимчивым к данным (data-aware), но гораздо проще просто использовать объект TTable для записи нужных нам данных  из списков в базу данных. Давайте этим и займемся.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

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