Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-31793
devol
2002-09-30 17:05
2002.10.10
Помогите!


6-31934
KVV-K
2002-08-07 23:36
2002.10.10
Ip and DNS


4-32082
Shrek
2002-08-26 21:49
2002.10.10
ShellExecute


14-31998
Profi
2002-09-17 08:16
2002.10.10
Посоветуйте хороший форум по администрированию W2k


1-31873
crush_fm
2002-09-29 17:19
2002.10.10
PageControl