2008-09-30 89 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它有帮助。

相关问题