NSIS中NSD_CB_SelectString选中值异常问题咨询
问题解析:NSD_CB_SelectString的匹配逻辑
是的,NSD_CB_SelectString并非精确匹配,它底层依赖Windows原生API CB_SELECTSTRING,按前缀匹配查找列表项:从列表的第一个项开始,找到第一个以指定字符串为前缀的项并选中。
你的案例里,"TEST A"的前缀正好是"TEST",且它在列表中的位置早于"TEST",所以会被优先选中;而"TEST1"没有其他以"TEST1"为前缀的项在它前面,因此能正常选中目标项。
解决办法:精确匹配选中项
要实现精确匹配选中"TEST",可以先通过NSD_CB_FindStringExact找到目标项的索引,再用NSD_CB_SetCurSel设置选中状态,替代NSD_CB_SelectString:
修改原代码中的选中逻辑部分:
; 替换原来的 ${NSD_CB_SelectString} $DropList "TEST" ${NSD_CB_FindStringExact} $DropList -1 "TEST" $0 ${If} $0 != -1 ${NSD_CB_SetCurSel} $DropList $0 ${EndIf}
完整修改后的MyPage函数代码:
Function MyPage nsDialogs::Create 1018 Pop $0 ${If} $0 == error MessageBox MB_OK "Error" Abort ${EndIf} VAR /GLOBAL droplist ${NSD_CreateDropList} 0% 0 25% 12u '' Pop $DropList ${NSD_ONCHANGE} $DropList DropList_OnChange ${NSD_CB_AddString} $DropList "TEST A" ${NSD_CB_AddString} $DropList "TEST" ${NSD_CB_AddString} $DropList "TEST1" ; 精确匹配并选中"TEST" ${NSD_CB_FindStringExact} $DropList -1 "TEST" $0 ${If} $0 != -1 ${NSD_CB_SetCurSel} $DropList $0 ${EndIf} nsDialogs::Show FunctionEnd
这样就能确保选中的是完全匹配的"TEST"项,不受列表项顺序或前缀匹配的影响。
内容的提问来源于stack exchange,提问作者Aaron Friesenborg
相关产品推荐
相关产品推荐

