heroxianf 发表于 2017-4-25 15:51:58

combox 下拉菜单里的选项按使用频繁度排列[已解决]

本帖最后由 heroxianf 于 2017-4-29 19:03 编辑

如果下拉菜单里有   "水果|猪肉|牛肉"

我想实现哪个选择的多一点就排列到第一个(比如我经常选择牛肉 那么牛肉就默认在最前面"牛肉|水果|猪肉"),求实现思路~

kk_lee69 发表于 2017-4-25 17:31:00

回复 1# heroxianf


    作數組

選項    次數

然後 每次 選了一次就在那個數組 次數的部分加1

然後 數組 做 排序

然後重新賦值

heroxianf 发表于 2017-4-25 17:49:26

回复 2# kk_lee69


    用什么记录好一点呢? INI   还是SQLITE?

kk_lee69 发表于 2017-4-25 17:51:38

回复 3# heroxianf

資料不會很多 只是 結論 我看 INI 的文字檔案即可

另外 也方便 使用者 可以刪除重新計算

heroxianf 发表于 2017-4-25 17:56:22

回复 4# kk_lee69


    好的 那我先试试~

绿色风 发表于 2017-4-25 20:38:00

回复 3# heroxianf


    用数据库肯定最好的啦。可以用访问的时间截来排序。

INI就只有 计次排序 最简单的了

heroxianf 发表于 2017-4-25 21:20:16

回复 6# 绿色风

你是说SQLite来完成   求示例{:face (197):}

heroxianf 发表于 2017-4-25 23:05:24

回复 6# 绿色风


    我看了下,时间戳是更新时间,感觉统计次数好些,如果每天点击都是几千,这个计数就显得庞大了。

kk_lee69 发表于 2017-4-26 00:25:27

回复 8# heroxianf


    這話就怪了......你要的不就是 點擊的多寡嗎??? 計算次數 才是正途吧....

如果看時間戳應該是 最近點擊 的順序吧...... 這樣題目應該改成依據最近點擊排序

而不是 頻繁度吧   頻繁度 不就是 次數嗎???

你應該先確認自己要的是甚麼..........

如果是 時間戳那麼 INI 不也可以記錄時間把次數欄位 改為時間不是就好了

1361739590 发表于 2017-4-26 09:06:29

SQLite有按照大小 时间等自动排序的功能,本次基本用不到这些功能。用ini也可以了。

heroxianf 发表于 2017-4-26 14:04:42

回复 9# kk_lee69


    是按照你建议的次数统计,可能我想多了,计数太大的问题!

heroxianf 发表于 2017-4-27 14:33:40

回复 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

heroxianf 发表于 2017-4-29 19:02:37

搜索到了解决方法,贴出来大家参考一下,    变量乱命名就忽略吧!

#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

绿色风 发表于 2017-4-29 20:57:09

回复 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]
查看完整版本: combox 下拉菜单里的选项按使用频繁度排列[已解决]