Delphi - класс TListView не найден - PullRequest
2 голосов
/ 23 февраля 2009

У нас есть приложение Delphi 5, которое построено без пакетов времени выполнения, библиотек или внешних ресурсов (то есть одного исполняемого файла). когда мы устанавливаем его на клиентский ПК, мы получаем следующие сообщения об ошибках:

Класс TListView не найден

или

Класс TImage не найден

Ранее мы установили его на десятках компьютеров без происшествий, но эта последняя установка проблематична.

Целевой ПК - это новая установка Windows XP (с пакетом обновления 3) без установки другого программного обеспечения.

Он не жалуется на все классы, но только на один или два. например, TPanel / TForm / TEdit все в порядке.

Кто-нибудь может подумать, что вызывает это?

EDIT

exe на новом ПК установлен на 30 или около того других известных мне компьютерах, начиная от Windows XP Sp1,2,3, Windows Vista и Windows Embedded. старые и новые ПК были установлены со старой версией, а затем обновлены до последней версии. Разница лишь в том, что при последней установке скачок версии был выше.

Ответы [ 7 ]

9 голосов
/ 23 февраля 2009

Обычно это ошибка во время потоковой передачи .DFM. Обычно эта ошибка возникает с компонентами TLabel, потому что многие люди удаляют поля TLabel из формы или фрейма, чтобы сократить беспорядок и уменьшить размер экземпляра формы. Однако распространенная и запутанная ошибка, которую они совершают, заключается в том, что из-за своей чрезмерной ревности они удаляют все ссылки TLabel. Это когда плохие вещи начинают происходить. Позвольте мне рассказать, как потоковая система определяет класс компонента.

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

Возвращаясь к моему примеру с TLabel, эту проблему легко решить, просто убедившись, что хотя бы у одного из компонентов данного типа имеет поле. Так что, пока существует хотя бы поле типа TLabel, все другие TLabels будут загружаться очень хорошо. Поэтому в вашем случае убедитесь, что поля TListView или TImage не были удалены.

4 голосов
/ 23 февраля 2009

Re0sless,

Я предлагаю вам открыть и закрыть все формы вашего приложения и после этого сделать новую сборку. Если память мне хорошо помогает, это было решением, когда мы сталкивались с подобными проблемами.

Вы также можете взглянуть на DFM Check , чтобы автоматически открывать и закрывать все ваши dfm, и на CnPack , чтобы помочь вам очистить пункт об использовании.

С уважением,
Ливны

1 голос
/ 23 февраля 2009

Я думаю, что Lieven определенно на правильном пути: простые базовые классы, не найденные во время выполнения, являются проблемой Delphi (линкер). Это исключение , а не , вызванное операционной системой.

Мой опыт с аналогичными проблемами: компоновщик создает проект с неправильно расположенными блоками.
Пример: единица формы связана с базовыми единицами. Принуждение проекта к полной перекомпиляции / перекомпоновке должно исключить это исключение.

Простого [Перестроить все], вероятно, будет недостаточно. Вы можете попытаться перекомпилировать без оптимизации.

Я пытался воспроизвести эту ошибку, но не смог. Компилятор / компоновщик Delphi - один из лучших - скорость компиляции / скорость скомпилированных exe-файлов - но эта ошибка, безусловно, является пробным показом.

Примечание: я только испытал эта ошибка в D5. Есть кто-нибудь еще испытал эту ошибку с другими Delphi версии?

0 голосов
/ 20 апреля 2018

Измените имя формы и сохраните .pas под другим именем. Измените все ссылки, чтобы создать новое имя устройства, если оно используется в других устройствах. Построить все. При этом ошибка исчезла.

0 голосов
/ 11 февраля 2014

Решение для всех ошибок этого типа "Класс XXX не найден" простое. Откройте файл DFM формы в текстовом редакторе и вручную удалите определение объекта XXX.

0 голосов
/ 30 октября 2013

У меня была такая же проблема. Класс TCheckBox не найден. Я обычно редактирую большой набор компонентов через .DFM формы (например, переименовывая большое количество компонентов). Эта ошибка возникает, когда я переименовываю через нее все CheckBox в форме .DFM.

Я просто снял все флажки и вставил их снова (поэтому файл .DFM обновляется). Ошибка исчезла.

0 голосов
/ 25 апреля 2011

Я видел похожую проблему из-за ошибки копирования файла. Чтобы сделать вещи более запутанными, ошибка была в промежуточном медиа-устройстве. Проблема была решена простым повторным копированием файла из существующей сборки выпуска.

Возможно, сейчас невозможно подтвердить, но вполне возможно, что проблема была «решена»; не из-за удаления ненужного элемента пункта использования, а потому, что он также включал новую копию исполняемого файла.

...