2010-01-15 47 views

回答

1

您可以將數據存儲在一個全局變量,或在$ PLUGINSDIR一個的.ini

+0

你能更詳細?當我運行由NSIS創建的安裝文件並在自定義頁面的文本框中輸入一些數據時,單擊下一步,然後單擊後退按鈕,我剛剛輸入的數據不會保留。所以,即使我只需要更改前一頁中的幾個值,我也必須在頁面重置時再次將所有這些值全部寫入。 – Pia 2010-01-15 08:34:43

+0

沒有數據的自動存儲,你必須自己做這一切 – Anders 2010-01-15 10:02:51

5

有幾個方法可以做到這一點。無論哪種方式,你需要將數據存儲在全局變量中。

1)使用「離開」功能。

Page custom EnterCustom LeaveCustom 

; Create two variables for each value/widget pair 
Var Text 
Var TextWidget 
Var Check 
Var CheckWidget 

Function EnterCustom 
    nsDialogs::Create 1018 
    Pop $0 

    ${NSD_CreateText} 0 0 80u 12u $Text 
    Pop $TextWidget 

    ${NSD_CreateCheckBox} 0 26u 80u 12u "Check this box" 
    Pop $CheckWidget 
    ${NSD_SetState} $CheckWidget $Check 

    nsDialogs::Show 
FunctionEnd 

Function LeaveCustom 
    ${NSD_GetText} $TextWidget $Text 
    ${NSD_GetState} $CheckWidget $Check 
FunctionEnd 

此方法唯一的問題是隻有在您點擊下一個按鈕時纔會調用LeaveCustom。所以如果你編輯字段,然後點擊返回按鈕,你的改變就會丟失。然而,如果你繼續前進然後回來,這些變化就會得到保存。

2)使用OnChange回調。

這有點複雜,但解決了以前的方法的問題。

Page custom EnterCustom 

Var Initialized 
; Create two variables for each value/widget pair 
Var Text 
Var TextWidget 
Var Check 
Var CheckWidget 

Function EnterCustom 
    nsDialogs::Create 1018 
    Pop $0 

    ${If} $Initialized != "True" 
    ; Set defaults for all your values here 
    StrCpy $Text "Initial Value" 
    StrCpy $Check ${BST_UNCHECKED} 
    StrCpy $Initialized "True" 
    ${EndIf} 

    ; Create and configure all of your widgets 
    ${NSD_CreateText} 0 0 80u 12u $Text 
    Pop $TextWidget 
    ${NSD_OnChange} $TextWidget OnTextChange 

    ${NSD_CreateCheckBox} 0 26u 80u 12u "Check this box" 
    Pop $CheckWidget 
    ${NSD_SetState} $CheckWidget $Check 
    ${NSD_OnClick} $CheckWidget OnCheckClick 

    nsDialogs::Show 
FunctionEnd 

; Create a callback function for each Widget 
Function OnTextChange 
    Pop $0 ; Widget handle is on stack 
    ${NSD_GetText} $TextWidget $Text 
FunctionEnd 

Function OnCheckClick 
    Pop $0 ; Widget handle is on stack 
    ${NSD_GetState} $CheckWidget $Check 
FunctionEnd 

一些小部件,例如, RadioButtons和CheckBoxes,而是使用OnClick函數。此外ComboBox不能很好地使用這種方法。但是,似乎沒有記錄的DropList通常可以替代它並且工作正常。

單選按鈕也有點棘手,因爲只調用所選按鈕的點擊回調。我通過更新每個單選按鈕單擊回調中的所有單選按鈕值來解決此問題。

凌亂/繁瑣,但它的作品。

4

我知道這是一個古老的問題,但我已經從我的谷歌搜索降落在這裏。

您可以使用NSD_OnBack(或直接撥打nsDialogs::OnBack)設置OnBack回撥。

下面是一小段代碼片段:

Function portsSelectionPage 
    nsDialogs::Create 1018 
    Pop $0 
    ${NSD_CreateNumber} 70u 0 40u 12u $TomcatPort 
    Pop $TomcatPortHWND 
    ${NSD_CreateNumber} 70u 14u 40u 12u $PostgresPort 
    Pop $PostgresPortHWND 

    nsDialogs::Show 

    ${NSD_OnBack} "portsSelectionPageLeave" 
FunctionEnd 

Function portsSelectionPageLeave 
    ${NSD_GetText} $TomcatPortHWND $TomcatPort 
    ${NSD_GetText} $PostgresPortHWND $PostgresPort 
FunctionEnd 
0
!include nsDialogs.nsh 
!include LogicLib.nsh 

Name nsDialogs 
OutFile nsDialogs.exe 

XPStyle on 

Var Dialog 
Var Label 
Var Text 
Var Text_State 
Var Checkbox 
Var Checkbox_State 

Page custom nsDialogsPage nsDialogsPageLeave 
Page license 
Page instfiles 

Function .onInit 

    StrCpy $Text_State "Type something here..." 

FunctionEnd 

Function nsDialogsPage 

    nsDialogs::Create 1018 
    Pop $Dialog 

    ${If} $Dialog == error 
     Abort 
    ${EndIf} 

    ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!" 
    Pop $Label 

    ${NSD_CreateText} 0 13u 100% 12u $Text_State 
    Pop $Text 

    ${NSD_CreateCheckbox} 0 30u 100% 10u "&Something" 
    Pop $Checkbox 

    ${If} $Checkbox_State == ${BST_CHECKED} 
     ${NSD_Check} $Checkbox 
    ${EndIf} 

    # alternative for the above ${If}: 
    #${NSD_SetState} $Checkbox_State 

    nsDialogs::Show 

FunctionEnd 

Function nsDialogsPageLeave 

    ${NSD_GetText} $Text $Text_State 
    ${NSD_GetState} $Checkbox $Checkbox_State 

FunctionEnd 

Section 

    DetailPrint "hello world" 

SectionEnd 

更多信息http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#step-memory

+0

這並沒有提供一個問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17824389) – 2017-11-03 10:44:27

+0

如果您有新問題,請點擊[Ask Question](問問題)(https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/17824389) – 2017-11-03 10:55:01

相關問題