2016-09-06 22 views
1

我在IndyProtocols90包中构建IdMessageHelper.pas单元时收到错误。的LoadFromStreamLoadFromFile所有实例都声称有带有签名的一个问题:德尔福2005年,无法建立Indy 10

[错误] 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安装。

回答

3

IdMessageHelper单元引入了新的LoadFrom...()SaveTo...()方法为TIdMessage组件,加载/保存电子邮件时,添加一个AUsesDotTransparency参数。

2005年Delphi和之后,它通过定义class helper(其在2005年的Delphi引入的功能),以添加新的方法到TIdMessage部件,而不必修改IdMessage.pas单元本身执行此操作。这允许Indy在使用新功能时让人们使用熟悉的IdMessage1.LoadFrom...()IdMessage1.SaveTo...()语法。

事情是这样完成的,以免在IdMessage单元本身造成接口突变。我的博客上讲述这个新增加的IdMessageHelper.pas单位首先加在印时间:

New TIdMessage helper

在你的情况下,该错误信息是在抱怨78行:

AMsg.LoadFromStream(AStream, AHeadersOnly); 

这条线是新的3参数TIdMessageHelper.LoadFromStream()方法试图调用预先存在的2参数TIdMessage.LoadFromStream()方法时AUsesDotTransparency为True:

procedure TIdMessage.LoadFromStream(AStream: TStream; const AHeadersOnly: Boolean = False); 

我在后来的Delphi版本中测试过这个新的类助手,它对我来说工作正常。你不应该得到一个编译器错误,因为不应该有任何歧义。

但是,我没有专门测试Delphi 2005中的类助手(因为我没有安装该版本),因此编译器错误可能表明类助手(作为新的语言功能时间)仍然有点小错误,并在稍后修复。

如果你不能找到歧义的原因,可以解决此问题通过修改IdMessageHelper.pas取消定义HAS_CLASS_HELPER 2005年德尔福,然后重新编译印。

:在老版本的Delphi,其中类的助手都没有,也IdMessageHelper.pas定义了几个独立TIdMessageHelper_LoadFrom...()TIdMessageHelper_SaveTo...()功能,因此人们仍然可以利用新的功能AUsesDotTransparency,只需用不太理想调用语法。


编辑:事实证明,类佣工在2005年德尔福非常错误,而且were not officially supported until Delphi 2006

类佣工现在在Win32编译[2006年德尔福]已正式出台。在德尔福2005年班助手并没有正式提供,虽然你可以使用他们,但他们实际上很有问题。在使用它们的时候很容易出现内部编译错误,没有什么可以向Borland抱怨的,因为这个功能没有官方的支持

因此,我现在禁用了Delphi 2005中的TIdMessageHelper辅助类,并相应地更新了上述博客文章。

+0

问题存在于“IdMessageHelper.pas”和“IdIMAP4.pas”中。我只是将支票更改为“{$ IFDEF VCL_2006_OR_ABOVE}”,并且工作正常。谢谢。 – fourwhey

+0

在D2005中引入了类助手,所以我仍然想明白为什么代码在D2005中不起作用(特别是因为失败只发生在78行上,对吗?第50行是另一个重载的调用,即'TIdMessage'方法,但它不会失败,对吧?)。 –

+0

如果你重命名'IdMessageHelper.pas'中的帮助器方法(比如说'LoadFrom ... Ex()'和'SaveTo ... Ex()'),但仍然在第50行调用原始的'TIdMessage'方法和78,这个问题在D2005中消失了吗? –