Создание / уничтожение виртуального класса в Delphi
Это мой первый пост здесь, но я хотел бы поблагодарить сообщество, потому что я бесчисленное количество раз находил решения своих проблем, приходя сюда и находя решение в вопросе, на который уже был дан ответ.
При этом, я хотел бы перейти к сути. Я работаю в Delphi 2007 IDE Code Gear. Я все еще плохо знаком с работой в Delphi, если быть точным, менее чем за 3 месяца, поэтому, пожалуйста, имейте это в виду, поскольку я могу упустить что-то базовое здесь.
Сначала я хотел бы дать небольшой контекст вокруг проблемы. Я пишу утилиту планирования для выполнения задач в определенное время. Для каждой доступной задачи есть 2 связанных фрейма delphi, которые связаны с этой задачей. Первый кадр предназначен для редактирования сведений, относящихся к этой задаче, а второй - для отображения информации времени выполнения, когда задачи выполняются.
Список запущенных задач сохраняется, и в поле прокрутки в утилите отображается список соответствующих фреймов для информации времени выполнения. Эти кадры времени выполнения создаются и уничтожаются по мере начала и завершения задач. Что подводит меня к моей проблеме.
Я использую диспетчер виртуальных классов, чтобы хранить список доступных отображаемых и редактируемых фреймов для каждой задачи и создавать их на лету по мере необходимости. Во время выполнения все ведет себя должным образом, когда приложение фактически закрывается, я вижу проблему.
программа вызывает исключение EAccessViolation при его закрытии. Когда я попытался отследить проблему с помощью IDE, строка или действие, соответствующее этой проблеме, фактически не существует в моем коде. Так что это должно быть частью какой-то функции очистки, которая выполняется на заднем плане.
Я сузил его до кода, который создает фреймы виртуального класса на лету, потому что он прекрасно закрывается, когда я закомментировал этот код. Так что это наводит меня на мысль, что я не выполняю каких-либо действий, связанных с использованием этого типа создания классов.
var
tmpCCI: TComponentClassInfExt;
tmpS: String;
tc: TComponent;
bf: TBaseactionedit;
...
begin
...
tc := tmpCCI.fComponentClass.Create(nil);
if tc is TBaseactionedit then
begin
bf := TBaseActionEdit(tc);
bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount);
bf.Visible := False;
bf.parent := pnlActionEdit;
bf.Align := alClient;
bf.Visible := True;
end;
...
Это отрывок из того, как я создаю фреймы с помощью менеджера виртуальных классов. Я освобождаю экземпляры с помощью FreeAndNil, когда они больше не нужны. Я старался изо всех сил убедиться, что я правильно освободил все экземпляры до закрытия приложения, но, очевидно, я что-то упустил.
Так есть ли у кого-нибудь идеи о том, где отсюда отладить что-то вроде этого?
PS еще раз я новичок, поэтому, если есть что-то, что я пропустил, замутил или забыл добавить, пожалуйста, дайте мне знать. Еще раз спасибо за чтение моего поста!
1 ответ
Вероятно, Родитель освобождает все содержащиеся в нем элементы управления во время уничтожения.