2009-02-23 4 views
2

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

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

или

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

У нас есть установил его на десятки компьютеров, прежде чем без инцидентов, но эта последняя установка является проблематичной.

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

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

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

EDIT

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

+0

@ Re0sless, медведь со мной, пока я играю адвоката дьявола, но действительно ли вы скопировали exe с рабочей машины на нерабочую машину и подтвердили, что она не работает? Если бы вы это сделали, мы могли бы заложить этот путь для отдыха. К сожалению, кроме того, что мы очищаем пункт использования, я вне предложения. –

+0

@ Re0sless - вам не нравится делиться тем, что было последним? –

+0

Я выяснил, что в предложении uses есть единица, которую мы больше не использовали, после того, как она была удалена из всех единиц, которые мы используем, проблема исчезла, я все еще не уверен, почему она не показывалась другие компьютеры. – Re0sless

ответ

4

Re0sless,

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

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

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

+0

Я только что попробовал «Проверка DFM», и он может вернуться в режим ОК, поэтому я попытаюсь открыть каждую форму, чтобы попытаться ее решить, есть ли причина, по которой я не получаю ошибки на других ПК, если ее проблема VCL/DFM ? – Re0sless

+0

@ Re0sless. Моим первым действием было бы очистить все мое приложение uses с CnPack и проверить, что я не ошибаюсь, используя пакеты времени выполнения. Я бы использовал procmon и filter на * .bpl, чтобы проверить, пытается ли приложение загрузить bpl. hth, Lieven –

+0

... также, вы сравнили exe, который вы устанавливаете на новых машинах с установленным на старом? Вы пытались взять exe из «старой» машины и скопировать ее на новую машину? –

1

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

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

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

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

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

9

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

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

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

0

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

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

0

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

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

0

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