C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 75 - Расширения стандарта ANSI C++ - Свойства / С++ Builder 5 / Borland C++

Шаг 75 - Расширения стандарта ANSI C++ - Свойства

К основным расширениям относится поддержка свойств в стиле Delphi. То есть свойство подразумевается не просто как поле (field), а как самостоятельные действующие в некотором роде процедуры. Например. При присваивании значения свойству в стиле обычного C++ (такие свойства в терминологии VCL) называются полями, мы изменяем само свойство, но при этом объект не реагирует на изменения. То есть после этого нужно вызвать еще какую-нибудь Update функцию. При присваивании значения, например, свойству Width какого-нибудь компонента, мы автоматически получаем перерисовку объекта на экране с новыми характеристиками.

Это одновременно и сильная и слабая стороны C++Builder. С одной точки зрения, это помогает строить понятный и компактный код, но с другой это делает программы на C++ Builder непереносимыми на другие архитектуры. Если сказать откровенно, даже программы MFC легче перенести, скажем, на платформу GTK, чем программы VCL. Впрочем, это предмет бессмысленного обсуждения... Если Вам нравится C++Builder, значит, все окей.

Свойства декларируются следующим образом:

Обычное свойство:

__property <тип> <имя> = { <атрибуты свойства> };
__property AnsiString Name = { read = GetName, write = SetName };

Индексированное свойство (массив):

__property <тип> <имя> [ <индексация массива> ] = { <атрибуты свойства> };
__property AnsiString List [int index] = { read = ReadList, write = SetList };

Перечислимое свойство (множество):

__property <тип множества> <имя> = {атрибуты свойства};

Например:

typedef enum { wsOpened, wsClosed, wsShadowed, wsTopmost } TWindowStyle;
typedef Set<TWindowStyle, wsOpened, wsTopmost> TWindowStyles;
__property TWindowStyles WindowStyle = { read = FWindowStyle, write = SetWindowStyle, default = wsOpened};

К атрибутам свойства относятся следующие:

  • read = <имя поля/функции>
  • write = <имя поля/функции>
  • stored = <имя поля/функции/логическая константа>
  • default = <константа>
  • nodefault
  • index = <целое константное выражение>

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

Замечания по поводу массивов. Несколько непривычно может показаться то, что, так как индекс в конечном итоге передается функции, тип индекса и их количество может быть любым. Например, если Вы программировали на Perl удобным Вам могло показаться использование ассоциативных массивов (хэшей). Так что индекс может быть строкой или даже указателем на структуру или объект. Очень удобно.

Продолжение про свойства в следующем шаге.


| |
Автор Аванесов Самвел.
[AD]