2008-09-30 93 views
17

我真的很討厭這個問題。谷歌搜索似乎總是建議「刪除所有包的bpls」,「刪除所有dcus」。有時候這只是不工作。希望我能在這裏得到一些其他的想法。如何解決Delphi的[Pascal致命錯誤] F2084內部錯誤:LA33?

我有內部編寫一個包,裏面有沒有問題,幾個月前安裝完畢。對源代碼進行了一些更改後,我認爲是時候重新編譯/重新安裝軟件包了。現在我得到兩個錯誤,第一個如果我選擇「安裝」是

模塊'dcc100.dll'中地址02422108的訪問衝突。讀地址00000000

...或者,如果我嘗試建立/編譯軟件包,我得到

[帕斯卡爾致命錯誤] F2084內部錯誤:LA33

這是一個這些德爾福問題似乎一次又一次地發生在我們許多人身上。將是巨大的,如果我們能夠整理沿線的響應東西「這些步驟可能解決它的任何一個或組合,但如果你所有這些步驟是解決它......」

目前,我已經刪除的BPL/DCP文件的所有引用這個包,但仍然得到同樣的錯誤...

使用BDS2006(德爾福)

更新01-辛2008年:我設法解決了這個問題 - 請參閱下面的文章。由於我不能接受我自己的答案,我不完全確定在這裏做什麼。很顯然,這些類型的問題經常發生在一些人身上,所以我會暫時將其打開以獲得其他建議。那麼我想如果有人整理所有的信息變成一個超級後,我可以接受的答案

+0

哪個版本應該用來不要面對這個問題? – 2011-02-07 10:04:55

回答

14

任何問題,我設法解決這個問題,在按照以下步驟

  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

+1

我已經接受了我自己的答案,因爲它是修復它的人,儘管Lars也非常有幫助。但爲了沒有太多不必要的開放性問題,我已經這樣做了 - 不確定這是否是在S.O上做的事情的正確方法。但它現在會做... – Graza 2010-01-12 23:37:09

+1

+1找出來;我希望我可以在QC中做另一個+1報告。 – 2010-09-13 19:34:59

4

這些都是在編譯器/連接錯誤。你可以在不同的Delphi版本在互聯網上的這些缺陷的許多引用,但它們並不總是相同的錯誤。這使得難以爲所有這些不同類型的問題提供一種解決方案。

可能解決它的一般解是,正如你指出:

  • 刪除* .dcp * .dcpil * .dcu * .dcuil * .bpl * .DLL
  • 重寫代碼以另一種方式
  • 鼓搗編譯器選項
  • 獲取最新版本的Delphi

我個人發現這樣的錯誤之一,如果我關掉穰待解決e檢查。如果不從其他單位使用泛型別人都解決了。如果單位名稱和班級名稱被重新命名爲較小,則解決了一個問題。

當然,你應該報告您對http://qc.codegear.com

+0

在XE4下,由匿名方法導致內部錯誤,並刪除所有.dcu文件解決了這個問題。謝謝。 – 2016-06-22 07:49:17

1

我也有類似的情況,那裏的解決方法是刪除/升的文件urlmon.dcu IB /調試。

它也一直在關閉「使用調試.dcus」。這當然是不可取的,但是你可以用它來檢查問題是出在你自己的任何單位還是任何德爾福的單位上。

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; 

這使得數組聲明是顯式的。

2

我在這個問題上浪費了幾個小時,刪除了dcu's等無濟於事。

最後,我的工作是取消選中編譯器選項中的溢出檢查,重建項目,重新檢查溢出檢查和再次重建。瞧!問題已經消失。去搞清楚。 (仍然使用D7)。

0

對我來說,在D2010中禁用編譯器選項「Emit runtime type information」發揮了重要作用。

1

嘗試清理「輸出目錄」,以便Delphi不會罰款髒.DCU,並且它被迫禁用.PAS。 有時候這會有所幫助。 如果您未配置「輸出目錄」,請嘗試刪除(或更好地移動備份文件夾中的)所有.DCU文件。

0

禁用 「包括遠程調試符號」,從連接器選項解決了該問題,我2007年德爾福,DLL項目

1

德爾福XE3更新2

F2084 Internal Error: URW1147

案例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_的構造函數參數非可選。

0

從各種答案看,這個錯誤看起來是編譯器通用的未處理的異常。

我的問題是由錯誤地調用function X(someString:String) : Boolean;這改變了串並返回一個布爾值,使用someString := X(someString);

0

由於我的內部錯誤的經驗造成的是行,我重新寫線和重新編譯,並意識到,一些如果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; 

只是切換條件作爲example.Hope它有幫助。

相關問題