2015-04-22 59 views
1

那麼我發現nsis部分隱藏的一些論壇主題,也檢查NSIS的幫助,但無法找到我的答案。我想要一個簡單的東西,即按照我的要求,我想完全隱藏一個部分,而不用註釋整行代碼。NSIS部分隱藏(編譯和執行)

現在這應該影響兩件事。

  1. 部分應從編譯範圍中刪除,就像我評論這些行一樣。
  2. 不要從安裝程序執行代碼。

如果我使用#,/ o或 - 節名前。它正在做第二點。但任何方式來實現第一個?

回答

2

可以使用條件編譯:

!define INCLUDESECTION 

!ifdef INCLUDESECTION 
Section "section1" 
    ... 
SectionEnd 
!endif 

您還可以決定是將部分或沒有,從命令行:

makensis.exe /DINCLUDESECTION example.nsi 

在這種情況下,你不必定義在你的nsis代碼中包含INCLUDESECTION。

+0

是的,這是一個很好的。但是沒有內置命令切換來跳過隱藏部分編譯。我對嗎? – hypheni

+1

隱藏部分是在「組件」頁面上未顯示給用戶的部分。它不是「禁用」或非活動部分,因此隱藏部分在運行時執行,因此必須進行編譯。 –

+0

好的。所以隱藏意味着只跳過用戶視圖。 'SectionIn'命令怎麼樣?在http://forums.winamp.com/showthread.php?t=255299找到一些帖子。 – hypheni

0

這是壞主意在編譯時禁用部分,以避免它的選擇/執行,因爲:

  1. 節設計了所有有關的代碼運行時的行爲,而不是編譯時間。否則,它將產生一個無限的!ifdef ...!endif集合,用於章節範圍控制和像您的INCLUDESECTION這樣的英國媒體播放器編譯定義合併。
  2. 在某些時候,您會希望在運行時切換節選擇/可見性,這將迫使您混淆運行時和編譯時間代碼,甚至更糟糕。

我可能認爲這一切都來自運行時段選擇/隱藏行爲的無效未確定。因此,要確保你那裏有什麼太大的問題,使用部門選擇/隱藏在運行時你要明白幾件事情想的:

  1. 在通過SysTreeView32控制和inherites實現Windows部分/變通方法的所有問題通過這種控制引入。這意味着您必須隱藏/取消隱藏Page Pre(OnCreate)函數中的部分(控件項),而不是頁面顯示(OnShow)函數,該函數基本上用於控制剖面可見性狀態。
  2. 即使隱藏部分仍然可以運行,因爲隱藏狀態與選擇狀態無關。要隱藏部分,當各個控制項標誌引入選擇狀態時,必須將空字符串設置爲部分名稱。因此,在某些情況下,您可能需要在代碼塊中測試區域隱藏性以跳過它的進一步執行。
  3. 父節選擇通過控件遞歸觸發子選擇。但是因爲隱藏而非只讀子節點也會選擇,因此必須在.onSelChange處理函數結束時手動更新「部分選定」/「全部選定」/「全部未選定」中的父選擇狀態,以便將控制複選框的可見性修改爲這是實際的外觀。

所以,做正確的事情,你必須:

  1. 編寫一套UpdateSectionGroupSelectionN macroses的進行後處理每一部分組的可見性狀態更新,其中N - 是在部分子項數量。如果選中某個節中的所有未隱藏的子項,則必須將父項更新爲「All Selected」狀態。如果選中某個部分中未隱藏的子項目,則必須將父項更新爲「部分選定」狀態。如果所有子項都隱藏了,那麼你必須決定處理這樣的父項(可能它不應該改變,或者必須隱藏在Page Pre函數中)。
  2. 添加到開始隱藏狀態檢查代碼的部分以繞過部分進一步執行,以防其他部分鄰居可能被隱藏或出於某種其他原因。

我知道所有人都說這樣做有點棘手,但是你會發現這種方式幾乎是一種常見的方法來一次性修復所有部分問題,並避免代碼進一步複雜化。