找回密码
 加入
搜索
楼主: dnbj2010

[AU3基础] 发一个AU3的活动表格(试验品)

 火... [复制链接]
 楼主| 发表于 2011-11-29 08:52:54 | 显示全部楼层
回复 16# 绿色风

------------------------------------------------
万分感谢
您贴出的这些代码
AU3真是耐“嚼”啊,发现很多东东都没见过...强!...学习了...
 楼主| 发表于 2011-11-29 08:58:57 | 显示全部楼层
For $i = 1 To 3
                Assign("ctr"&$i,  ControlGetPos("Form1","",$Edit[$i][1])    
        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[1][1]) 
 
MsgBox(0,"",$Ctr1[0])

GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
        EndSwitch
WEnd
 楼主| 发表于 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[4]
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[1])
                _ArrayDisplay($ctr1)
        EndSwitch
WEnd



我写的东西正好在这上面纠结了几天,你正好在问这问题,我正好搞明白的了,所以才回了你这贴,BBS中我还没有一个回贴是回的技术贴。

评分

参与人数 1金钱 +30 收起 理由
dnbj2010 + 30 辛苦了!

查看全部评分

 楼主| 发表于 2011-11-29 18:06:52 | 显示全部楼层
回复 20# 绿色风

-----------------------------------------
从你的代码中学到不少知识,感谢你的付出。

我需要的数据是类似这样的:
$Ctr[$i] = ControlGetPos("Form1","",$Button[$i])
其对应的数据就是:
$Ctr[1][0],$Ctr[1][1],$Ctr[1][1],$Ctr[1][3]
$Ctr[2][0],$Ctr[2][1],$Ctr[2][2] ,$Ctr[2][3]
.............
..............
注意,要求上面的$i是不确定的,是可变的,是动态的。
那么用Assign来表达,

Assign("ctr"&$i,  ControlGetPos("Form1","",$Button[$i]))
形成的数据是这样的

$ctr1[0],$ctr1[1],$ctr1[2],$ctr1[3]
$ctr2[0],$ctr2[1],$ctr2[2],$ctr2[3]

变量表达如下:

Assign("ctr"&$i, [$i])



那么就需要在前面申明  Dim $ctr1[4],$ctr2[4],$ctr3[4],$ctr4[4].......

那么就应该表达成这样的申明: Dim Assign("ctr"&$i, [4])   ,这样是不行的。
这样实际上没有起到作用,因为Dim ..这段语法是定死的,里面的1,2,3,4,5...还是无法变量,像Ctr[$i][$t] 这样。
定义不了,就要弹出错误。

如果不能对应成Ctr[$i][$t]这种形式,那接下来后面的坐标也无法与单元格对应上了,因为单元格是就是[$i][$t]的方式动态生成的.
发表于 2011-11-29 18:10:51 | 显示全部楼层
本帖最后由 afan 于 2011-11-29 18:13 编辑

LZ写段简单的“完整的”“测试代码”和“需要的数据”,我帮你改试试~ 如果跟帖及时的话……
发表于 2011-11-29 18:25:53 | 显示全部楼层
回复 21# dnbj2010

在程序的开头就定好呀 。

dim $ctrl1[4]

还有 ControlGetPos 返回的数据是  不是二维数组吧
就算是二维数组也是好表示的呀

从头分析,慢点理清头序。


再整理说清一点给afan超版让他跟你写个对比一下。就成的了。
 楼主| 发表于 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[10],$ctr1[4],$ctr2[4],$ctr3[4]  ;像这样提前声明,万一是1000呢?又不能写成 Dim Assign("ctr"&$i,"[4]")

$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,"[0]"))   ;弹出错误
        ;MsgBox(0,"",$ctr1[0])   ;取第1个按钮的X值,成功
EndFunc

Func CLOSEClicked()
GUIDelete($Form1)
Exit
EndFunc
 楼主| 发表于 2011-11-29 20:14:55 | 显示全部楼层
问题就在于,如果采用 Assign()时,必须要逐一声明,允许Local Assign("ctr"&$i,"") 这样声明吗?
而且在后面的表达也困难,对于某一个确定的值,
如$ctr1[0] = 258  没问题
Assign("ctr"&1,"[0]") 就有问题了
发表于 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[0] & ', ' & $aTmp[1] & ', ' & $aTmp[2] & ', ' & $aTmp[3])
        Return $aTmp
EndFunc   ;==>_GetData

Func _CLOSEClicked()
        Exit
EndFunc   ;==>_CLOSEClicked

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
dnbj2010 + 30 + 5 神了!

查看全部评分

发表于 2011-11-29 20:52:57 | 显示全部楼层
呵呵,这个东西很有意思,不过,移动快一点,就无法跟上了。
发表于 2011-11-29 21:24:38 | 显示全部楼层
真是高人啊!
 楼主| 发表于 2011-11-30 07:37:16 | 显示全部楼层
回复 23# 绿色风


-----------------------------------------------------
惭愧啊,绿色风朋友都已经把Assign,Eval放到跟前了,我却视而不见,文档里可是有提示呢,汗死!

还是要再耐心,再沉淀。
 楼主| 发表于 2011-11-30 08:12:41 | 显示全部楼层
谢A版和绿色风朋友的大力支持,本人将精简后的代码已发到源区。

http://www.autoitx.com/thread-29017-1-1.html
发表于 2011-12-2 09:33:46 | 显示全部楼层
都是高手。。支持下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 16:46 , Processed in 0.080220 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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