找回密码
 加入
搜索
查看: 2536|回复: 13

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

  [复制链接]
发表于 2017-4-25 15:51:58 | 显示全部楼层 |阅读模式
本帖最后由 heroxianf 于 2017-4-29 19:03 编辑

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-4-25 17:31:00 | 显示全部楼层
回复 1# heroxianf


    作數組

選項    次數

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

然後 數組 做 排序

然後重新賦值
 楼主| 发表于 2017-4-25 17:49:26 | 显示全部楼层
回复 2# kk_lee69


    用什么记录好一点呢? INI   还是SQLITE?
发表于 2017-4-25 17:51:38 | 显示全部楼层
回复 3# heroxianf

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

另外 也方便 使用者 可以刪除  重新計算
 楼主| 发表于 2017-4-25 17:56:22 | 显示全部楼层
回复 4# kk_lee69


    好的 那我先试试~
发表于 2017-4-25 20:38:00 | 显示全部楼层
回复 3# heroxianf


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

INI就只有 计次排序 最简单的了
 楼主| 发表于 2017-4-25 21:20:16 | 显示全部楼层
回复 6# 绿色风

你是说SQLite来完成   求示例
 楼主| 发表于 2017-4-25 23:05:24 | 显示全部楼层
回复 6# 绿色风


    我看了下,时间戳是更新时间,感觉统计次数好些,如果每天点击都是几千,这个计数就显得庞大了。
发表于 2017-4-26 00:25:27 | 显示全部楼层
回复 8# heroxianf


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

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

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

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

如果是 時間戳  那麼 INI 不也可以記錄時間  把次數欄位 改為時間  不是就好了
发表于 2017-4-26 09:06:29 | 显示全部楼层
SQLite有按照大小 时间等自动排序的功能,本次基本用不到这些功能。用ini也可以了。
 楼主| 发表于 2017-4-26 14:04:42 | 显示全部楼层
回复 9# kk_lee69


    是按照你建议的次数统计,可能我想多了,计数太大的问题!
 楼主| 发表于 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[1] & "|" & $data[2] + 1)
                                        Local $aArray = IniReadSection($Ini, "TEST")
                                        Local $sdata[UBound($aArray) - 1][UBound($aArray, 2)]
                                        For $i = 1 To UBound($aArray) - 1                                
                                                Local $data1 = StringSplit($aArray[$i][1], "|")                        
                                                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
 楼主| 发表于 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[1] & "|" & $data[2] + 1)
                                        Local $aArray = IniReadSection($Ini, "TEST")
                                        Local $sdata[UBound($aArray) - 1][UBound($aArray, 2)]
                                        For $i = 1 To UBound($aArray) - 1
                                                Local $data1 = StringSplit($aArray[$i][1], "|")
                                                
                                                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[4])
                                _SQLite_Exec(-1, "UPDATE aTest SET max =" & $aResult[4] + 1 & "   WHERE name = '" & GUICtrlRead($Combo1) & "' ;")
                                _SetCB()
                                WinSetTitle($Form1, "", GUICtrlRead($Combo1) & "=" & $aResult[4] + 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 aTest  ORDER BY max desc ;", $hQuery) ; 查询
        ConsoleWrite(@CRLF)
        While _SQLite_FetchData($hQuery, $aRow,False,False) = $SQLITE_OK
                If $i = 0 Then $sMs = $aRow[0]
                $sMsg &= $aRow[0] & "|"
                ConsoleWrite($aRow[0] & "|" &$aRow[1] & @CRLF)
                $i += 1
        WEnd
        
        $sMsg = StringTrimRight($sMsg, 1)        
        If $Y <> 0 Then $sMs = GUICtrlRead($Combo1)
        GUICtrlSetData($Combo1, "")
        GUICtrlSetData($Combo1, $sMsg, $sMs)
EndFunc   ;==>_SetCB









评分

参与人数 1金钱 +20 收起 理由
heroxianf + 20 好好学习

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 02:39 , Processed in 0.081702 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表