dnbj2010
发表于 2011-11-29 08:52:54
回复 16# 绿色风
------------------------------------------------
万分感谢
您贴出的这些代码
AU3真是耐“嚼”啊,发现很多东东都没见过...强!...学习了...
dnbj2010
发表于 2011-11-29 08:58:57
For $i = 1 To 3
Assign("ctr"&$i,ControlGetPos("Form1","",$Edit[$i])
Next
--------------------------------------------------------------------------------
上面的表达式还是不行,
Assign("Button"&$i , GUICtrlCreateButton("按钮 - "&$i, 148, 18+$i * 30, 75, 25))
因为GUICtrlCreateButton定义返回的控件ID,所以行
ControlGetPos(...)返回的是一个限定的数组,所以失败。
如下:#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $i = 1
$Form1 = GUICreate("Form1", 700, 444, 150, 120)
$Button1 = GUICtrlCreateButton("Button1", 248, 88, 75, 25)
;就是下面这一段,Assign(...)不能取代 $Ctr1 = ...
;$Ctr1 = ControlGetPos("Form1","",$Button1)
Assign("ctr"&"1",ControlGetPos("Form1","",$Edit)
MsgBox(0,"",$Ctr1)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
dnbj2010
发表于 2011-11-29 09:04:14
For $i = 0 To 6
Assign("Button"&$i , GUICtrlCreateButton("按钮 - "&$i, 148, 18+$i * 30, 75, 25))
Next--------------------------------------
上面用数组就能表达:For $i = 0 To 6
$Button[$i] = GUICtrlCreateButton("按钮 - "&$i, 148, 18+$i * 30, 75, 25)
Next
绿色风
发表于 2011-11-29 15:49:07
本帖最后由 绿色风 于 2011-11-29 15:53 编辑
回复 18# dnbj2010
如果assing 传递是数组,请先声明一个数组后再调用。
就是你要先给个容器他,让他来装这个数据。
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <array.au3>
Dim $ctr1
Local $i = 1
$Form1 = GUICreate("Form1", 700, 444, 150, 120)
$Button1 = GUICtrlCreateButton("Button1", 248, 88, 75, 25)
Assign("ctr1",ControlGetPos("Form1","",$Button1))
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
MsgBox(0,"",$ctr1)
_ArrayDisplay($ctr1)
EndSwitch
WEnd
我写的东西正好在这上面纠结了几天,你正好在问这问题,我正好搞明白的了,所以才回了你这贴,BBS中我还没有一个回贴是回的技术贴。
dnbj2010
发表于 2011-11-29 18:06:52
回复 20# 绿色风
-----------------------------------------
从你的代码中学到不少知识,感谢你的付出。
我需要的数据是类似这样的:
$Ctr[$i] = ControlGetPos("Form1","",$Button[$i])
其对应的数据就是:
$Ctr[1],$Ctr[1],$Ctr[1],$Ctr[1]
$Ctr[2],$Ctr[2],$Ctr[2] ,$Ctr[2]
.............
..............
注意,要求上面的$i是不确定的,是可变的,是动态的。
那么用Assign来表达,
Assign("ctr"&$i,ControlGetPos("Form1","",$Button[$i]))
形成的数据是这样的
$ctr1,$ctr1,$ctr1,$ctr1
$ctr2,$ctr2,$ctr2,$ctr2
变量表达如下: Assign("ctr"&$i, [$i])
那么就需要在前面申明Dim $ctr1,$ctr2,$ctr3,$ctr4.......
那么就应该表达成这样的申明: Dim Assign("ctr"&$i, ) ,这样是不行的。
这样实际上没有起到作用,因为Dim ..这段语法是定死的,里面的1,2,3,4,5...还是无法变量,像Ctr[$i][$t] 这样。
定义不了,就要弹出错误。
如果不能对应成Ctr[$i][$t]这种形式,那接下来后面的坐标也无法与单元格对应上了,因为单元格是就是[$i][$t]的方式动态生成的.
afan
发表于 2011-11-29 18:10:51
本帖最后由 afan 于 2011-11-29 18:13 编辑
LZ写段简单的“完整的”“测试代码”和“需要的数据”,我帮你改试试~ 如果跟帖及时的话……
绿色风
发表于 2011-11-29 18:25:53
回复 21# dnbj2010
在程序的开头就定好呀 。
dim $ctrl1
还有 ControlGetPos 返回的数据是不是二维数组吧
就算是二维数组也是好表示的呀
从头分析,慢点理清头序。
再整理说清一点给afan超版让他跟你写个对比一下。就成的了。
dnbj2010
发表于 2011-11-29 18:50:02
本帖最后由 dnbj2010 于 2011-11-29 20:02 编辑
如下:#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <array.au3>
Opt("GUIOnEventMode", 1)
;是这样,假设要获取3个动态生成的按钮的坐标,数字3比如从配置文件上读取,有可能是2,也可能是4
;所以不能提前声明
Dim $i,$Bt,$ctr1,$ctr2,$ctr3;像这样提前声明,万一是1000呢?又不能写成 Dim Assign("ctr"&$i,"")
$Form1 = GUICreate("Form1", 700, 444, 150, 120)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
For $i = 1 To 3
$Bt[$i] = GUICtrlCreateButton($i,248,$i*50+5,75, 25)
Next
For $i = 1 To 3
Assign("ctr"&$i,ControlGetPos("Form1","",$Bt[$i]))
Next
;数据将是 Assign("ctr"&$i,[$t])),也就是 每一个Pos的 $i 与按钮的$i 对应
;$t则是0-3,对应x,y,w,h
;总共可获取的变量是 4*3,即 12 个值
;通过指定$t变量值 和 $i 变量值,就能确定是哪一个按钮的坐标与大小了.
;在贴子的首页,有活动单元格的全部代码,单元格的坐标与大小是可调整的。
$ButtonA = GUICtrlCreateButton("点我", 504, 168, 75, 73)
GUICtrlSetOnEvent ($ButtonA, "DATA")
$Input1 = GUICtrlCreateInput("按钮数字", 488, 112, 81, 21)
$Input2 = GUICtrlCreateInput("坐标代码", 488, 144, 81, 21)
GUISetState(@SW_SHOW)
While 1
Sleep(1)
;_ArrayDisplay($ctr1)
WEnd
Func DATA()
$r1= GUICtrlRead ($Input1)
$r2= GUICtrlRead ($Input2)
;MsgBox(0,"",Assign("ctr"&$r1,"["& $r2 & "]"))
MsgBox(0,"",Assign("ctr"&1,"")) ;弹出错误
;MsgBox(0,"",$ctr1) ;取第1个按钮的X值,成功
EndFunc
Func CLOSEClicked()
GUIDelete($Form1)
Exit
EndFunc
dnbj2010
发表于 2011-11-29 20:14:55
问题就在于,如果采用 Assign()时,必须要逐一声明,允许Local Assign("ctr"&$i,"") 这样声明吗?
而且在后面的表达也困难,对于某一个确定的值,
如$ctr1 = 258没问题
Assign("ctr"&1,"") 就有问题了
afan
发表于 2011-11-29 20:47:42
Opt('GUIOnEventMode', 1)
Local $c = 5 ;从配置文件上读取,有可能是2,也可能是4
Local $Bt[$c + 1]
$Form1 = GUICreate('动态控件坐标值', 700, 400)
GUISetOnEvent(-3, '_CLOSEClicked')
For $i = 0 To $c - 1
$Bt[$i] = GUICtrlCreateButton($i + 1, 248, ($i + 1) * 50 + 5, 75, 25)
Assign('_ctr' & $i + 1, ControlGetPos($Form1, '', $Bt[$i]))
Next
GUICtrlCreateButton('取值', 500, 168, 75, 25)
GUICtrlSetOnEvent(-1, '_GetData')
$Input1 = GUICtrlCreateInput('1', 488, 112, 20, 21)
$Input2 = GUICtrlCreateInput('', 488, 144, 120, 21)
GUISetState()
_GetData()
While 1
Sleep(100)
WEnd
Func _GetData()
Local $r1 = GUICtrlRead($Input1)
If $r1 > $c Then Return SetError(1)
Local $aTmp = Eval('_ctr' & $r1)
If Not IsArray($aTmp) Then Return SetError(2)
GUICtrlSetData($Input2, $aTmp & ', ' & $aTmp & ', ' & $aTmp & ', ' & $aTmp)
Return $aTmp
EndFunc ;==>_GetData
Func _CLOSEClicked()
Exit
EndFunc ;==>_CLOSEClicked
chenronting
发表于 2011-11-29 20:52:57
呵呵,这个东西很有意思,不过,移动快一点,就无法跟上了。
xms77
发表于 2011-11-29 21:24:38
真是高人啊!
dnbj2010
发表于 2011-11-30 07:37:16
回复 23# 绿色风
-----------------------------------------------------
惭愧啊,绿色风朋友都已经把Assign,Eval放到跟前了,我却视而不见,文档里可是有提示呢,汗死!
{:face (189):}
还是要再耐心,再沉淀。
dnbj2010
发表于 2011-11-30 08:12:41
谢A版和绿色风朋友的大力支持,本人将精简后的代码已发到源区。
http://www.autoitx.com/thread-29017-1-1.html
user11
发表于 2011-12-2 09:33:46
都是高手。。支持下