Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отсутствие класса `TActionList` при десериализации в Delphi: решение проблемы `EClassNotFound`

Delphi , Синтаксис , Ошибки и Исключения

Отсутствие класса TActionList при десериализации в Delphi: решение проблемы EClassNotFound

При работе с компонентами в Delphi, разработчики иногда сталкиваются с ошибкой EClassNotFound, которая возникает во время выполнения программы. Эта ошибка указывает на то, что класс, который должен быть доступен для десериализации, не найден в текущем контексте. В данном случае, ошибка связана с отсутствием класса TActionList при попытке десериализации формы.

Описание проблемы

Разработчик столкнулся с ошибкой EClassNotFound при десериализации формы, что вызвало исключение при выполнении операции TReader.ReadRootComponent. Сообщение об ошибке гласило: "Класс не найден TActionList". Интересно, что основная форма использует TActionList, и разработчик даже добавил в проект файл ActnList.pas из папки исходников VCL для устранения проблемы. Однако, несмотря на это, ошибка продолжала возникать.

Проблема возникла после изменения кода в подформе: была удалена вся реализация с использованием маркера ifdef, что было сделано для создания прототипов и юнит-тестирования. Попытки добавить класс TActionList в проект и изменения в настройках компилятора и линкера не привели к решению проблемы.

Анализ стека вызовов

Стек вызовов, предоставленный разработчиком, указывает на то, что ошибка возникает внутри компонентов RTL и VCL. В частности, в методе TReader.ReadDataInner используется параметр nil, который указывает ReadComponent создать новый экземпляр вместо чтения существующего.

Подтвержденное решение

Проблема заключается в том, что класс TActionList не найден в текущем контексте десериализации. Каждый класс формы имеет RTTI, содержащее ссылки на компоненты, которые он использует. Чтобы решить проблему, необходимо убедиться, что форма (или кастомная панель, если это она) объявляет хотя бы один TActionList перед тегом __private__:

TMyForm = class(TForm)
  ActionList: TActionList;
  // Другие компоненты
private
  // Приватные свойства и методы
public
  // Публичные методы и обработчики событий
end;

Альтернативные решения

  1. Использовать Classes.RegisterClass для регистрации классов, которые нужно использовать в системе сериализации. Это необходимо для классов, которые не являются частью формы и не автоматически регистрируются.
  2. В случае копирования кастомной панели из одного проекта в другой, убедиться, что все "наследуемые" элементы в DFM изменены на "объект" для корректной десериализации.
  3. Если в DFM присутствуют заявления о наследовании, но соответствующие объявления отсутствуют в PAS файле, удаление и повторное добавление компонента может решить проблему.
  4. Убедиться, что все компоненты формы имеют имя, иначе IDE не сможет сгенерировать объявления в PAS файле.
  5. Проверять, что в определении класса формы не используется ключевое слово public или private в начале, так как по умолчанию члены класса являются published.

Заключение

При десериализации форм и компонентов в Delphi важно следить за тем, чтобы все необходимые классы были зарегистрированы и доступны в контексте десериализации. Решение проблемы EClassNotFound требует внимательного анализа стека вызовов и проверки конфигурации проекта.

Создано по материалам из источника по ссылке.

Разработчик столкнулся с проблемой отсутствия класса `TActionList` во время десериализации в Delphi, что приводит к ошибке `EClassNotFound`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:48:18/0.0036048889160156/0