我真的厌倦了这个问题。谷歌搜索似乎总是建议“删除包的所有bpls”,“删除所有dcus”。有时这只是不行。希望我能在这里得到一些其他想法。
我有一个内部写的包,几个月前没有问题安装。对源进行了一些更改后,我认为是时候重新编译/重新安装软件包了。现在我得到两个错误,第一个如果我选择“安装”是
模块'dcc100.dll'中地址02422108的访问冲突。读取地址00000000。
...或者如果我尝试构建/编译包,我会得到
[Pascal致命错误] F2084内部错误:LA33
对于我们中的许多人来说,这似乎是一次又一次出现的德尔福问题之一。如果我们可以按照“任何一个或这些步骤可能修复它的任何一个或组合的方式整理响应,那将是很好的,但如果你所有这些步骤 >将修复它....“
目前,我已删除了对此程序包的bpl / dcp文件的所有引用,但仍然收到相同的错误...
使用BDS2006(Delphi)
2008年10月1日更新:我设法解决了这个问题 - 请参阅下面的帖子。由于我不能接受我自己的答案,我不完全确定在这里做什么。显然,对于某些人来说,这些类型的问题经常发生,所以我会暂时保持开放以获得其他建议。然后我想如果有人将所有信息整理成超级帖子,我可以接受答案
答案 0 :(得分:15)
我设法按照以下程序解决了这个问题
事实证明,有问题的单位有一个类常数数组,例如
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 :(得分:4)
这些是编译器/链接器中的错误。您可以在不同的Delphi版本中找到这些错误的许多参考,但它们并不总是相同的错误。这使得很难为所有这些不同类型的问题提供一种解决方案。
正如您所指出的那样,可以修复它的一般解决方案是:
如果我关闭范围检查,我个人发现其中一个错误有待解决。如果你不使用其他单位的泛型,其他人就会解决。如果将单元名称和类名重命名为较小,则可以解决一个问题。
当然,您应该报告http://qc.codegear.com
上的任何问题答案 2 :(得分: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;
这使得数组声明显式。
答案 3 :(得分:2)
我在这个问题上浪费了几个小时,删除了dcu等等无济于事。
最后,对我有用的是取消选中编译器选项中的溢出检查,重建项目,重新检查溢出检查,以及重新重建。瞧!问题已经消失。去搞清楚。 (仍在使用D7)。
答案 4 :(得分:1)
我有类似的情况,解决方法是从/ lib / debug中删除文件urlmon.dcu。
它也完全关闭了“使用debug .dcus”。这当然是不可取的,但是您可以使用它来检查问题是否与您自己的任何单位或任何delphi的单位有关。
答案 5 :(得分:1)
尝试清理“输出目录”,这样德尔福就无法对脏.DC进行精细处理,并且它被强制使用.PAS。 有时这有帮助。 如果您没有配置“输出目录”,请尝试删除(或更好地移动备份文件夹)所有.DCU文件。
答案 6 :(得分:1)
Delphi XE3 Update 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_
的构造函数参数不可选。
答案 7 :(得分:0)
对我来说,在D2010中,禁用编译器选项“发送运行时类型信息”就可以了。
答案 8 :(得分:0)
禁用&#34;包括远程调试符号&#34;来自链接器选项修复了我的问题Delphi 2007,dll项目
答案 9 :(得分:0)
从各种答案中,此错误看起来是编译器的一般未处理异常。
我的问题是由于错误地调用function X(someString:String) : Boolean;
来改变字符串并返回布尔值,使用someString := X(someString);
答案 10 :(得分:0)
正如我对内部错误的体验那样,我重新逐行编写并再次编译,并意识到某些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;
只是将条件改为示例。希望它有所帮助。
答案 11 :(得分:0)
我刚刚经历了类似的行为,导致内部错误LA30。
原因是新添加的字符串常量。
从改变后
const cLogFileName : string = 'logfilename.log';
到
const cLogFileName = 'logfilename.log';
(当然还有重新启动Delphi IDE),该错误不再显示。