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


Автор: np9mi7 21.8.2005, 20:51
Добрый день.

Написан визуальный компонент: TCheckListView; Он наследник TListView, и использует два события родителя: OnChange & OnChanging. Залача - убрать эти два события из Object Inspector;

Мне казалось что это решается тривиально строкой:
Код

class PACKAGE TCheckListView : public TListView
{
private:
        __property OnChange;
        __property OnChanging;
};


Компилятор этот текст воспринял, но вот Object Inspector никак, те события OnChange & OnChanging остались доступными, и на них свободно можно навесить обработчики.

Вопрос: как сделать недоступными эти события?

И вообще как скрывать __property из секции __published базового класса у наследника?

ЗАранее благодарен за ответы.

Автор: Vyacheslav 22.8.2005, 14:43
Во-первых, для создания соего компонента лучше использовать TCustomListView. Он как раз и предназначен чтобы программист, мог открыть для доступа только нужные совейства и методы. Если посмотришь на хидер , то увидишь , что в различе TListView только в опубликовании свойств. Поэтому Вам следовало поступить также: не пытаться закрывать уже открытое у TListView , а окрыть закрытое в TCustomListView. Ну а если лень переделывать, могу предложить следующее. Поскольку даже опубликованнон свойство выпадает из инспектора если не задать метод чтения, то можно просто переопределить это свойство типа
Код


  __property TLVChangeEvent    OnChange = {stored =false};
  __property TLVChangingEvent OnChanging = {strored =false};


PS. Здесь stored к делу отношения не имеет . Главное, что не задан метод чтения. И обязательно указание типа. Тем самым перекрывается свойство родителя перекрывается совершенно левым. Доступ к родительскому можно получить посредством непосредсвенного обращения.
Можно попробовать так

Код

__property TLVChangeEvent    OnChange;


Возможно тоже пройдет

Автор: np9mi7 22.8.2005, 16:22
Vyacheslav, Вы как всегда мне очень помогли, спасибо Вам большое!

Автор: tigger 23.8.2005, 11:27
Убрать любое свойство родителя в потомке можно еще вот так:
в данном случае из Object Inspectora убираем OnChange и OnChanging

Код

#include <designintf.hpp>
#include <typinfo.hpp>

namespace Checklistview
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TCheckListView)};
                 RegisterComponents("Samples", classes, 0);

        PTypeInfo ChangeT = *Typinfo::GetPropInfo(__typeinfo(TListView),"OnChange")->PropType;
        RegisterPropertyEditor(ChangeT, __classid(TCheckListView), "OnChange", NULL);

        PTypeInfo ChangingT = *Typinfo::GetPropInfo(__typeinfo(TListView),"OnChanging")->PropType;
        RegisterPropertyEditor(ChangingT, __classid(TCheckListView), "OnChanging", NULL);


        }
}


Автор: np9mi7 24.8.2005, 20:46
tigger, спасибо, но я сделал как Vyacheslav посоветовал, те отнаследовался от TCustomListView

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