我在IdMessageHelper.pas
包中构建IndyProtocols90
单元时收到错误。 LoadFromStream
和LoadFromFile
的所有实例都声称签名存在问题:
[错误] IdMessageHelper.pas(78):E2250没有可以使用这些参数调用的'LoadFromStream'的重载版本
procedure Internal_TIdMessageHelper_LoadFromStream(AMsg: TIdMessage; AStream: TStream;
const AHeadersOnly: Boolean; const AUsesDotTransparency: Boolean);
var
LMsgClient: TIdMessageClient;
begin
if AUsesDotTransparency then begin
AMsg.LoadFromStream(AStream, AHeadersOnly);
end else
begin
// clear message properties, headers before loading
AMsg.Clear;
LMsgClient := TIdMessageClient.Create;
try
Internal_TIdMessageClientHelper_ProcessMessage(LMsgClient, AMsg, AStream, AHeadersOnly, False);
finally
LMsgClient.Free;
end;
end;
end;
我看到IdMessageHelper
对于这个版本是新的,但是被调用的方法(例如IdMessage.LoadFromStream
),它的参数从最后几个版本没有改变 - 至少不是对于我有源的那些。
procedure TIdMessage.LoadFromStream(AStream: TStream; const AHeadersOnly: Boolean = False);
var
LMsgClient: TIdMessageClient;
begin
// clear message properties, headers before loading
Clear;
LMsgClient := TIdMessageClient.Create;
try
LMsgClient.ProcessMessage(Self, AStream, AHeadersOnly);
finally
LMsgClient.Free;
end;
end;
我很确定我删除了所有以前的版本和软件包,因为这是D2005的干净安装。
答案 0 :(得分:3)
IdMessageHelper
单元为LoadFrom...()
组件引入了新的SaveTo...()
和TIdMessage
方法,以便在加载/保存电子邮件时添加AUsesDotTransparency
参数。
在Delphi 2005及更高版本中,它通过定义class helper(这是Delphi 2005中引入的一个特性)来向TIdMessage
组件添加新方法而不必修改{{1单位本身。这允许Indy在使用新功能 1 时让人们使用熟悉的IdMessage.pas
和IdMessage1.LoadFrom...()
语法。
事情是这样完成的,以免导致IdMessage1.SaveTo...()
单位本身的界面破坏变化。我在第一次将IdMessage
单位添加到Indy时发表了关于这一新增内容的博客:
在您的情况下,错误消息抱怨第78行:
IdMessageHelper.pas
当AMsg.LoadFromStream(AStream, AHeadersOnly);
为True时,该行是尝试调用预先存在的2参数TIdMessageHelper.LoadFromStream()
方法的新3参数TIdMessage.LoadFromStream()
方法:
AUsesDotTransparency
我在后来的Delphi版本中测试了这个新的类助手,它对我来说很好。您不应该收到编译器错误,因为不应该有任何歧义。
但是,我没有专门测试Delphi 2005中的类助手(因为我没有安装该版本),因此编译器错误可能表明类助手(当时是一种新的语言功能) )仍然是一个小马车,后来修好了。
如果找不到歧义的原因,可以通过修改procedure TIdMessage.LoadFromStream(AStream: TStream; const AHeadersOnly: Boolean = False);
为Delphi 2005 1 取消定义IdMessageHelper.pas
来解决此问题,并且然后再次重新编译Indy。
1 :在没有类帮助程序的旧版Delphi中,HAS_CLASS_HELPER
还定义了几个独立的IdMessageHelper.pas
和TIdMessageHelper_LoadFrom...()
函数,因此人们仍然可以利用新的TIdMessageHelper_SaveTo...()
功能,只需使用不太理想的调用语法。
编辑:事实证明,在Delphi 2005中,类帮助程序非常错误,were not officially supported until Delphi 2006:
现在已经在Win32编译器中正式引入了类助手[在Delphi 2006中]。在Delphi 2005中,类帮助程序没有正式可用,虽然你可以使用它们但它们实际上非常错误。在使用它们时很容易出现内部编译器错误,没有什么可以向Borland投诉,因为此功能未得到官方支持。
所以,我现在已经在Delphi 2005中禁用了AUsesDotTransparency
助手类,并相应地更新了上面提到的博客文章。