Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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);
Объясните, пжлст, в чем же дело.

Заранее спасибо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо