fenhanxue 发表于 2017-6-1 12:48:35

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

标题可能太拗口了,我想在GUI里面放像Excel一样的表格,但是找不到(也不知道)怎么操作。所以采用了自绘控件组成表格的方案,简化后的模型如下:

自绘4个控件组成 2*2 的表格(一个conboA1   + 3个input   B1A2      B2)即:
A1B1
A2B2


此时,我无法通过键盘的“上下左右”方向键切换单元格,
例如,假设我现在光标定位在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
$input = GUICtrlCreateCombo("", 56, 104, 193, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData($input,'111|222|3333|4444|5555',1)
$input = GUICtrlCreateInput("ABCDEFG", 264, 104, 217, 21)
$input = GUICtrlCreateInput("", 56, 136, 193, 21)
$input = 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

kk_lee69 发表于 2017-6-1 16:47:37

回复 1# fenhanxue

http://www.autoitx.com/thread-55039-1-4.html

yamakawa 发表于 2017-6-1 17:57:00

回复 1# fenhanxue GUICtrlCreateListView这就是你要找的类似excel的东东吧

erdaxia 发表于 2017-6-1 19:40:00

感觉还需要定义一个函数,取消快捷键。
是这个列表区被激活后,取消快捷键功能,当它处理非激活状态时,再恢复快捷键。

erdaxia 发表于 2017-6-1 20:02:19

看了你这个的运行效果,建议
不如改用TAB键,再配合INDEX序号,我觉得更好用,这样就不会有你所说的一些问题了

kk_lee69 发表于 2017-6-1 20:31:41

回复 1# fenhanxue

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


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

你有沒有覺得 你的邏輯 其實是有矛盾的...........

fenhanxue 发表于 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里左移一个字符

但是以上判断需要对上下左右按键的各个可能情况都进行考虑,我觉得要完善起来,工程量会非常大。所以我想寻求有没更好的思路

fenhanxue 发表于 2017-6-1 22:01:04

回复 5# erdaxia


    谢谢,TAB是没问题的,但是我需要用上下左右键

fenhanxue 发表于 2017-6-1 22:03:14

回复 3# yamakawa


    这个也是个方案,但是编辑起来不是很方便。

kk_lee69 发表于 2017-6-1 22:23:34

回复 7# fenhanxue

有阿你要不要考慮一下 滴答表格....

kk_lee69 发表于 2017-6-2 02:41:36

回复 7# fenhanxue

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

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

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

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

與其這麼捆擾 是否考慮 用 W A D X代表上下左右 或者 數字區的按鍵替代分開來處理

fenhanxue 发表于 2017-6-2 08:04:47

回复 11# kk_lee69


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

另外这个嘀嗒表格我之前看到过帖子,也去他们官网看过,但是他的官网似乎已经不提供免费版下载,问他们的在线客服也没人理睬,尴尬啦

kk_lee69 发表于 2017-6-2 12:01:53

回复 12# fenhanxue
能說說你想做啥嗎??

你說的有點模糊    可以談實際用在哪邊嗎??也許 有其他想法

fenhanxue 发表于 2017-6-3 00:00:26

回复 13# kk_lee69


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

fenhanxue 发表于 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
$input = GUICtrlCreateCombo("", 56, 104, 193, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData($input,'111|222|3333|4444|5555',1)
$input = GUICtrlCreateInput("ABCDEFG", 264, 104, 217, 21)
$input = GUICtrlCreateInput("", 56, 136, 193, 21)
$input = GUICtrlCreateInput("", 264, 136, 217, 21)
那么这其实已经是一个2*2的表格了, 但是美中不足的是,这个表格,无法 用 上下左右键 来切换单元格,所以想要找个办法实现上下左右键切换单元格。

然后我目前找到的办法,会存在一些bug,(诸如无法对combo进行上下选择),无法对单元格内的光标进行左右移动      所以想找个更好的办法。
如果能GUI内嵌一个excel表格,那就完美了。。。
页: [1] 2
查看完整版本: 在不影响程序原有功能的前提下,如何让表格之间上下左右自由切换