Главная » C++, C++ Builder » Создание компонентов в CBuilder (FAQ)

0

Как добавить свойство класса, например TFont, в мой компонент?

Если вы используете уже существующее свойство вроде TFont, следует просто определить свойство этого типа. В случае же, если вы хотите создать новое свойство, являющееся классом, для использования в своем компоненте, вам надо позаботиться о нескольких вещах. Во-первых, используемый вами класс должен являться потомком (хотя бы далеким) TPersistent, то есть наследовать от класса, наследующего от TPersistent. Во-вторых, вы должны определить класс, в котором вы собираетесь использовать свойство.

Наконец, вы должны добавить в компонент, содержащий класс свойства, свойство данного типа, объявленное  как     published,  которое  вы  хотите  использовать  как  «нормальную»  переменную

<Например:   __published:    __property   TFont    *m yFont.    —    Примеч. перев.>.    Теперь    можно использовать саму эту переменную для работы с методами свойства read и write.

Сложности состоят в том, что вы должны заместить метод компонента Create так, чтобы создавался элемент класса свойства. В противном случае система даст сбой при попытке Object Inspector загрузить это свойство.

Замечание

Если вы хотите, чтобы пользователь иметь возможность редактировать отдельные части комплексного свойства в Object Inspector, вам надо объявить и их как __published внутри класса этого свойства.

Почему  при  попытке  посмотреть  свойство  моего  компонента  в  Object  Inspector  система выдает мне ошибку «переполнение стека»?

Скорее всего, функция set присваивается имени свойства вместо переменной класса. Например:

int Fx; // Переменная класса для свойства

__property int X={read=X, write=SetX};

__fastcall void SetX(int X)

{

X = x; // Здесь вместо X должно быть Fx!

}

Как создать круглую кнопку?

Используйте функцию Windows API CreateEllipticRegion для создания области в виде окружности, а потом функцию API SetWindowRgn, передав ей ссылку (handle)на кнопку и область, созданную первой функцией.

Какие файлы надо иметь при создании компонента?

Заголовочный файл (H или HPP) и OBJ-файл должны быть скопированы  в  директорию CBuilder\Lib. Это позволит CBuilder корректно компилировать и компоновать приложения, использующие этот компонент в своих формах.

Как создать компонент, который бы выглядел как массив?

Создайте для этого индексированный компонент. Выглядит он примерно следующим образом:

__property double Xpoint[int nLine][int Index] =

{read = GetXPoint, write = SetXPoint};

В этом примере показано свойство с именем XPoint, представляющее собой двумерный массив. Функция GetXPoint выглядит примерно следующим образом:

virtual double     fastcall GetXPoint( int nLine, int nIndex );

В то же время функция SetXPoint выглядит так:

virtual void     fastcall SetXPoint( int nLine, double dPoint );

Воплощать свойства в виде настоящих массивов нет никакой необходимости, но это я оставляю на

ваше усмотрение.

Как можно протестировать свой компонент, не добавляя его в палитру?

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

TEdit *pEdit; // Эта строка пишется в заголовочном файле

pEdit = new pEdit(this); // Владелец – форма

pEdit->Parent = this; // ЗАПОМНИТЕ! Родителем должна быть форма

pEdit->Left = 10;

pEdit->Width = 100;

pEdit->Top = 10;

pEdit->Height = 20;

Этот блок кода создает компонент edit, расположенный на форме в позиции 10,10 и протянутый на 100  пикселей  вправо  и  20  пикселей  вниз.  Подобный  блок  кода  может  быть  использован  для любого вида компонентов, поскольку все компоненты поддерживают эти атрибуты.

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

По теме:

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