Как решить внутреннюю ошибку Delphi [Pascal Fatal Error] F2084: LA33? - PullRequest
18 голосов
/ 30 сентября 2008

Мне очень надоела эта проблема. Похоже, поиски в Google всегда предлагают «удалить все пакеты для пакета», «удалить все dcus». Иногда это просто не работает. Надеюсь, у меня появятся другие идеи.

У меня есть собственный пакет, который был установлен без проблем несколько месяцев назад. Сделав несколько изменений в источнике, я решил, что пришло время перекомпилировать / переустановить пакет. Теперь я получаю две ошибки, первая, если я выберу «установить», это

Нарушение прав доступа по адресу 02422108 в модуле 'dcc100.dll'. Чтение адреса 00000000.

... или если я попытаюсь собрать / скомпилировать пакет, я получу

[Patal Fatal Error] F2084 Внутренняя ошибка: LA33

Это одна из тех проблем Delphi, которая, похоже, возникает снова и снова для многих из нас. Было бы замечательно, если бы мы могли сопоставить ответ что-то вроде "любой один или комбинация этих шагов может исправить это, но если вы выполните все эти шаги это будет исправить это .... "

В данный момент я удалил все ссылки на файлы bpl / dcp для этого пакета, но все еще получаю ту же ошибку ...

Использование BDS2006 (Delphi)

Обновление 01-окт-2008: мне удалось решить эту проблему - см. Мой пост ниже. Поскольку я не могу принять свой собственный ответ, я не совсем уверен, что делать здесь. Очевидно, что подобные проблемы часто возникают у некоторых людей, поэтому я оставлю это открытым некоторое время, чтобы получить другие предложения. Тогда я думаю, что если кто-то соберет всю информацию в супер-пост, я могу принять ответ

Ответы [ 12 ]

15 голосов
/ 01 октября 2008

Мне удалось решить эту проблему, выполнив следующую процедуру

  1. Создать новый пакет
  2. Один за другим добавляйте компоненты в пакет, компилируйте и устанавливайте, пока не произойдет сбой.
  3. Расследовать устройство, вызвавшее сбой.

Как оказалось, рассматриваемая единица имела массив констант класса, например,

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

4 голосов
/ 30 сентября 2008

Это ошибки в компиляторе / компоновщике. Вы можете найти множество ссылок на эти ошибки в Интернете в разных версиях Delphi, но они не всегда являются одинаковыми ошибками. Из-за этого сложно дать одно решение для всех этих разных видов проблем.

Общие решения, которые могут это исправить, как вы заметили:

  • Удалить * .dcp * .dcpil * .dcu * .dcuil * .bpl * .dll
  • Перепишите свой код другим способом
  • Тинкер с опциями компилятора
  • Получить последнюю версию Delphi

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

И, конечно, вы должны сообщать о любых проблемах, которые у вас есть на http://qc.codegear.com

3 голосов
/ 19 января 2011

Может быть, следующий шаг будет лучшим решением:
Объявите массив как тип и просто определите константу класса с этим типом, например.

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;

Это делает объявление массива явным.

2 голосов
/ 31 марта 2011

Я потратил несколько часов на эту проблему, удаляя dcu и т. Д. Безрезультатно.

Наконец, для меня сработало отменить проверку переполнения в параметрах компилятора, пересобрать проект, перепроверить проверку переполнения и заново собрать. Вуаля! проблема ушла Пойди разберись. (все еще использую D7).

1 голос
/ 24 июля 2014

Delphi XE3 Update 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_ необязательным.

1 голос
/ 13 января 2014

Попробуйте очистить «Выходной каталог», чтобы Delphi не мог нормально обрабатывать грязные .DCU, и он вынужден создавать .PAS. Иногда это помогает. Если вы не настроили «выходной каталог», попробуйте удалить (или лучше переместить в резервную папку) все файлы .DCU.

1 голос
/ 13 сентября 2010

У меня был похожий случай, когда решением было удалить файл urlmon.dcu из /lib/debug.

Это также сработало, чтобы полностью отключить "use debug .dcus". Это, конечно, нежелательно, но вы можете использовать его, чтобы проверить, связана ли проблема с какими-либо вашими юнитами или с какими-либо юнитами delphi.

0 голосов
/ 20 сентября 2018

Я только что столкнулся с подобным поведением, что привело к внутренней ошибке LA30. Причиной были недавно добавленные строковые константы. После изменения от const cLogFileName : string = 'logfilename.log';

в const cLogFileName = 'logfilename.log';

(и, конечно, перезапуск Delphi IDE) ошибка больше не обнаруживалась.

0 голосов
/ 04 мая 2016

Поскольку мой опыт Внутренней ошибки таков, я переписывал построчно, снова компилировал и понял, что некоторые операторы 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;

Просто переключил условия в качестве примера. Надеюсь, это поможет.

0 голосов
/ 28 ноября 2014

Из различных ответов эта ошибка выглядит как обобщенное необработанное исключение компилятором.

Моя проблема была вызвана ошибочным вызовом function X(someString:String) : Boolean;, который изменил строку и вернул логическое значение, используя someString := X(someString);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...