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

都是高手。。支持下
页: 1 [2] 3
查看完整版本: 发一个AU3的活动表格(试验品)