2016-09-06 41 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中消失了嗎? –