【问题标题】:Clearing the State of Fields in InstallOptions pages清除 InstallOptions 页面中的字段状态
【发布时间】:2011-09-29 20:04:08
【问题描述】:

我正在开发 NSIS 安装程序。要求之一是允许用户为多个不同的条目多次输入某些信息(本质上,它允许他们为任意数量的服务器输入服务器信息)。我目前正在通过在我的高级选项页面之后转到此页面来回收这些页面:

Function RedirectPage
   ${If} $addtCheck <> 0 ; Was the checkbox checked?
      StrCpy $startedXml 1 ; make this "true"
       SendMessage $HWNDPARENT 0x408 -1 "" ; If so, go back
   ${Else}
      Abort
       ${EndIf}

FunctionEnd

addtCheck 检查是否勾选了回收页面的复选框。如果是这样,此函数会导致上一页再次显示。问题是这些字段包含用户刚刚输入的信息。现在,我要做的是在返回之前清除上一页的所有字段的状态。我试过做这样的事情,

!insertmacro MUI_INSTALLOPTIONS_WRITE "ioAdv.ini" "Field 2" "State" ""

但它似乎不允许我清除状态。我知道 SendMessageGetDlgItem 命令,但我不知道有什么方法可以让我使用它们来清除 InstallOptions INI 文件中包含的文本框、复选框和列表框。

谁能指出我正确的方向,谢谢。如果你想看更多的剧本,请告诉我。

【问题讨论】:

    标签: installation nsis


    【解决方案1】:

    所以你应该在 ini 中有这样的控件:

      [Field 1]
      Type=Label
      Left=15
      Top=7
      Right=112
      Bottom=16
      Text=Text 1
    

    然后你可以像这样获得字段的句柄:

    ReadIniStr $0 $PLUGINSDIR\page_ini.ini "Field 1" "HWND"
    

    那么你可以像这样使用SendMessage 命令和$0

    SendMessage $0 ${WM_SETTEXT} 0 "STR:$InitialString"
    

    此示例应适用于文本框,其他控件请参见以下内容: 在“包含”下的 NSIS 安装路径中,有文件 Winmessages.nsh 以及要使用的消息密钥。

    在我的测试中,我找到了设置复选框的关键:

    SendMessage $0 ${BM_SETCHECK} 0 "0"
    

    对于我发现的列表框:(未经测试)

    LB_RESETCONTENT
    LB_SELECTSTRING
    

    希望对您有所帮助。 PS:如果您有任何问题或批评,请告诉我。

    PPS:

    或者,您可以将 nsDialogs 宏与 HWND 句柄一起使用,即用于复选框:

    ${NSD_Uncheck} $0
    

    更多关于这个宏的信息在这里: nsDialogs Readme - Macros

    【讨论】:

    • 我能够使用它获得一个可行的解决方案。谢谢你。虽然它可能不是最优雅的解决方案,但单独更改每个字段可以完全控制页面并且效果很好。我很感激。
    【解决方案2】:

    您可以使用 SendMessage 来重置每个控件,但是您必须处理不同类型的控件,最好只重置 .ini:

    page custom custdircreate_1
    page directory dirpagecreate
    
    Function custdircreate_1
    SetOverwrite on
    !insertmacro INSTALLOPTIONS_EXTRACT "ioAdv.ini"
    SetOverwrite lastused
    !insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
    FunctionEnd
    
    Function dirpagecreate
    SendMessage $HWNDPARENT 0x408 -1 ""
    FunctionEnd
    

    ..或重置状态并保留其他所有内容:

    Function custdircreate_2
    ; INSTALLOPTIONS_EXTRACT was called in .onInit
    !insertmacro INSTALLOPTIONS_READ $1 "ioAdv.ini" "Settings" "NumFields"
    StrCpy $0 1
    loop:
    !insertmacro INSTALLOPTIONS_WRITE "ioAdv.ini" "Field $0" "State" ""
    IntOp $0 $0 + 1
    IntCmpU $0 $1 loop loop
    
    !insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
    FunctionEnd
    

    (这将重置链接和按钮控件,以便在需要时将它们过滤掉)

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2014-05-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多