Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

_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 вся ветка

Форум: "KOL";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.032 c
1-1100682349
Игоръ
2004-11-17 12:05
2004.12.05
Сохранение картинки в файл


3-1099281236
Explorer
2004-11-01 06:53
2004.12.05
Работа с серверной БД


1-1101213751
Max Ivanych
2004-11-23 15:42
2004.12.05
Как работает ShellAPI с электронной почтой?


1-1100799817
Shark
2004-11-18 20:43
2004.12.05
Интерпритация выражений


1-1101133232
ЛёхА
2004-11-22 17:20
2004.12.05
Скриптовой Язык





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский