Как решить внутреннюю ошибку Delphi [Pascal Fatal Error] F2084: LA33?

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

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

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

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

[Фатальная ошибка Pascal] F2084 Внутренняя ошибка: LA33

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

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

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

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


person Graza    schedule 30.09.2008    source источник
comment
какую версию следует использовать, чтобы не столкнуться с этой проблемой?   -  person Michael Küller    schedule 07.02.2011


Ответы (12)


Мне удалось решить это, следуя приведенной ниже процедуре

  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

person Graza    schedule 01.10.2008
comment
Я принял здесь свой собственный ответ, так как именно он его исправил, хотя Ларс также был очень полезен. Но в интересах того, чтобы не было слишком много ненужных открытых вопросов, я сделал это - не уверен, что это правильный способ делать что-то на S.O. но сойдет пока... - person Graza; 13.01.2010
comment
+1 за выяснение этого; Я хотел бы сделать еще один +1 за сообщение об этом в QC. - person Jeroen Wiert Pluimers; 13.09.2010
comment
Взрыв из прошлого здесь - но только что столкнулся с этой проблемой, пытаясь скомпилировать пакет с константой массива классов! - person Gerry Coll; 11.04.2014

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

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

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

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

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

person Lars Truijens    schedule 30.09.2008
comment
В XE4 была такая внутренняя ошибка, вызванная анонимными методами, и удаление всех файлов .dcu решило проблему. Спасибо. - person Edwin Yip; 22.06.2016

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

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;

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

person Biz    schedule 19.01.2011

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

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

person Pete    schedule 30.03.2011

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

Также удалось полностью отключить «использовать отладку .dcus». Это, конечно, нежелательно, но вы можете использовать его, чтобы проверить, связана ли проблема с каким-либо из ваших собственных модулей или с любым из модулей delphi.

person bjaastad_e    schedule 13.09.2010

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

person Marco    schedule 13.01.2014

Отключение «Включить символы удаленной отладки» в параметрах компоновщика устранило проблему для меня Delphi 2007, проект dll.

person user3310694    schedule 19.03.2014
comment
На Delphi7 помогло - person LFelix; 06.09.2019

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

person TmTron    schedule 24.07.2014

Для меня в D2010 отключение параметра компилятора «Выдавать информацию о типе времени выполнения» помогло.

person Riccardo Zorn    schedule 22.01.2013

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

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

person SeeMoreGain    schedule 28.11.2014

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

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

person Ash    schedule 04.05.2016

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

to const cLogFileName = 'logfilename.log';

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

person Christian    schedule 20.09.2018