Цитата
e5620:
Ошибка заключается в следующем, в каждой строке имеется кнопка "Х" закрыть (удалить строку), При нажатии на нее вызывается встроенное событие doCloseClick, в котором выполняется Free;и переход в destructor
Delphi - Destroy себя - ошибка!
А*после завершения деструктора происходит возвращение в метод doCloseClick
удалённого компонента,*из него - в метод doClick
удалённой кнопки "Закрыть"
Не надо так делать. Согласно принципам ООП, правильнее будет следующий способ.
Метод doCloseClick скрывает компонент, выставляет значение true логическому свойству "DeleteMe" компонента и завершает работу.
Далее вызывается обработчик для события OnIdle (вызывается в моменты "простоя программы"), который перебирает компоненты и удаляет отмеченные.
Или можно поступить проще - не удалять закрываемые компоненты, а лишь скрывать их, обнулять свойства и перемещать в конец списка. Ведь всё равно так или иначе потребуется добавлять новые - тогда по команде "Добавить" программа просто отобразит первый из скрытых, а новый компонент создавать будет только при необходимости
P.S.
Цитата
e5620:
Заметил что если удалить создание дочерних элементов, т.е. оставить только одну кнопку закрыть, то ошибки нету.
Delphi - Destroy себя - ошибка!
Возможно, потому что удаление дочерних элементов (адреса которых перечисляются в списке Components) производится
автоматически в деструкторе класса TComponents
Кстати, не мешало бы почитать справку по методу TComponents.DestroyComponents().
Что он делает? Как он работает? Нужно ли вызывать его вручную? Какие проблемы могут возникнуть при его вызове?
