Это мой первый пост здесь, но я хотел бы поблагодарить сообщество, потому что я бесчисленное количество раз находил решения своих проблем, приходя сюда и находя решение в вопросе, на который уже дан ответ. 1001 *
При этом я хотел бы перейти к сути. Я работаю в 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, когда они больше не нужны. Я старался изо всех сил убедиться, что я правильно освободил все экземпляры до закрытия приложения, но, очевидно, я что-то упустил.
Так у кого-нибудь есть идеи о том, где отсюда отлаживать что-то подобное?
P.S. еще раз я новичок, поэтому, если есть что-то, что я пропустил, замутил или забыл добавить, пожалуйста, дайте мне знать. Еще раз спасибо за чтение моего поста!