Как решить внутреннюю ошибку Delphi [Pascal Fatal Error] F2084:ЛА33?
Вопрос
Меня действительно тошнит от этой проблемы.Поисковые запросы Google, похоже, всегда предлагают "удалить все bpl для пакета", "удалить все dcu".Иногда это просто-не-работает.Надеюсь, я смогу почерпнуть здесь еще какие-нибудь идеи.
У меня есть собственный пакет, который был установлен без проблем несколько месяцев назад.Внеся несколько изменений в исходный код, я решил, что пришло время перекомпилировать / переустановить пакет.Теперь я получаю две ошибки, первая, если я выбираю "установить", это
Нарушение прав доступа по адресу 02422108 в модуле 'dcc100.dll'.Считывание адреса 00000000.
... или если я попытаюсь собрать / скомпилировать пакет, я получу
[Неустранимая ошибка Pascal] Внутренняя ошибка F2084:ЛА33
Это одна из тех проблем Delphi, которая, кажется, возникает снова и снова у многих из нас.Было бы здорово, если бы мы могли сопоставить ответ примерно так: "любой из этих шагов или их комбинация мог бы исправьте это, но если вы это сделаете ВСЕ эти шаги это будет исправь это...."
На данный момент я удалил все ссылки на файлы btl / dcp для этого пакета, но по-прежнему получаю ту же ошибку...
Использование BDS2006 (Delphi)
Обновление 01-Октябрь-2008:Мне удалось решить эту проблему - смотрите мой пост ниже.Поскольку я не могу принять свой собственный ответ, я не совсем уверен, что здесь делать.Очевидно, что подобные проблемы часто возникают у некоторых людей, поэтому я оставлю этот вопрос открытым на некоторое время, чтобы получить другие предложения.Тогда, я думаю, если кто-нибудь соберет всю информацию в супер-пост, я смогу принять ответ
Решение
Мне удалось решить эту проблему, следуя приведенной ниже процедуре
- Создайте новый пакет
- Один за другим добавляйте компоненты в пакет, компилируйте и устанавливайте, пока не произойдет сбой.
- Исследуйте устройство, вызвавшее неисправность.
Как оказалось, рассматриваемый модуль имел постоянный массив класса, например
TMyClass = class(TComponent)
private
const ErrStrs: array[TErrEnum] of string
= ('', //erOK
'Invalid user name or password', //erInvUserPass
'Trial Period has Expired'); //erTrialExp
protected
...
public
...
end;
Таким образом, похоже, что Delphi не любит константы класса (или, возможно, массивы констант класса) в компонентах пакета
Обновить:и да, об этом было сообщено codegear
Другие советы
Это ошибки в компиляторе / компоновщике.Вы можете найти множество ссылок на эти ошибки в Интернете в разных версиях Delphi, но это не всегда одни и те же ошибки.Это затрудняет поиск единого решения для всех этих различных проблем.
Как вы отметили, общими решениями, которые могли бы это исправить, являются:
- Удалить *.dcp *.dcpil *.dcu *.dcuil *.btl *.dll
- Перепишите свой код другим способом
- Повозитесь с опциями компилятора
- Получите последнюю версию Delphi
Я лично обнаружил, что одна из таких ошибок была устранена, если я отключил проверку диапазона.Другие решаются, если вы не используете дженерики из другого подразделения.И одна из них была решена, если название единицы измерения и название класса были переименованы, чтобы быть меньше.
И, конечно же, вы должны сообщать о любой возникшей у вас проблеме на http://qc.codegear.com
Возможно, следующий шаг будет лучшим решением:
Объявите массив как тип и просто определите константу класса с этим типом, например.
TMyArray = array[TErrEnum] of string;
TMyClass = class(TComponent)
private
const ErrStrs: TMyArray
= ('', //erOK
'Invalid user name or password', //erInvUserPass
'Trial Period has Expired'); //erTrialExp
protected
...
public
...
end;
Это делает объявление массива явным.
Я потратил несколько часов на эту проблему, удаляя dcu и т.д. безрезультатно.
Наконец, что сработало для меня, так это снять флажок Проверка переполнения в параметрах компилятора, перестроить проект, перепроверить проверку переполнения и снова перестроить.Вуаля!проблема исчезла.Пойди разберись.(все еще использую D7).
У меня был похожий случай, когда решением было удалить файл urlmon.dcu из /lib/debug.
Это также сработало, чтобы полностью отключить "использовать debug .dcu".Это, конечно, нежелательно, но вы можете использовать это, чтобы проверить, связана ли проблема с каким-либо из ваших собственных модулей или с любым из модулей delphi.
Попробуйте очистить "Выходной каталог", чтобы Delphi не смог оштрафовать dirty .DCU, и он вынужден удалить файл .PAS.Иногда это помогает.Если вы не настроили "выходной каталог", попробуйте удалить (или лучше переместить в папку резервной копии) все файлы .DCU.
Обновление Delphi XE3 2
Внутренняя ошибка F2084:URW1147
СЛУЧАЙ 1:
проблема заключалась в том, что тип был объявлен в процедуре универсального класса.
procedure TMyClass<TContainerItem, TTarget>.Foo();
type
TCacheInfo = record
UniqueList: TStringList;
UniqueInfo: TUniqueInfo;
end;
var
CacheInfo: TCacheInfo;
перемещение объявления типа в закрытую часть объявления класса решило эту проблему.
СЛУЧАЙ 2:
проблема в данном случае была связана с необязательным параметром:
unit A.pas;
interface
type
TTest<T> = class
public
type
TTestProc = procedure (X: T) of object;
constructor Create(TestProc_: TTestProc = nil);
end;
...
внутренняя ошибка компиляции произошла, как только переменная класса TTest была объявлена в другом модуле:например ,
unit B.pas:
uses A;
var
Test: TTest<TObject>;
решение состояло в том, чтобы сделать аргумент конструктора TestProc_
обязательный.
Для меня, в D2010 отключение опции компилятора "Выдавать информацию о типе среды выполнения" сделало свое дело.
Отключение "Включать символы удаленной отладки" в параметрах компоновщика устранило проблему для меня Delphi 2007, dll project
Судя по различным ответам, эта ошибка выглядит как общее необработанное компилятором исключение.
Моя проблема была вызвана ошибочным вызовом function X(someString:String) : Boolean;
который изменил строку и вернул логическое значение, используя someString := X(someString);
Поскольку мой опыт работы с внутренними ошибками таков, я переписал построчно и скомпилировал снова и понял, что некоторые инструкции if else работают не так, как
Возникает Внутренняя ошибка
if (DataType in ASet)
begin
//do work
end
else if (DataType = B)
begin
//do work
end
else
begin
//do work
end;
Как я решил :
if (DataType = B)
begin
//do work
end
else if (DataType in ASet)
begin
//do work
end
else
begin
//do work
end;
Просто поменял условия в качестве примера.Надеюсь, это поможет.
Я только что столкнулся с подобным поведением, приведшим к внутренней ошибке LA30.Причиной были недавно добавленные строковые константы.После перехода с
const cLogFileName : string = 'logfilename.log';
Для
const cLogFileName = 'logfilename.log';
(и, конечно же, перезапуск Delphi IDE) ошибка больше не появлялась.