Подтвердить что ты не робот

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

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

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

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

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

[Неустранимая ошибка Pascal] F2084 Внутренняя ошибка: LA33

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

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

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

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

4b9b3361

Ответ 1

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

  • Создать новый пакет
  • Один за другим добавьте компоненты в пакет, скомпилируйте и установите, пока он не сработает.
  • Исследуйте устройство, вызывающее отказ.

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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;

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Обновление Delphi XE3 2

F2084 Внутренняя ошибка: URW1147

CASE 1:

проблема заключалась в том, что тип был объявлен в процедуре общего класса.

procedure TMyClass<TContainerItem, TTarget>.Foo();
type
  TCacheInfo = record
    UniqueList: TStringList;
    UniqueInfo: TUniqueInfo;
  end;
var
  CacheInfo: TCacheInfo;

перемещение объявления типа в частную часть объявления класса решило эту проблему.

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

Ответ 8

Для меня в D2010 отключить параметр компилятора "Испустить информацию о типе времени выполнения" сделал трюк.

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

const cLogFileName = 'logfilename.log';

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

Ответ 13

Вы не имеете ничего общего с проблемой, которую вы хотите получить, вы не имеете права Borland, вы хотите установить ее в настоящий момент в Гуала, todo queda funcionando correamente.

Saludos.