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

Вниз

_NewControl   Найти похожие ветки 

 
Марсианин ©   (2004-05-02 02:16) [0]

Изучаю исходник 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-02 06:29) [1]

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


 
Gandalf ©   (2004-05-02 10:36) [2]

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


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

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


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

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


 
Gandalf ©   (2004-05-02 14:13) [5]

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


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

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

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

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


 
SPeller ©   (2004-05-02 18:24) [7]

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


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

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


 
SPeller ©   (2004-05-03 11:58) [9]

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


 
Palladin ©   (2004-05-05 22:49) [10]


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

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

+ [9]

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


 
Gandalf ©   (2004-05-05 23:25) [11]

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

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


 
SPeller ©   (2004-05-06 05:59) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
1-1100772746
CCCP
2004-11-18 13:12
2004.12.05
Эскизы страниц


1-1100779971
Dolphin001
2004-11-18 15:12
2004.12.05
Delphi 5


1-1101015885
Кириешки
2004-11-21 08:44
2004.12.05
Как определить что под курсором находится ссылка ?


14-1099321730
oldman
2004-11-01 18:08
2004.12.05
Дайте народу ПИВО!!!


1-1100693186
Tria
2004-11-17 15:06
2004.12.05
Как сохранить форму в текстовом формате?