在不影响程序原有功能的前提下,如何让表格之间上下左右自由切换
标题可能太拗口了,我想在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
回复 1# fenhanxue
http://www.autoitx.com/thread-55039-1-4.html 回复 1# fenhanxue GUICtrlCreateListView这就是你要找的类似excel的东东吧 感觉还需要定义一个函数,取消快捷键。
是这个列表区被激活后,取消快捷键功能,当它处理非激活状态时,再恢复快捷键。 看了你这个的运行效果,建议
不如改用TAB键,再配合INDEX序号,我觉得更好用,这样就不会有你所说的一些问题了 回复 1# fenhanxue
根據你的說法
问题2:例如假设B1的内容为 ABCDEFG 并假设我现在光标的位置在G后面,然后我想把光标移动到F后面,正常操作是按一下键盘左键就可以向左移动1字符,但是由于左键现在被自定义了,所以又无法实现这个效果,按一下左键光标会跳到A1
請問當我在 B1 按下 鍵盤左鍵 你猜 我想做啥???是 想要 移到 A1 呢還是 想要 往後 一個字符??
猜中 有獎...
你有沒有覺得 你的邏輯 其實是有矛盾的........... 回复 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里左移一个字符
但是以上判断需要对上下左右按键的各个可能情况都进行考虑,我觉得要完善起来,工程量会非常大。所以我想寻求有没更好的思路 回复 5# erdaxia
谢谢,TAB是没问题的,但是我需要用上下左右键 回复 3# yamakawa
这个也是个方案,但是编辑起来不是很方便。 回复 7# fenhanxue
有阿你要不要考慮一下 滴答表格.... 回复 7# fenhanxue
老實說 依照你上面的邏輯
其實操作起來也 蠻困擾的.......
譬如說你說 当起始位置 = 0则跳到A1
可是 有可能是 我從 A1 跳過來 B1的時候
游標應該內定在第一個位置 0 的地方可是這時候我想 往右一個字節
依據你上面邏輯就又會跳回 A1
與其這麼捆擾 是否考慮 用 W A D X代表上下左右 或者 數字區的按鍵替代分開來處理 回复 11# kk_lee69
是啊,是操作起来很困难,可能会遇到各种没考虑到的意外情况,所以很头疼,想找个更好的解决办法。
另外这个嘀嗒表格我之前看到过帖子,也去他们官网看过,但是他的官网似乎已经不提供免费版下载,问他们的在线客服也没人理睬,尴尬啦 回复 12# fenhanxue
能說說你想做啥嗎??
你說的有點模糊 可以談實際用在哪邊嗎??也許 有其他想法 回复 13# kk_lee69
实际就是一张由 combo 和 input 组成的类似EXCLE的表格 回复 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