Обычно это ошибка во время потоковой передачи .DFM. Обычно эта ошибка возникает с компонентами TLabel, потому что многие люди удаляют поля TLabel из формы или фрейма, чтобы сократить беспорядок и уменьшить размер экземпляра формы. Однако распространенная и запутанная ошибка, которую они совершают, заключается в том, что из-за своей чрезмерной ревности они удаляют все ссылки TLabel. Это когда плохие вещи начинают происходить. Позвольте мне рассказать, как потоковая система определяет класс компонента.
Помните, что ссылка на класс в .DFM - это просто строка . Система потоковой передачи должна преобразовать эту строку в ссылку на класс (TComponentClass). Есть два механизма, которые потоковая система использует для этого. Первый очень прост и включает в себя глобальный список ссылок на классы. Вы можете вызвать RegisterClass или RegisterClasses, чтобы явно уведомить об этом систему потоковой передачи. Второй гораздо более тонкий и не очень известный; на самом деле это все часть «волшебства» Delphi :-). Когда компилятор создает форму, все поля, которые представляют компоненты в форме, обрабатываются, и внутренняя таблица создается как часть RTTI или метаданных для самого модуля / frame / datamodule. Эта таблица содержит список ссылок на все отдельные типы компонентов, представленные полями компонентов. Таким образом, даже если компонент находится в глобальном списке , а не , его все равно можно найти путем сканирования этой таблицы, сгенерированной компилятором. Это то, что делает метод Classes.TReader.GetFieldClass ().
Возвращаясь к моему примеру с TLabel, эту проблему легко решить, просто убедившись, что хотя бы у одного из компонентов данного типа имеет поле. Так что, пока существует хотя бы поле типа TLabel, все другие TLabels будут загружаться очень хорошо. Поэтому в вашем случае убедитесь, что поля TListView или TImage не были удалены.