![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте ) Вопрос вероятно глупый, и возможно уже задавался (если так, то извиняюсь, поиск юзал, не помог)... Заклинило собственно вот на чем:
Пишу класс: Цитата:
............................................... Цитата:
............................................... Создаю оба объекта и кнопки в них Цитата:
Получаю Invalid Pointer Operation в конце выполнения программы ( при уничтожении объекта а (именно а, а не а.Button)). Кто знает, куда делся указатель на него? P.s. Если запускать деструктор ручками, то деструктор кнопок выполняется, а деструктор Объекта а ругается. Если не делать Create для кнопок, то деструкторы выполняются без ошибок Последний раз редактировалось KACAH, 07.05.2009 в 21:17. |
#2
|
||||
|
||||
![]() Где теги???
и по теме: Код:
b.button1:=TButton.Create(a); Код:
b.button1:=TButton.Create(b); Да, точно. Ты ведь удаляешь (в таком порядке, я подозреваю) 1. a.button 2. a 3. b.button 4. b поскольку b.button создан с владельцем a, то он и удалится вместе с ним. После чего ты b.button (уже удалённый) пытаешься удалить снова. На что он, собственно, и ругается. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 07.05.2009 в 21:09. |
#3
|
|||
|
|||
![]() 1) Теги исправил
2) Там действительно была описка, но сути это не меняет, эта проблема у меня возникла не на этой программе, эту я написал для упрощения описания проблемы --- Исправил в первом топике тоже, чтобы не путать людей 3) Ругается он не на объект b, а на объект а, после исправления продолжает ругаться 4) Удаляю я в порядке 1. a.Destroy;. Уже на этом вылетает ошибка или в таком: 1. a.Button1.Destroy; 2. a.Destroy; -- Ошибка Последний раз редактировалось KACAH, 07.05.2009 в 21:18. |
#4
|
||||
|
||||
![]() Сейчас, буду думать... Нарежу исходник похожего формата... и попробую тупо создать-удалить...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
||||
|
||||
![]() Чёто меня заклинило... объекты вроде не через Destroy удалять надо, а через Free! Попробуй, должно работать...
Если не заработает, слей лучше свой исходник, я сам с ним поработаю... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
|||
|
|||
![]() Free - процедура
Destroy - деструктор Вывод: из процедуры Free вызывается деструктор Destroy, и именно он занимается очисткой памяти, а не сама процедура. Насколько я понимаю, в Дельфях объекты можно вообще не удалять, этим услужливо займется встроенная часть Дельфей (а скорее Винды) (условно "Менеджер освобождения памяти" ) после завершения работы приложения Код прилагается: Последний раз редактировалось KACAH, 07.05.2009 в 21:47. |
#7
|
||||
|
||||
![]() А вообщето код неверный...
Код:
a:=TMyObj.Create(Self); b:=TMyObj.Create(Self); Ковыряться надо... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
|||
|
|||
![]() Насчет создания не согласен. Я не переопределял конструктор TMyObj, значит его Create полностью соответствует Create предка, т.е TForm.Create Дальше я просто типы привожу. Кроме того, с созданием никаких проблем не возникает, а если не создавать Кнопки то и с уничтожением тоже не возникает. Так что никакой дырки в этом нету.
|
#9
|
||||
|
||||
![]() У тебя выходит, что a и b - просто TForm в виде TMyObj. А в TForm никаких Button'ов нету. Поэтому может и ругается...
Хотя, с этими делфовскими классами, наследованиями и переопределениями, приведениями и прочим даже я на 100% не разобрался... такой гемор... Так что я тут не профи. P.S. жду летящих тапок. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
|||
|
|||
![]() Все, разобрался. По видимому проблема касается исключительно Форм(ну и других контейнеров возможно). Похоже что у форм стандартный конструктор не просто выделяет память под объект, он еще и устанавливает значения форме и всем её компонентам. Значения эти он берет в файле *.dfm. Вобщем для корректной работы конструктора нужен файл *.dfm под новый класс. Структура файла проста, можно изучить какой-нибудь *.dfm файл, созданный автоматически(есть в каждом оконном приложении), а можно просто создать форму в Дизайн-тайме, и скопировать её *.dfm файл(в этом случае поля и методы вашего класса должны быть аналогичными форме в дизайн-тайме). Также нужно добавить вначале, после implementation строку типа
Цитата:
Подгрузка файла в ресурсы. Или можно просто добавить файл в проект, смысл от этого не меняется. В таком случае вызывать конструкторы каждого элемента формы не нужно, это сделает сам конструктор ВАШЕГО КЛАССА. Создание объекта при этом ограничивается вызовом конструктора класса. Вобщем-то логично. P.S. Цитата:
Последний раз редактировалось KACAH, 08.05.2009 в 19:07. |