Форум: "Основная";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
ВнизTCollectionDescendant.Add Найти похожие ветки
← →
VladP (2002-09-30 10:24) [0]Здравствуйте, мастера!
При работе над компонентом, одно из свойств которого является наследником TCollection, наткнулся на необъяснимое пока мне явление. Проблема в том, что метод Add не выполняется для класса - потомка TCollection, а выполняется непосредственно для TCollection. В качестве эксперимента предлагаю опыт с примером приведенным Юрием Зотовым в его статье на DelphiKingdom.com ( http://www.delphikingdom.com/helloworld/tcollection.htm). Если обработчик поменять следующим образом, то это сообщение вы не увидите никогда.
function TSpotCollection.Add: TSpot;
begin
MessageBox(0,"Add","Executed",MB_OK);
Result := TSpot(inherited Add)
end;
Помогите разобраться с проблемой.
С уважением.
← →
VladP (2002-09-30 12:22) [1]Граждане!
Откликнитесь пожалуйста!
Скачайте текст компонента статьи Ю.Зотова:
http://delphi.mtu-net.ru/zip/dappledshape.zip
добавьте в функцию TSpotCollection.Add вот это:
MessageBox(0,"Add","Executed",MB_OK);
Объясните, пжлст, в чем же дело.
Заранее спасибо.
← →
REA (2002-09-30 12:46) [2]Может override или еще как там поставить... Лень качать
← →
Polevi (2002-09-30 12:56) [3]не поленился, скачал, все работает как надо
← →
VladP (2002-09-30 13:13) [4]Откомпилируем и установим указанный компонент в палитру.
Создадим приложение, состоящее из 1 формы и 1 DappledShape.
Попробуем добавить несколько Items в свойство Spots.
Мессадж бокс не показывается.
Глюк только у меня? И в Delphi 5 и C++ Builder 5?
Просветите если можно...
← →
Polevi (2002-09-30 14:46) [5]я все делал динамически, компонент не инсталил
D5
← →
VladP (2002-09-30 19:36) [6]Вся проблема в том, что по всем моим умозаключениям (может они не верны?) Object Inspector должен вызывать метод наследника TCollection Add при добавлении наследника TCollectionItem в коллекцию. Но он этого не делает! Он вызывает метод TCollection.Add
Неужели никто не сталкивался или это известная проблема?
← →
Набережных С. (2002-09-30 20:28) [7]Метод Add - статический. Откуда IDE знать, что ты его переписал? И зачем вообще его переписывать, если он просто вызывает конструктор твоего потомка TCollectionItem? Вот в конструкторе и делай все, что тебе надо.
← →
Юрий Зотов (2002-10-01 00:02) [8]Ох, вероятно, статью надо было начинать с растолковывания различий между статическими, динамическими и виртуальными методами, классами и их экземплярами... и т.д. - в общем, с азбуки.
Правда, тогда пришлось бы написать не статью, а книгу. И потратить на нее не пару дней, а полгода.
> Если обработчик поменять следующим образом, то это сообщение
> вы не увидите никогда.
Это же статический метод. Со всеми вытекающими последствиями.
В design-time стандартный редактор свойства вызывает метод TCollection, а в run-time будет вызываться метод TSpotCollection (если не приводить класс). Хотите видеть Ваше сообщение и в design-time тоже - пишите свой редактор свойства и затачивайте его под конкретный класс коллекции.
Этот метод был замещен в целях демонстрации (статья-то учебная!) и для удобства работы в run-time (готовое приведение классов).
← →
VladP (2002-10-01 06:53) [9]Спасибо.
← →
Набережных С. (2002-10-01 18:08) [10]
> Юрий Зотов © (01.10.02 00:02)
Сорри, я статью не читал, поэтому не воспринимайте как попытку критики:) Конечно, для удобства можно и переписать, хотя я предпочитаю поступать иначе. Но это всего лишь дело вкуса:)
← →
Юрий Зотов (2002-10-01 21:48) [11]> Но это всего лишь дело вкуса
Естественно. Просто я привык писать не столько прикладные программы, сколько их ядро. Отсюда и стремление сделать каждый инструмент максимально простым и удобным для юзера. Это уже в подсознании.
← →
Набережных С. (2002-10-01 22:22) [12]
> Юрий Зотов © (01.10.02 21:48)
Конечно, удобство очень важно. Но я в похожих случах ипользую прегрузку или добавляю метод. Просто не люблю необратимых решений. Вдруг у класса будут потомки и через одно-два поколения исходный метод понадобится. Пожалуй, в данном случае это маловероятно, но... привычка есть привычка:) В общем, дело личных пристрастий.
← →
Юрий Зотов (2002-10-01 22:33) [13]> у класса будут потомки и через одно-два поколения исходный
> метод понадобится
Нет проблем. Он же статический. Перекрываем еще раз и пишем:
Result := TCollection(Self).Add
Получается даже более гибко - к какому предку привели, такой класс и получили.
А перегрузка... у него же нет параметров. Вводить фиктивный - это путать юзера.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c