Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.59 MB
Время: 0.037 c
1-31831
Yasha
2002-09-28 15:18
2002.10.10
бесконечный цикл


4-32062
Степан
2002-08-23 13:33
2002.10.10
Список открытых окон


1-31884
alf_
2002-09-28 17:54
2002.10.10
система координат


1-31865
Денис Самохов
2002-09-29 11:34
2002.10.10
Обои рабочего стола. Обпределить момент изменения.


1-31806
Diman-Far
2002-10-02 09:37
2002.10.10
RichEdit select





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский