2009-09-07 1 views
3

Когда я компилирую наш использование проекта Delphi 2010 Trial, там есть фатальная ошибка:Delphi2010 Compiler ошибка: F2084 Внутренняя ошибка: L1737

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

Кажись это внутренняя ошибка , Никаких намеков.

Является ли это ошибкой компилятора или пробным лимитом?

Спасибо.

+3

Фрагмент кода здесь поможет. –

+1

Возможно, это не всегда так, но IME для создания ICE в Delphi 2010 требуется больше, чем код фрагмента. –

+0

Really do'nt знаете, какой код здесь :( Только знаю, удалю ли MainForm Create в DPR-источнике, он может быть скомпилирован Похоже, что компоненты TMS вызвали ошибку, но эти компоненты действительно встроены в IDE и уже работали. – dzb2k9

ответ

1

Удостоверьтесь, что ваши пути не искалечены от старых версий.
Удостоверьтесь, что вы удалили все DCU, используемые в вашем проекте, включая сторонние компоненты (если у вас нет какого-либо компонента без источника, в этом случае дважды проверьте, что у вас есть последние DCU для D2010), затем выполните сборку для восстановления всех этих ,
Затем попробуйте разрезать ваше приложение на более мелкие детали и посмотрите, какая часть вызывает проблему: цель - иметь самое простое приложение, которое вызывает ошибку, чтобы иметь возможность отправить его в Embarcadero с разумной вероятностью для них чтобы найти проблему ...

+0

Я старался как вы сказали, кажется, что некоторые компоненты ui вызвали это, потому что, если я удалил Application.CreateForm (TFrmMain, FrmMain), это просто работает. Мы использовали компоненты старой версии TMS VirtualTree на нашем MainForm. I modif что они могут работать с D2010. Возможно, это проблема. – dzb2k9

4

Я не могу дать вам однозначного ответа. Посмотрите

Internal Compiler Errors

Что файл делает компилятор придраться? Любые идеи, что может быть проблемой? Любые новые функции, которые могут быть неисправными?

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

0

Идея не такая, но это определенно ошибка компоновщика (код начинается с L), и большинство из них, в свою очередь, связаны с перегрузкой функций или операторов. Они могут возникнуть и из ошибок компилятора, хотя, например, в некоторых старых версиях Delphi (D5, конечно, я думаю, что это было исправлено в D7), вы получили бы ошибку компоновщика при использовании перегруженных конструкторов, которые принимали необязательные параметры.

0

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

+0

Нет никаких старых DCU там, мы тщательно их очистили – dzb2k9

1

Вещи действительно улучшились с Delphi 2009 года, но в компиляторе все еще есть некоторые связанные с Generics глюки, которые могут вызвать такие ошибки. Проверьте, пытаетесь ли вы объявить общие классы или методы, а затем используйте их при необычных обстоятельствах. Если это так, попробуйте и отстраните его до небольшого воспроизводимого тестового примера и сообщите об этом в QC.

1

И, наконец, я нашел проблему.

Мы использовали один шаблон SmartPtr, представленный в блоге Барри Келли, компилятор D2010 считает, что это неверно. и слова smartptr отлично с D2009.

Большое спасибо.

Кстати, я после моего SmartPtr здесь :) и наш регион еще не D2010 для продажи :(

Я не знаю, что изменилось в реализации D2010 составителей'S.

type 

    TSmartPtr<T: class> = class(TInterfacedObject, TFunc<T>) 
    private 
    FValue: T; 
    public 
    constructor Create(AValue: T); 
    destructor Destroy; override; 
    function Invoke: T; 
    end; 

    TSmartPtrArray<T: class> = array of TFunc<T>; 


implementation 

{ TObjectHandle } 

constructor TSmartPtr<T>.Create(AValue: T); 
begin 
    FValue := AValue; 
end; 

destructor TSmartPtr<T>.Destroy; 
begin 
    if Assigned(FValue) then 
    FValue.Free; 
end; 

function TSmartPtr<T>.Invoke: T; 
begin 
    Result := FValue; 
end; 
1

У меня была такая же проблема из-за дженериков. Объявление типа словаря в процедуре (как упоминал Атл). После перемещения объявления этого типа в начало части реализации единицы - ошибка L1737 исчезла.

1

Такая же ошибка здесь. я удалил это раньше:

interface 

type 
    TBoolFunction = reference to function: Boolean; 

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

0

Это означает, что ваш код слишком сложный. Любой файл с определенным пороговым значением (10k строк или около того) начинает проявлять эти проблемы - другой - это «был скомпилирован с другой версией x».

Хотя обычно говорят, что связанный код в одном и том же блоке в delphi, он действительно не масштабируется, поэтому игнорируйте это и разбивайте как можно больше.

Смежные вопросы