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