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

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

_NewControl


Марсианин ©   (2004-05-02 02:16:00) 

Изучаю исходник KOLStGrd и просто не понимаю. код-то работает, сам подобное писывал...

вот строка:

TStGrd = object(TControl)
............
Result := PStGrd(_NewControl(Sender,'TStGrd',i,false,nil));


_NewControl вызывает
Result := _NewWindowed( AParent, ControlClassName, Ctl3D );
.......


_NewWindowed вызывает:
New( Result, CreateParented( AParent ) );
.......


что это за конструкция такая? в хелпе Делфи5 про такое испльзование New не пишут

я так понимаю, что она выделяет и инициализирует память для обьекта типа указателя Result (который в данном случае PControl), с вызовом конструктора... в итоге должен получиться TControl. т.е. если тип Result:PControl, то New выделяет память для TControl и помещает указатель на него в Result.
но! мы создаем ТStGrd..


SPeller   (2004-05-06 05:59:00) [1]

Извиняюсь, действительно был неправ. Только, ув. тов. Palladin, повежливее надо быть, каждый может ошибаться. Действительно перекрывается полностью. Одно отличие — из метода предка не вызывается метод наследника.


Gandalf   (2004-05-05 23:25:00) [2]

Тихо... Без ругани и мата :)

Суть в специфики модеи наследования, создавая визуальные контролы, мы для наследования всех прелестей TControl - констуртора. Создаем не наш новый TMySuperButton=object(TControl) и TControl. Потому и деструктор не перекрываеться. Но память осбовождать надо... выход CustomData и CustomObj декструтор TControl CustomObj.Free вызывает - а нам это и надо, с невизуальными ситуация другая, чужой конструктор нам не нужен, мы за него не цепляемся потому работаем нормально.


Palladin   (2004-05-05 22:49:00) [3]


> SPeller ©   (02.05.04 18:24) [7]

А? Правда чтоли? Господи, а я и незнал, всю жизь перекрываю, а оказывается это неправда...

+ [9]

Может таки пересмотришь свои взгляды? Путем чтения книг, справки и более внимательного изучения ООП применительно к Делфи.


SPeller   (2004-05-03 11:58:00) [4]

Дело в том, что в классах можно и не поставить inherited, тогда деструктор предка не вызовется и получится утечка памяти, с очень плачевными последствиями если класс часто создаётся/уничтожается. Если же в объектах не поставить inherited, то ничего страшного не произойдёт, метод предка выполнится после метода наследника. Здесь inherited полезен в конструкторах и других методах, когда метод предка нужно выполнить в начале или где-нибудь в середине метода наследника.


марсианин   (2004-05-03 09:57:00) [5]

ну как бы да. в потомке вместо override как в классах, в обьектах пишем virtual, иначе ошибка..
но ведет себя потомственный метод точь-в-точь как если бы он был override.  и метод предка вызываем сами ч-з инхеритед.


SPeller   (2004-05-02 18:24:00) [6]

Именно перекрыть не получится. Но создать в наследнике одноименный виртуальный деструктор можно, тогда сначала вызовется твой, а потом предка.


марсианин   (2004-05-02 15:36:00) [7]

теперь понятно, почему TStGrd написан именно так...

посколько TControl.Destroy тебе не подвластен.

кстати почему? он же виртуальный, его можно перекрыть.. или нельзя?


Gandalf   (2004-05-02 14:13:00) [8]

Угадал.
Еще есть CustomObj - у него можно пепеопределить Destroy - для освобождения ресурсов - посколько TControl.Destroy тебе не подвластен.


Марсианин   (2004-05-02 11:43:00) [9]

торможу! уже есть такой   CustomData: Pointer;


марсианин   (2004-05-02 11:06:00) [10]

и точно! не содержит! теперь понятно.. но почему бы тогда не определить у TControl одно маленкое поле скажем fUser:Pointer, куда наследующий программист, сможет поместить указатель на свою структуру данных? или я просто ее не заметил?
конечно, можно впихнуть ее в SetWindowLong(GWL_USERDATA). но это немного громозко


Gandalf   (2004-05-02 10:36:00) [11]

Именно по этой причине визуальный компонент не может именть своих полей - если наследуется от TControl.


SPeller   (2004-05-02 06:29:00) [12]

Всё так, потому что TStGrid наверняка не содержит полей, только методы. В этом случае StGrid занимает в памяти столько же места, сколько и TControl, поэтому какая разница каким конструктором выделять память?


Наверх

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