Delphi 2005 年,无法构建 Indy 10

Delphi 2005, can't build Indy 10

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

[Error] IdMessageHelper.pas(78): E2250 There is no overloaded version of 'LoadFromStream' that can be called with these arguments

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 的全新安装。

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

在 Delphi 2005 及之后的版本中,它通过定义 class helper(这是 Delphi 2005 中引入的功能)来向 TIdMessage 组件而无需修改 IdMessage.pas 单元本身。这允许 Indy 在使用新功能 1.

时让人们使用熟悉的 IdMessage1.LoadFrom...()IdMessage1.SaveTo...() 语法

这样做是为了不引起 IdMessage 单元本身的接口中断更改。在 IdMessageHelper.pas 单元首次添加到 Indy 时,我在博客中介绍了这个新增功能:

New TIdMessage helper

在您的情况下,错误消息是关于第 78 行的抱怨:

AMsg.LoadFromStream(AStream, AHeadersOnly);

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

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

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

但是,我没有在 Delphi 2005 中专门测试 class 助手(因为我没有安装那个版本),所以编译器错误可能表明 class helpers(当时是一个新的语言特性)仍然有一些问题,后来被修复了。

如果找不到歧义的原因,可以通过修改 IdMessageHelper.pas 取消定义 HAS_CLASS_HELPER for Delphi 2005 1 来解决此问题,然后重新编译 Indy。

1:在 Delphi 的旧版本中 class 助手不可用,IdMessageHelper.pas 还定义了几个独立的 TIdMessageHelper_LoadFrom...()TIdMessageHelper_SaveTo...() 函数,因此人们仍然可以使用新的 AUsesDotTransparency 功能,只是调用语法不太理想。


编辑:事实证明,class 助手在 Delphi 2005 年非常有问题,were not officially supported until Delphi 2006:

Class helpers have now been formally introduced in the Win32 compiler [in Delphi 2006]. In Delphi 2005 class helpers were not formally available, and although you could use them they were actually quite buggy. It was quite easy to get internal compiler errors while using them, nothing you could complain to with Borland about as this feature was not officially supported.

所以,我现在在 Delphi 2005 中禁用了 TIdMessageHelper 助手 class,并相应地更新了上述博客文章。