Delphi 2005,无法构建Indy 10

时间:2016-09-06 17:01:29

标签: delphi indy

我在IdMessageHelper.pas包中构建IndyProtocols90单元时收到错误。 LoadFromStreamLoadFromFile的所有实例都声称签名存在问题:

  

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

1 个答案:

答案 0 :(得分:3)

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

在Delphi 2005及更高版本中,它通过定义class helper(这是Delphi 2005中引入的一个特性)来向TIdMessage组件添加新方法而不必修改{{1单位本身。这允许Indy在使用新功能 1 时让人们使用熟悉的IdMessage.pasIdMessage1.LoadFrom...()语法。

事情是这样完成的,以免导致IdMessage1.SaveTo...()单位本身的界面破坏变化。我在第一次将IdMessage单位添加到Indy时发表了关于这一新增内容的博客:

New TIdMessage helper

在您的情况下,错误消息抱怨第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.pasTIdMessageHelper_LoadFrom...()函数,因此人们仍然可以利用新的TIdMessageHelper_SaveTo...()功能,只需使用不太理想的调用语法。

编辑:事实证明,在Delphi 2005中,类帮助程序非常错误,were not officially supported until Delphi 2006

  

现在已经在Win32编译器中正式引入了类助手[在Delphi 2006中]。在Delphi 2005中,类帮助程序没有正式可用,虽然你可以使用它们但它们实际上非常错误。在使用它们时很容易出现内部编译器错误,没有什么可以向Borland投诉,因为此功能未得到官方支持

所以,我现在已经在Delphi 2005中禁用了AUsesDotTransparency助手类,并相应地更新了上面提到的博客文章。