Создание / уничтожение виртуального класса в Delphi - PullRequest
5 голосов
/ 04 ноября 2011

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

1 Ответ

2 голосов
/ 04 ноября 2011

Вероятно, Родитель освобождает все содержащиеся в нем элементы управления во время уничтожения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...