Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > указатель на __property


Автор: dix75 14.5.2009, 23:44
Добрый вечер!

У меня несколько странный вопрос.
Можно получить указатель на __property?
или вообще квалифицировать(определить) квкое проперти вызывается.

Сразу скажу, что нужно для шаблона.

Автор: dumb 15.5.2009, 03:02
Цитата(dix75 @  14.5.2009,  23:44 Найти цитируемый пост)
Можно получить указатель на __property?
property - это средство компилятора, а не объект в памяти. что именно, по-твоему, должен адресовать указатель?

Цитата(dix75 @  14.5.2009,  23:44 Найти цитируемый пост)
или вообще квалифицировать(определить) квкое проперти вызывается.
смысл этой части вопроса от меня ускользнул.

Автор: dix75 15.5.2009, 13:16
dumb, 

например мне необходимо узнать какое проперти использовал пользователь

Автор: Klin 15.5.2009, 17:15
Цитата(dix75 @  15.5.2009,  00:44 Найти цитируемый пост)
У меня несколько странный вопрос.

За самокритику 5+.

Цитата(dix75 @  15.5.2009,  14:16 Найти цитируемый пост)
например мне необходимо узнать какое проперти использовал пользователь


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

Автор: A5uKa 15.5.2009, 19:38
Цитата

какое проперти использовал пользователь 

ВСЕ smile

вот хороший пример

Код

class CValue
{
private:
    int m_value;
public:
    __declspec(property(get=get_Value, put=put_Value)) int Value;
    int get_Value()
    {
        return m_value;     // Или более сложная логика
    }
    void put_Value(int value)
    {
        m_value = value;     // Или более сложная логика
    }
};


и потом...

Код

CValue val;
val.Value = 50;        // На самом деле вызов put_Value()
int z = val.Value;    // На самом деле вызов get_Value()


Автор: dix75 15.5.2009, 19:58
Klin, 

Ситуация в следующем некий борландский класс имеет только открытые проперти, а соответственно остальные обрабатывающие функции или члены(данные-члены) закрыты.

Если бы это было не так , тогда просто я бы использовал указатель на функцию или член.

Но с проперти так нельзя.

Автор: Klin 15.5.2009, 20:12
dix75, я так и подумал, что вы именно это имеете ввиду, поэтому и сказал насчет событий. Но я хотел узнать, изменение каких именно свойств, вы отлавливаете. Ибо для многих лучше использовать перехват (если в этом есть необходимость).

К примеру:

Код

    MESSAGE void __fastcall XENABLEDCHANGED (Messages::TMessage &msg);
...
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER (CM_ENABLEDCHANGED, TMessage, XENABLEDCHANGED);
    END_MESSAGE_MAP (TControl)

Автор: dix75 15.5.2009, 20:15
A5uKa, 

Спасибо конечно, но это обычное пользование проперти.

а мне необходимо узнать какое пользователь использовал проперти.

вот класс Classes::TCollectionItem  имеет следующие проперти

Код

    __property Classes::TAlignment Alignment = {read=FAlignment, write=SetAlignment, default=0};
    __property bool AutoSize = {read=FAutoSize, write=SetAutoSize, default=0};
    __property AnsiString Caption = {read=FCaption, write=SetCaption};
    __property Imglist::TImageIndex ImageIndex = {read=FImageIndex, write=SetImageIndex, default=-1};
    __property TWidth MaxWidth = {read=FMaxWidth, write=SetMaxWidth, default=0};
    __property TWidth MinWidth = {read=FMinWidth, write=SetMinWidth, default=0};
    __property int Tag = {read=FTag, write=FTag, default=0};
    __property TWidth Width = {read=GetWidth, write=SetWidth, stored=IsWidthStored, default=50};


вот я хочу узнать вызывалось ли проперти MaxWidth или Caption

Добавлено через 3 минуты и 17 секунд
Klin, 

нет надо было мне сначала 

я пишу шаблонный класс типа mem_fun_ref

там используется указатель, но использовать указатель нельзя для проперти

Добавлено через 5 минут и 41 секунду
Klin, 

не думаю что на caption идет какое-либо событие

скорее всего препроцессор тупо проганяет код и в нужные места вставляет фуннкции или члены проперти.

Автор: Klin 16.5.2009, 00:49
Цитата(dix75 @  15.5.2009,  21:15 Найти цитируемый пост)
скорее всего препроцессор тупо проганяет код и в нужные места вставляет фуннкции или члены проперти.

Хм... задача безумная, но интересная. 

Цитата(dix75 @  15.5.2009,  21:15 Найти цитируемый пост)
не думаю что на caption идет какое-либо событие


И да и нет. Нужно посмотреть как ComponentState на это дело смотрит.

Добавлено через 6 минут и 50 секунд
ps. через события можно следующие изменения проследить:

Код

CM_FOCUSCHANGED
CM_PARENTFONTCHANGED
CM_PARENTCOLORCHANGED
CM_VISIBLECHANGED
CM_ENABLEDCHANGED
CM_COLORCHANGED
CM_FONTCHANGED
CM_CURSORCHANGED
CM_CTL3DCHANGED
CM_PARENTCTL3DCHANGED
CM_TEXTCHANGED
CM_MENUCHANGED
CM_SHOWINGCHANGED
CM_ICONCHANGED
CM_SHOWHINTCHANGED
CM_PARENTSHOWHINTCHANGED
CM_SYSCOLORCHANGE
CM_WININICHANGE
CM_FONTCHANGE
CM_TIMECHANGE
CM_TABSTOPCHANGED
CM_DIALOGHANDLE
CM_SYSFONTCHANGED
CM_CONTROLCHANGE
CM_CHANGED
CM_BORDERCHANGED
CM_BIDIMODECHANGED
CM_PARENTBIDIMODECHANGED

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)