Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Ishodniki.Ru » Online книги » C++ Builder по шагам Шаг 76 - Расширения стандарта ANSI C++ - Свойства, продолжение Еще одним приятной возможностью свойств является их автоматическое отображение в Инспекторе Объектов и соотвественно, design-time установка свойств и их сохранение в файле формы. Для того, чтобы свойства были "видны" в Инспекторе Объектов, их описания надо поместить в секцию __published. Вообще, полная структура VCL класса такова: class TMyClass : public TVclClass { private: // Закрытые декларации protected: // Защищенные декларации public: // Открытые декларации __pusblished: // Свойства } По поводу функций и полей, на которые ссылаются свойства. Обычно их помещают в секцию protected. Функции записи и чтения описываются обычно так: // ... protected: AnsiString __fastcall GetFolder(void); void __fastcall SetFolder(AnsiString NewFolder); AnsiString FFolder; //... __published: __property AnsiString Folder={read=GetFolder,write=SetFolder,nodefault}; // или __property AnsiString Folder={read=FFolder,write=SetFolder,nodefault}; Ясное дело, функции чтения возвращают нужное значения, а записи ничего не возвращают... По неписаному соглашению они именуются GetИмяСвойства, SetИмяСвойства, FИмяСвойства. Для свойств типа массив действуют чуть другие правила. Для примера приведу описание довольно сложного двухмерного хэша: #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> //--------------------------------- class PACKAGE TComponent1 : public TComponent { private: protected: void __fastcall SetWets(AnsiString name, AnsiString name2, int wet); int __fastcall GetWets(AnsiString name, AnsiString name2); public: __fastcall TComponent1(TComponent* Owner); __published: __property int Wets[AnsiString name][AnsiString name2] = {write = SetWets, read = GetWets}; }; //--------------------------------- #endif В общем-то это типичный вариант описания такого свойства. Некоторые замечания по поводу использования свойств-множеств... Это предупреждение не наступать на грабли, на которые уже наступали другие. Допустим, такой код: //--------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> typedef enum { wsOpened, wsClosed, wsShadowed, wsTopmost } TWindowStyle; typedef Set имеет право на существование и совершенно правилен... Следующий код: void __fastcall TComponent1::ChangeStyle(TObject *Sender) { WindowStyle <<wsOpened; } ...по идее должен изменить стиль и перерисовать окно... Но ничего не происходит! Дело в том, что здесь не используется оператор присваивания, поэтому не вызывается функция присваивания. Правильный способ - следующий: void __fastcall TComponent1::ChangeStyle(TObject *Sender) { WindowStyle = WindowStyle << wsOpened; // или так TWindowStyles style = WindowStyle; style << wsOpened; WindowStyle = style; // или даже так WindowStyle = TWindowStyles() << wsOpened; } Вот так.
|
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|