2009-08-10 74 views
4

我在Delphi7中的後臺編譯器出現問題:在我的項目中有一行代碼導致後臺編譯器停止並顯示一條錯誤消息,因此無法執行CodeCompletion。正常的編譯器和語法檢查對此代碼沒有問題,並且生成的應用程序是正確的。在後臺跳過源代碼(kibitz)編譯器

我的問題是,如果在執行後臺編譯時有任何方法跳過此代碼行(例如編譯器指令)。

實施例的代碼重現該錯誤:

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    v.End; // This line stops kibitz compiler 
end; 

此代碼放置在其在主單元中使用的單位「Error.pas」。 如果您嘗試在主單元中調用CodeCompletion,它會停止並顯示消息「Error.pas could not be compiled」(真實消息是德語)。

有趣的是,只有在編譯項目或首次執行語法檢查時纔會出現錯誤。 編譯後CodeCompletion正在工作,Delphi必須重新啓動才能重現錯誤。

更新: 添加一個空的彙編程序塊與一個結束標籤是一個問題的解決方案。 這裏是改變的示例代碼,不停止後臺編譯:

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    asm 
    @@END: 
    end; 
    v.End; 
end; 

非常感謝,

基督教

+0

護理後什麼代碼*一行*和* errormessage的*是什麼樣子? – 2009-08-10 10:56:47

+0

您可以嘗試在此例程中添加一個空的asm/end塊。它可以防止kibitz編譯器跳過程序分析。 Graphics.pas有一個帶有@@ end標籤的asm/end塊,編譯器專門處理asm/end塊。 – 2009-08-10 15:51:03

回答

10

當解析到達光標位置時,背景編譯器不執行過程體分析。相反,它使用簡單的語法匹配(如begin/end對)。如果簡單的語法匹配表明該單元中的最終end已滿足,則它會提前退出。

這就是你的例子發生的事情。第一個End令牌不會被後期綁定邏輯轉義,因爲它不會被真實表達式編譯器解析,而是被讀爲過程的結尾。第二個end看起來像單元的末尾,後臺編譯器從來沒有看到任何進一步的。

補充:您可以嘗試在此例程中添加一個空的asm/end塊。它可以防止kibitz編譯器跳過程序分析。 Graphics.pas有一個帶有@@ end標籤的asm/end塊,編譯器專門處理asm/end塊。

2

貌似後臺編譯不知道如何處理做後期捆綁。 您是否知道使用哪個COM類型庫在對象上進行調用?如果您可以導出和使用基於類型庫的pascal包裝單元,那麼這對編譯和應用程序的性能都會有好處。 (請參閱主菜單中的導入類型庫選項)

+1

感謝您的回覆。該應用程序用於Word自動化。 單獨的晚期束縛似乎沒有問題。例如,您可以使用像「v.Foo」這樣的函數名稱,這將在後臺編譯中不會造成任何問題,儘管不存在具有此名稱的函數。 我認爲與Delphi關鍵字「結束」的組合是在這種特殊情況下的問題。 我認爲,使用包裝類的早期綁定是解決問題的最佳方法,當無法從源代碼中排除源代碼時。 – user153642 2009-08-10 14:53:49

+0

你是對的,我沒有注意到被調用的方法是一個保留字。這可能確實是殺手。如果你真的想要後期綁定,你可以*調用IDispatch方法來獲得一個方法指針來傳遞一個(空的)參數數組,但是這是一個漫長的過程... – 2009-08-10 18:13:12

1

嘗試用&轉義令牌?

所以

訴&end;

+0

對不起,但是用這個標記代碼不會被編譯。 – user153642 2009-08-14 11:08:57

+0

它被添加(我認爲)D2005。與.Net支持有關 - 我認爲很多.Net庫的名稱都是Delphi中保留關鍵字的方法。 – 2011-05-26 06:06:38

+0

不,它是更舊的。 D6手冊已經提到過它。我認爲它支持IDispatch,但原因是一樣的。 COM對象已經支持非delphi名字的方法。 – 2011-05-26 13:28:10