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 руб./мес


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




 76 - Расширения стандарта ANSI C++ - Свойства, продолжение / С++ Builder 5 / Borland C++

Шаг 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 TWindowStyles;
//---------------------------------
class PACKAGE TComponent1 : public TComponent
{
private:
protected:
	void __fastcall SetWets(AnsiString name, AnsiString name2, int wet);
	int __fastcall GetWets(AnsiString name, AnsiString name2);

	TWindowStyles FWindowStyle;
	void __fastcall SetWindowStyle(TWindowStyles style);
public:
	__fastcall TComponent1(TComponent* Owner);
__published:
	__property int Wets[AnsiString name][AnsiString name2] = {write = SetWets, read = GetWets};

__property TWindowStyles WindowStyle = 
{ read = FWindowStyle, write = SetWindowStyle, default = wsOpened};

};
//---------------------------------
#endif

имеет право на существование и совершенно правилен... Следующий код:

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;
}

Вот так.


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