找回密码
 加入
搜索
查看: 7246|回复: 15

[AU3基础] 在不影响程序原有功能的前提下,如何让表格之间上下左右自由切换

    [复制链接]
发表于 2017-6-1 12:48:35 | 显示全部楼层 |阅读模式
标题可能太拗口了,我想在GUI里面放像Excel一样的表格,但是找不到(也不知道)怎么操作。所以采用了自绘控件组成表格的方案,简化后的模型如下:

自绘4个控件组成 2*2 的表格  (一个conbo  A1   + 3个input   B1  A2      B2)即:
A1  B1
A2  B2


此时,我无法通过键盘的“上下左右”方向键切换单元格,
例如,假设我现在光标定位在A1 那么,我按键盘的“→”是不会自动像Excle一样跳到 B1的,必须手动用鼠标来切换,效率非常不高

所以我想了用自定义快捷键的方式,给“上下左右”方向键都定义快捷键来重新定位光标。
但此时又带来了一个新的问题:
问题1:例如我点开combo控件(A1)的下拉列表后,本来按向下键,是可以进行列表项目的勾选的,但此时因为自定义了向下键,所以,无法进行列表的勾选,取而代之的是光标直接定位到了A2
问题2:例如假设B1  的内容为    ABCDEFG    并假设我现在光标的位置在G后面,然后我想把光标移动到F后面,正常操作是按一下键盘左键就可以向左移动1字符,但是由于左键现在被自定义了,所以又无法实现这个效果,按一下左键光标会跳到A1

所以不知道有没好的思路可以解决上述的困境,即:
1.  上下左右键  可以控制光标在四个控件里自由切换(foucs)
2.  实现1的同时,也不影响上下左右键对某一个具体控件的正常操作。
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 575, 303, 192, 114)
Global $input[4]
$input[0] = GUICtrlCreateCombo("", 56, 104, 193, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData($input[0],'111|222|3333|4444|5555',1)
$input[1] = GUICtrlCreateInput("ABCDEFG", 264, 104, 217, 21)
$input[2] = GUICtrlCreateInput("", 56, 136, 193, 21)
$input[3] = GUICtrlCreateInput("", 264, 136, 217, 21)

HotKeySet('{left}','move_left')
HotKeySet('{right}','move_right')
HotKeySet('{up}','move_up')
HotKeySet('{down}','move_down')

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

Func move_left()
        move(3)
EndFunc
Func move_right()
        move(4)
EndFunc
Func move_up()
        move(1)
EndFunc
Func move_down()
        move(2)
EndFunc

Func move($move_i);移动光标
        ;$move_i        1上                2下                3左                4右
        $temp = ControlGetFocus($Form1)
        If StringLeft($temp,4) <> 'Edit' Then Return;没有聚焦
        
        Local $temp_i = StringMid($temp,5)
        
        Local $new_i = $temp_i ;新的单元格的位置
        Switch $move_i
                Case 1
                        If $new_i = 3 Or $new_i = 4 Then $new_i -= 2
                Case 2
                        If $new_i = 1 Or $new_i = 2 Then $new_i += 2
                Case 3
                        $new_i -=1
                        If $new_i = 0 Then $new_i = 1
                Case 4
                        $new_i +=1
                        If $new_i = 5 Then $new_i = 4
        EndSwitch
        
        GUICtrlSetState($input[$new_i-1],$GUI_FOCUS)
        
EndFunc
发表于 2017-6-1 16:47:37 | 显示全部楼层
发表于 2017-6-1 17:57:00 | 显示全部楼层
回复 1# fenhanxue
GUICtrlCreateListView
这就是你要找的类似excel的东东吧
发表于 2017-6-1 19:40:00 | 显示全部楼层
感觉还需要定义一个函数,取消快捷键。
是这个列表区被激活后,取消快捷键功能,当它处理非激活状态时,再恢复快捷键。
发表于 2017-6-1 20:02:19 | 显示全部楼层
看了你这个的运行效果,建议
不如改用TAB键,再配合INDEX序号,我觉得更好用,这样就不会有你所说的一些问题了
发表于 2017-6-1 20:31:41 | 显示全部楼层
回复 1# fenhanxue

根據你的說法
问题2:例如假设B1  的内容为    ABCDEFG    并假设我现在光标的位置在G后面,然后我想把光标移动到F后面,正常操作是按一下键盘左键就可以向左移动1字符,但是由于左键现在被自定义了,所以又无法实现这个效果,按一下左键光标会跳到A1


請問  當我在 B1 按下 鍵盤左鍵    你猜 我想做啥???  是 想要 移到 A1 呢  還是 想要 往後 一個字符??
猜中 有獎...

你有沒有覺得 你的邏輯 其實是有矛盾的...........
 楼主| 发表于 2017-6-1 22:00:33 | 显示全部楼层
回复 6# kk_lee69


    其实也不是,如果用我现在的代码,则要完善会非常复杂,例如,
继续以   在B1 按下左键为例,

这里,可以先判断当前的B1单元格,是 ABCDEFG 全选状态,还是光标只定位在某一个具体位置
(借助   _GUICtrlEdit_GetSel($B1) 得到当前选择的起始位置和结束位置 )   stringlen(guictrlread($B1)) 可以判断:
1)当光标为全选状态(即起始位置=0,结束位置 =stringlen(guictrlread($B1))  )  则跳到A1
2)当光标不是全选状态(即起始位置=结束位置),此时继续判断:
   2.1)当起始位置 = 0  则跳到A1
   2.2)当起始位置>0 .则不跳到A1,光标只在B1里左移一个字符

但是以上判断需要对上下左右按键的各个可能情况都进行考虑,我觉得要完善起来,工程量会非常大。所以我想寻求有没更好的思路
 楼主| 发表于 2017-6-1 22:01:04 | 显示全部楼层
回复 5# erdaxia


    谢谢,TAB是没问题的,但是我需要用上下左右键
 楼主| 发表于 2017-6-1 22:03:14 | 显示全部楼层
回复 3# yamakawa


    这个也是个方案,但是编辑起来不是很方便。
发表于 2017-6-1 22:23:34 | 显示全部楼层
回复 7# fenhanxue

有阿  你要不要考慮一下 滴答表格....
发表于 2017-6-2 02:41:36 | 显示全部楼层
回复 7# fenhanxue

老實說 依照你上面的邏輯  
其實操作起來也 蠻困擾的.......

譬如說  你說 当起始位置 = 0  则跳到A1
可是 有可能是 我從 A1 跳過來 B1的時候

游標應該內定在第一個位置 0 的地方  可是這時候我想 往右一個字節

依據你上面邏輯  就又會跳回 A1

與其這麼捆擾 是否  考慮 用 W A D X  代表上下左右 或者 數字區的按鍵替代  分開來處理
 楼主| 发表于 2017-6-2 08:04:47 | 显示全部楼层
回复 11# kk_lee69


    是啊,是操作起来很困难,可能会遇到各种没考虑到的意外情况,所以很头疼,想找个更好的解决办法。

另外这个嘀嗒表格我之前看到过帖子,也去他们官网看过,但是他的官网似乎已经不提供免费版下载,问他们的在线客服也没人理睬,尴尬啦
发表于 2017-6-2 12:01:53 | 显示全部楼层
回复 12# fenhanxue
能說說你想做啥嗎??

你說的有點模糊    可以談實際用在哪邊嗎??  也許 有其他想法
 楼主| 发表于 2017-6-3 00:00:26 | 显示全部楼层
回复 13# kk_lee69


    实际就是一张由 combo 和 input 组成的  类似EXCLE的表格
 楼主| 发表于 2017-6-3 00:08:40 | 显示全部楼层
回复 14# fenhanxue


    回复 14# fenhanxue


      实际就是一张由 combo 和 input 组成的  类似EXCLE的表格

简化的模型为:
一个GUI  搭配
一个combo  和 3个 input  组成了  2*2 的矩阵
,代码为:
$Form1 = GUICreate("Form1", 575, 303, 192, 114)
Global $input[4]
$input[0] = GUICtrlCreateCombo("", 56, 104, 193, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData($input[0],'111|222|3333|4444|5555',1)
$input[1] = GUICtrlCreateInput("ABCDEFG", 264, 104, 217, 21)
$input[2] = GUICtrlCreateInput("", 56, 136, 193, 21)
$input[3] = GUICtrlCreateInput("", 264, 136, 217, 21)
那么这其实已经是一个2*2的表格了, 但是美中不足的是,这个表格,无法 用 上下左右键 来切换单元格,所以想要找个办法实现上下左右键切换单元格。

然后我目前找到的办法,会存在一些bug,(诸如无法对combo进行上下选择),无法对单元格内的光标进行左右移动        所以想找个更好的办法。
如果能GUI内嵌一个excel表格,那就完美了。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 10:06 , Processed in 0.178915 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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