combox 下拉菜单里的选项按使用频繁度排列[已解决]
本帖最后由 heroxianf 于 2017-4-29 19:03 编辑如果下拉菜单里有 "水果|猪肉|牛肉"
我想实现哪个选择的多一点就排列到第一个(比如我经常选择牛肉 那么牛肉就默认在最前面"牛肉|水果|猪肉"),求实现思路~
回复 1# heroxianf
作數組
選項 次數
然後 每次 選了一次就在那個數組 次數的部分加1
然後 數組 做 排序
然後重新賦值 回复 2# kk_lee69
用什么记录好一点呢? INI 还是SQLITE? 回复 3# heroxianf
資料不會很多 只是 結論 我看 INI 的文字檔案即可
另外 也方便 使用者 可以刪除重新計算 回复 4# kk_lee69
好的 那我先试试~ 回复 3# heroxianf
用数据库肯定最好的啦。可以用访问的时间截来排序。
INI就只有 计次排序 最简单的了 回复 6# 绿色风
你是说SQLite来完成 求示例{:face (197):} 回复 6# 绿色风
我看了下,时间戳是更新时间,感觉统计次数好些,如果每天点击都是几千,这个计数就显得庞大了。 回复 8# heroxianf
這話就怪了......你要的不就是 點擊的多寡嗎??? 計算次數 才是正途吧....
如果看時間戳應該是 最近點擊 的順序吧...... 這樣題目應該改成依據最近點擊排序
而不是 頻繁度吧 頻繁度 不就是 次數嗎???
你應該先確認自己要的是甚麼..........
如果是 時間戳那麼 INI 不也可以記錄時間把次數欄位 改為時間不是就好了 SQLite有按照大小 时间等自动排序的功能,本次基本用不到这些功能。用ini也可以了。 回复 9# kk_lee69
是按照你建议的次数统计,可能我想多了,计数太大的问题! 回复 9# kk_lee69
怎么才能让数组按照第二例来降序 或者 升序排列呢?
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
Example()
Func Example()
Local $Ini = @ScriptDir & "\test.ini"
Local $hGUI = GUICreate("内置函数示例", 300, 200)
Local $idComboBox = GUICtrlCreateCombo("", 10, 10, 185, 20)
Local $idClose = GUICtrlCreateButton("关闭", 210, 170, 85, 25)
GUICtrlSetData($idComboBox, "第 1|第 2|第 3|第 4|第 5|第 6")
GUISetState(@SW_SHOW, $hGUI)
Local $sComboRead = ""
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idClose
ExitLoop
Case $idComboBox
$sComboRead = GUICtrlRead($idComboBox)
Local $IniRead = IniRead($Ini, "TEST", $sComboRead, "NULL")
If $IniRead = "NULL" Then
IniWrite($Ini, "TEST", $sComboRead, $sComboRead & "|0")
Else
Local $data = StringSplit($IniRead, "|")
IniWrite($Ini, "TEST", $sComboRead, $data & "|" & $data + 1)
Local $aArray = IniReadSection($Ini, "TEST")
Local $sdata
For $i = 1 To UBound($aArray) - 1
Local $data1 = StringSplit($aArray[$i], "|")
For $n = 0 To UBound($aArray, 2) - 1
$sdata[$i-1][$n] = $data1[$n+1]
Next
Next
_ArrayDisplay($sdata)
_ArraySort($sdata, 0, 0, 0, 1)
_ArrayDisplay($sdata)
EndIf
EndSwitch
WEnd
GUIDelete($hGUI)
EndFunc ;==>Example
搜索到了解决方法,贴出来大家参考一下, 变量乱命名就忽略吧!
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
Example()
Func Example()
Local $Ini = @ScriptDir & "\test.ini"
Local $hGUI = GUICreate("内置函数示例", 300, 200)
Local $idComboBox = GUICtrlCreateCombo("", 10, 10, 185, 20)
Local $idClose = GUICtrlCreateButton("关闭", 210, 170, 85, 25)
GUICtrlSetData($idComboBox, "第 1|第 2|第 3|第 4|第 5|第 6")
GUISetState(@SW_SHOW, $hGUI)
Local $sComboRead = ""
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idClose
ExitLoop
Case $idComboBox
$sComboRead = GUICtrlRead($idComboBox)
Local $IniRead = IniRead($Ini, "TEST", $sComboRead, "NULL")
If $IniRead = "NULL" Then
IniWrite($Ini, "TEST", $sComboRead, $sComboRead & "|0")
Else
Local $data = StringSplit($IniRead, "|")
IniWrite($Ini, "TEST", $sComboRead, $data & "|" & $data + 1)
Local $aArray = IniReadSection($Ini, "TEST")
Local $sdata
For $i = 1 To UBound($aArray) - 1
Local $data1 = StringSplit($aArray[$i], "|")
For $n = 0 To UBound($aArray, 2) - 1
If Not StringIsDigit($data1[$n + 1]) Then
$sdata[$i - 1][$n] = $data1[$n + 1]
Else
$sdata[$i - 1][$n] = Number($data1[$n + 1])
EndIf
Next
Next
_ArrayDisplay($sdata)
_ArraySort($sdata, 0, 0, 0, 1)
_ArrayDisplay($sdata)
EndIf
EndSwitch
WEnd
GUIDelete($hGUI)
EndFunc ;==>Example
回复 7# heroxianf
SQLIT3数据库方式
#NoTrayIcon
#AutoIt3Wrapper_UseX64 = no
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
_SQLite_Startup()
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite 错误", "SQLite3.dll 不能加载!")
Exit -1
EndIf
Local $sDbName = _TempFile()
Local $hDskDb = _SQLite_Open($sDbName) ; 打开一个永久的磁盘数据库
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite 错误", "无法打开或创建一个永久性的数据库!")
Exit -1
EndIf
_SQLite_Exec(-1, "CREATE TABLE aTest (name ,max INT(8));") ; 创建一个表 注意,MAX表要为 整数类型 。不然_SetCB() 中的排序就没办法排列的了。
_SQLite_Exec(-1, "INSERT INTO aTest(name,max) VALUES ('李纯一','1');") ; 插入数据
_SQLite_Exec(-1, "INSERT INTO aTest(name,max) VALUES ('张有才','1');") ; 插入数据
_SQLite_Exec(-1, "INSERT INTO aTest(name,max) VALUES ('钟无艳','1');") ; 插入数据
_SQLite_Exec(-1, "INSERT INTO aTest(name,max) VALUES ('吕不淳','1');") ; 插入数据
_SQLite_Exec(-1, "INSERT INTO aTest(name,max) VALUES ('唯一一','1');") ; 插入数据
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 407, 226, 192, 124)
$Combo1 = GUICtrlCreateCombo("", 40, 32, 273, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_SetCB(0)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_SQLite_Close($hDskDb) ; DB 是一个普通的文件, 以后可以重新打开
FileDelete($sDbName)
_SQLite_Shutdown()
Exit
Case $Combo1
Local $aResult, $iRows, $iColumns, $iRval
; 查询
$iRval = _SQLite_GetTable(-1, "SELECT * FROM aTest WHERE name = '" & GUICtrlRead($Combo1) & "' ;", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
;~ _ArrayDisplay($aResult, "查询结果")
;~ MsgBox(0,0,$aResult)
_SQLite_Exec(-1, "UPDATE aTest SET max =" & $aResult + 1 & " WHERE name = '" & GUICtrlRead($Combo1) & "' ;")
_SetCB()
WinSetTitle($Form1, "", GUICtrlRead($Combo1) & "=" & $aResult + 1)
Else
MsgBox($MB_SYSTEMMODAL, "SQLite 错误: " & $iRval, _SQLite_ErrMsg())
EndIf
EndSwitch
WEnd
Func _SetCB($Y = 1)
Local $hQuery, $aRow, $sMsg, $i = 0
_SQLite_Query($hDskDb, "SELECT * FROM aTestORDER BY max desc ;", $hQuery) ; 查询
ConsoleWrite(@CRLF)
While _SQLite_FetchData($hQuery, $aRow,False,False) = $SQLITE_OK
If $i = 0 Then $sMs = $aRow
$sMsg &= $aRow & "|"
ConsoleWrite($aRow & "|" &$aRow & @CRLF)
$i += 1
WEnd
$sMsg = StringTrimRight($sMsg, 1)
If $Y <> 0 Then $sMs = GUICtrlRead($Combo1)
GUICtrlSetData($Combo1, "")
GUICtrlSetData($Combo1, $sMsg, $sMs)
EndFunc ;==>_SetCB
页:
[1]