2013-10-16 9 views
6

這樣工作還是我做錯了什麼?將單元添加到項目中是從項目源中刪除編譯器指令

我在我的項目源此代碼:

{$IFDEF DEBUG} 
    ADebugUnit, 
    {$ELSE} 
    ARelaseUnit, 
    {$ENDIF} 

我想ADebugUnit要在調試模式下使用,但AReleaseUnit在釋放模式編譯時使用。當我選擇向項目中添加一個新單元時,這非常有效。當我這樣做時,它將基本上處理代碼,只保留與當前設置的項目相關的單元。

例如,如果將配置設置爲調試添加一個新的單位到我的項目上面的代碼更改剛過則:

ADebugUnit, 

或者,如果我的配置設置爲Release它將改變的在添加新單元之後:

ARelaseUnit, 

我必須在添加新單元后總是將它恢復到條件語句。有沒有辦法做到這一點,而不會增加新的單位干預?

+0

我寫我自己的.dpr文件並撤消由IDE所做的更改。 VCS幫助。有些東西需要在.dpr文件中有條件。 –

+1

不幸的是,IDE並不總是乾淨整潔的工作,而且經常破壞整個工程文件。我甚至看到它進一步複製'uses'子句,所以它被複制。 –

+0

我確實要說我們有一個我們正在評估的Delphi XE5的副本,並且在該環境中嘗試了一下,並且它可以按照預期工作,因爲我可以在項目源中使用條件包含,並使用添加單元選項,它不會刪除條件編譯器指令。這是我期望在Delphi XE2中工作的,但沒有。 –

回答

2

IDE擁有大部分DPR文件。要小心你對它做了什麼,否則你冒着與你觀察到的一樣的風險(或更糟 - 根據變化的性質,IDE有時可能決定不允許編譯文件!)。

除此之外,這意味着您不能有條件地在DPR文件中包含單位。無論您想要解決什麼問題,您都必須找到另一種解決方案。

例如,也許你可以在你的項目中的其他地方使用該單元而不是DPR文件。

或者,也許你可以將兩個單元合併爲一個,然後將其內容改爲有條件編譯。

或者也許你可以隨時使用調試代碼,因爲這會增加你發佈相同代碼的機會。

或者,如果只有在使用「添加單元」對話框時纔會出現此問題,則可以放棄該對話框並手動編輯DPR文件。除了使用子句被重寫之外,沒有其他魔法可以添加到項目中,除非你已經注意到了。

+0

同意,這是一個PITA。有幾件事情不能在* .DPR文件中工作,否則IDE會偶爾拋出它們。這是其中之一。單一的最佳建議是儘可能地將其放入另一個單位。 – JensG

+0

@Rob - 我們可以根據需要手動添加單位,這是我們如何解決它(或在事實之後修復它)。儘管我們正在考慮完全消除條件,這將是理想的解決方案。 –

0

要建立Rob的答案,無論何時我需要做類似這樣的事情時,我都會將所有DPR代碼遷移到另一個單元,例如AppInit.pas

unit AppInit; 

interface 

uses 
    Vcl.Forms, 
    Unit1, 
{$IFDEF DEBUG} 
    ADebugUnit 
{$ELSE} 
    AReleaseUnit 
{$ENDIF} 
    ; 

procedure RunApp; 

implementation 

procedure RunApp; 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.Title := 'Sample Application'; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end; 

end. 

那麼你的項目單位只能有

program SampleApp; 

uses 
    Vcl.Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    AppInit in 'AppInit.pas'; 

{$R *.res} 

begin 
    RunApp; 
end. 

這樣做的下側是IDE將被困惑,它是什麼類型的應用程序,而當你去Project > Options ,某些功能將被禁用,例如VCL樣式。有了正確的編碼,這些東西仍然可以實現。

PS - 請原諒我將這個100%直接寫入StackOverflow,所以很抱歉,如果我在代碼中搞點東西了。在響應某些IDE操作

4

的問題是,在應用列表中的DPR似乎不會尊重任何$ IFDEF的和實際上將其刪除(因爲你已經找到),當它重新寫入應用列表。

一種選擇是從不使用IDE操作,例如「添加/刪除單元」等,只能手動管理DPR使用列表。

或者有點小心,你可能可以使用單位別名來實現你想要的。

考慮兩個單位,你希望在任何使用或其他取決於生成配置(調試或發佈):

  • DebugUnit.pas
  • ReleaseUnit.pas

在你的項目選項添加單位別名爲:

DEBUG配置:

UnitToUse=DebugUnit 

發佈配置:

UnitToUse=ReleaseUnit 

在您的DPR添加一個條目的用途清單:

uses 
    UnitToUse, 

在DPR此條目不能使用標識的文件名「in」語法,而必須依賴項目搜索路徑上所需的實際單位。

任何地方,你通常會使用DebugUnitReleaseUnit,而不是指UnitToUse。很明顯,別名的名稱完全取決於你。

如果兩個單元具有相同的接口「合同」,那麼只需通過更改目標配置,您的構建就可以在這兩個單元之間切換。

如果他們有不同的接口合同,那麼你仍然可以使用$ IFDEF指令在應用程序代碼與內容合作爲準單位UnitToUse是指適當,例如

uses 
    UnitToUse; 


procedure DoSomethingInvolvingAliasedUnit; 
begin 
    {$ifdef DEBUG} 
    // code which relies on the debug unit 
    {$else} 
    // code which relies on the release unit 
    {$endif} 
end; 
相關問題