总算看完一遍SkyFree老师的教程了!自己激励一下自己!
没有技术含量,只是想和大家分享自己的喜悦!AutoIt基础实践练习笔记
1.列出本机驱动器个数并分别显示出来?
代码如下:
$drivetotal=DriveGetDrive("all")
If Not @error Then
MsgBox(0,"所有驱动器类型", "总共有" & $drivetotal & "个驱动器")
For $x=1 To $drivetotal
MsgBox(0,"第" & $x & "个驱动器是:",$drivetotal[$x])
Next
EndIf
注意:应进行if错误判断
2.创建一个新文件,并逐行写入内容?
代码如下:
$accordlinewrite=FileOpen("c:\zgktest.txt",1)
If @error Then
MsgBox(0,"error","文件未打开或创建新文件失败")
Else
FileWrite($accordlinewrite,"往第1行写的内容")
FileWrite($accordlinewrite,"继续往第1行写内容" & @CRLF)
FileWrite($accordlinewrite,"往第2行写入的内容")
EndIf
FileClose($accordlinewrite)
注意:fileopen()并不是通常的“打开文件”,而是AutoIt3后台打开并进行操作
3.逐行读去文件内容?
代码如下:
HotKeySet("{F2}","_Copy")
;定义F2为热键,按下F2后,执行函数“ _Copy"
Global $LineNum=1
Global $IniFile=FileOpenDialog("选择要读取的文本文件","","(*)")
If @Error Then Exit
;"选择要读取的文本文件"是"打开文件窗口的标题"
;" "是你指定"打开文件的路径",空默认为"系统根目录下"
;(*)是"打开的文件类型"
While 1
Sleep(500)
WEnd
;不清楚,等待什么呢?我把它拿掉也没影响什么?不过我也是刚学AU3不到1个月,还没摸到门呢?
Func _Copy()
$GetLine=FileReadLine($IniFile,$LineNum)
If @Error=-1 Then
$LineNum=1
Else
ClipPut($GetLine)
Send("^{V}")
$LineNum+=1
EndIf
EndFunc
;if @Error=-1 如果到文件末尾,在返回文件首行
;ClipPut($GetLine) 将读取到的内容放到剪贴板上,在 Send("^{V}") 进行粘贴,再 $LineNum+=1 进入下一行
4.播放AVI文件?
#include <GUIConstants.au3>
$x=ObjCreate("WMPlayer.OCX")
$Form1 = GUICreate("AForm1", 500,400, 193, 200)
$Button1 = GUICtrlCreateButton("开始", 104, 344, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 272, 336, 121, 41, 0)
$sky=GUICtrlCreateObj($x, 100,50,500,500)
GUISetState(@SW_SHOW)
$x.uimode="none"
$x.url="F:\家庭录象\yiyan\liuyi107.avi"
$x.Controls.play
;MsgBox(0,"",$sky)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Wend
5.自动建立文本文件并保存?
代码如下:
Send("#r")
;#表示Windows徽标,即发送Win+R
WinWaitActive("运行")
Send("notepad.exe{Enter}")
;发送notepad.exe到运行窗口并回车
WinWaitActive("无标题 - 记事本")
Send("这里是通过WIN+R打开运行窗口,再自动输入notepad.exe后,在打开记事本程序自动输入指定内容后保存并退出 {F5}")
;Send("现在的时间/日期是 {F5}")
WinClose("无标题 - 记事本")
WinWaitActive("记事本")
Send("!Y")
WinWaitActive("另存为")
Send("testautosave.txt!S")
;将新建立的文本文件命名为testautosave.txt并存储
遗留问题(已解决-感谢C.L):无法存储到指定路径?
Send("#r")
WinWaitActive("运行","打开(&O)")
ControlSetText("运行","打开(&O)","Edit1","notepad.exe")
ControlClick("运行","打开(&O)","Button2")
WinWaitActive("无标题 - 记事本")
Send("用于测试对于ComboBox的操作,其中还包括测试controlcommand下的setcurrentselectionselectstring")
WinClose("无标题 - 记事本")
;Send("!F")
;Send("!X")
WinWaitActive("记事本","文件 无标题 的文字已经改变。")
ControlClick("记事本","文件 无标题 的文字已经改变。","Button1")
WinWaitActive("另存为","保存在")
;ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
;ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)
ControlSetText("另存为","保存在","Edit1","testComboBox.txt")
;其实改成ControlSetText("另存为","保存在","Edit1","c:\testComboBox.txt")就OK了
ControlClick("另存为","保存在","Button2")
新问题:
1. ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
为什么不好使?(已解决-感谢afan)
是" 本地磁盘 (C:)"前的图标没有捕获造成的吗?可能是“该图标造成字符串不匹配最终造成ControlCommand()失效!
在该语句前/后分别加上:ControlClick("另存为","保存在","ComboBox1")就确保ControlCommand()成功
我的理解:因为她特殊,controlclick()先让它获得焦点,在利用controlcommand()下的selectstring命令选中希望的存储路径,再controlclick()返回到到ComboBox上,这样理解容易些!
2. ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)
为什么不好使?
它不涉及图标的问题啊!
方法补充一(条条大路同罗马):
$newfilename="c:\zgknew.txt"
$newfilecontents="C盘下新建立一个文件zgknew.txt,写入内容后自动保存"
$temp=FileOpen($newfilename,2)
FileWrite($temp,$newfilecontents)
FileClose($temp)
6.求某正数的立方?
代码如下:
Dim $x,$y
While 1
$x=InputBox("inputbox","请输入一个正整数:","","",50,50,"","",10)
$y=$x^3
Select
Case @error=0
MsgBox(0,"inputbox成功",$x & "的3次方是:"& $y)
Case @error=1
MsgBox(0,"canel","你按了取消按钮")
ExitLoop
Case @error=2
MsgBox(0,"delay","时间超时")
ExitLoop
EndSelect
Wend
注意:当使用inputbox()输入时,一定要验证“当按下Cancel按钮时的动作”
7.对输入的学生分数进行评价?
代码如下:
Dim $score
While 1
$score=InputBox("分数输入","请输入每名学生的分数:")
;$score=InputBox("分数输入","请输入每名学生的分数:","","",100,50,150,250,50)
;"default"是InputBox内默认的值
;If @error=1 Then MsgBox(0,"取消","你按了取消按钮")
If @error=1 Or $score="" Then
MsgBox(0,"发生错误","你按了取消按钮或输入值为空")
Exit
EndIf
If @error=2Then MsgBox(0,"超时了","在规定时间内你没有输入学生分数")
Select
Case $score>90 And $score<=100
MsgBox(0,"优秀类","该名学生成绩优秀")
Case $score>80 And $score<=90
MsgBox(0,"良好类","该名学生成绩良好")
Case $score>=60And $score<=80
MsgBox(0,"优秀","该名学生成绩及格")
Case $score>=0 And $score<60
MsgBox(0,"优秀","该名学生成绩很差")
Case Else
MsgBox(0,"输入错误","输入了不正确的分数")
EndSelect
Wend
我的错误:把If @error=1 Or $score="" 中的红色部分写成了@error=””,这样无论输入什么样的分数都先执行 MsgBox(0,"发生错误","你按了取消按钮或输入值为空") 再进行case判断。
8.
;目的:随意输入4位以内的整数,判断它是多少位,每一位数分别是什么,并把它们反向排列成一个新数
;技巧:把十位 百位 千位 都当 个位 来处理
Dim $Unit=0,$Ten=0,$Hundred=0,$Thousand=0
Dim $Digit=1
Dim $Num,$NewNum
$Num=InputBox("输入框","请输入4为数以内的整数")
If @error=1 Or $Num="" Then
MsgBox(0,"发生错误","按了Cancel按钮或输入值为空")
Exit
EndIf
Select
Case $Num>=0 And $Num<10
$Digit=1
$Unit=Mod($Num,10)
$NewNum=$Unit
Case $Num>=10 And $Num<100
$Digit=2
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$NewNum=$Ten+$Unit*10
Case $Num>=100 And $Num<1000
$Digit=3
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
$NewNum=$Hundred+$Ten*10+$Unit*100
Case $Num>=1000 And $Num<=9999
$Digit=4
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
$Thousand=Mod(($Num-$Hundred*100-$Ten*10-$Unit)/1000,10)
$NewNum=$Thousand+$Hundred*10+$Ten*100+$Unit*1000
EndSelect
MsgBox(0,"digit","这是一个"&$Digit&"位数"&@CRLF _
&"个位:"&$Unit&@CRLF&"十位:"&$Ten&@CRLF&"百位:"&$Hundred&@CRLF_
&"千位:"&$Thousand&@CRLF&"重组的新数:"&$NewNum)
9.突然想用AutoIt3自动MSTSC?
代码如下:
Run("mstsc")
WinWaitActive("远程桌面连接","连接(&N)")
ControlSetText("远程桌面连接","连接(&N)","Edit1","要登陆的IP")
ControlClick("远程桌面连接","连接(&N)","Button1")
WinWaitActive("要登陆的IP - 远程桌面")
;注意上面的窗口标题我改了
Send("password{Enter}")
补充(感谢cnhfg):
send(("+{tab}"))
send("administrator")
send("{tab}")
send("123")
send("{enter}")
10.输出一个3行5列矩阵?
代码如下:
Dim $i,$j
;分别定义了对 行 和 列操作的2个变量
Dim $s=""
;定义了用于输出目的的变量
For $i=1 To 3
For $j=1 To 5
$s=$s&" " & ($i*10+$j)
Next
$s=$s & @CRLF
Next
MsgBox(0,"从第1到第3逐行输出:",$s)
;错误:$s=$s&" " & ($i*10+$j)
;首先输出的数字是连着的,原因是将 " "写成了""
;其次是将($i*10+$j)写成了"$i*10+$j
11.要求只能用20张10元、20元、50元的人民币组成总额为600元,问总共有多少组法?
代码如下:
Dim $Ten,$Twenty,$Fifty
;分别定义 10 20 50 人民币的张数 变量
Dim $Sum=""
;定义了成功组合的结果 变量
For $ten=0 To 20
For $Twenty=0 To 20
For$Fifty=0 To 12
If$Ten+$Twenty+$Fifty=20 And $Ten*10+$Twenty*20+$Fifty*50=600 Then
$Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
EndIf
Next
Next
Next
;因为限定了只能用20张人民币
;而可能使用的10元人民币张数在0-60之间;可能使用的20元人民币张数在0-30之间;可能使用的50元人民币张数在0-12之间;
;以上2个条件必须同时符合,所以10元在0-20之间;20元在0-20之间;50元在0-12之间才行
MsgBox(0,"显示组合结果",$Sum)
;我的错误 $Sum="10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
;少了$Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF,这是个致命错误,没有使用初始状态的$Sum,当然只能显示最后一次成功组合的信息,照猫画猫是不行的啊!!!
12.关于ASCII的了解?
ASCII列表就是“字符串与ASCII值一一对应的关系表”。
ASC(字符串) :将字符串转换成对应的ASCII值
Chr(ASCII值) :将ASCII值转换成字符串
@CR 对应13 ;@LF对应10 ;@TAB 对应 9
A-Z 分别对应65-90;a-z 分别对应 97-122
具体示例代码1:
Dim $i,$s
$s=""
For $i=65 To 90
$s=$s&Chr($i)&" "
Next
MsgBox(0,"依次显示ASCII值从65-90所对应的字符串值",$s)
具体示例代码2:
Dim $Char
While 1
$Char=InputBox("判定输入是否是字母","请输入字符")
If @error=1 Or$Char=""Then
MsgBox(0,"输入非法","你输入的不是字符或输入为空")
Exit
EndIf
If (Asc($Char)>=65 And Asc($Char)<=90) Or (Asc($Char)>=97 And Asc($Char)<=122) Then
MsgBox(0,"输入正确","你输入的是A-Z或a-z中的字母"&"中的 "&$Char)
Else
MsgBox(0,"输入错误","你输入的不是A-Z或a-z中的字母")
Exit
EndIf
Wend
13.乘法口诀?
方法1:
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1To 9
$s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&""
Next
$s=$s&@CRLF
Next
;$s = StringReplace ($s,"=0","=") 修改了StringFormat(),该行可以省略掉了
MsgBox(0,"乘法口诀列式",$s)
;感谢C.L
;StringFormat("格式控制字符串",变量1[,...变量32])
;返回根据“格式控制字符串”参数定义中的“变量格式”格式化后的字符串
;好绕嘴,就是根据“格式控制字符串定义的格式进行后续变量的输出
; % 格式控制字符串标识
; 2d 以整数类型输出,2是输出的宽度
; - 在指定的宽度左对齐,默认是右对齐
;我将$s&=StringFormat ("%2d*%2d=%2d",$i,$j,$i*$j)&"" 改成 $s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&""
;StringReplace("字符串","搜索串"或起始位置,"替换串"[,数量[区分大小写]]
;$text = StringReplace("this is a line of text", " ", "-")
;$numreplacements = @extended
;@extended 扩展函数返回值,常用于StringReplace()
;MsgBox(0, "替换后:", $text)
;MsgBox(0, "替换操作次数:", $numreplacements)
方法2:@TAB 制表符
;感谢lpxx
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1To 9
$s=$s&$i&"*"&$j&"="&($i*$j)&" "& @TAB
Next
$s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s)
方法3:设置内循环
;感谢netegg
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1To$i ;精华所在
$s=$s&$j&"*"&$i&"="&($j*$i)&" "& @TAB
Next
$s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s)
14.字符串相关函数了解?
代码如下:
Dim $Name="My name is zougk! Welcome to my style"
Dim $Str1,$Str2,$Str3,$Str4,$Str5,$Str6,$Str7,$Str8,$Str9,$Str10,$Str11,$Str12
Dim $Len
$Str1=StringLeft($Name,16)
MsgBox(0,"StringLeft'use",$Str1)
$Str2=StringRight($Name,19)
MsgBox(0,"StringRight'use",$Str2)
$Str3=StringMid($Name,12,5)
MsgBox(0,"StrintgMid'use",$Str3)
$Len=StringLen($Name)
MsgBox(0,"变量$Name的长度","字符串"&$Name&"的长度是:"&$Len&"位")
$Str4=StringUpper($Name)
MsgBox(0,"小写字母变大写",$str4)
$Str5=StringLower($Name)
MsgBox(0,"大写字母变小写",$Str5)
$Str6=StringReplace($Name,"zougk","zouyy")
MsgBox(0,"字符串指定内容替换",$Str6)
$Str7=StringSplit($Name," ",0)
MsgBox(0,"字符串按空格进行分割","第1个字母"&$Str7&" "&"第2个字母"&$Str7) ;之后省略吧
$Str8=StringSplit($Name,"",1)
MsgBox(0,"字符串按单词逐个分割","第1个字母"&$Str8&" "&"第2个字母"&$Str8) ;之后省略吧
; [已解决]谁能告诉我 StringSplit($Name," ",0) 和 StringSplit($Name," ",1) 的区别?
Dim $Name="My name is zougk, Welcome to my style"
Dim $Str1,$Str2,$Str3,$Str4,$Str5,$Str6,$Str7,$Str8,$Str9,$Str10,$Str11,$Str12
Dim $Len
$Str1=StringSplit($Name,", ",0)
MsgBox(0,"test stringsplit","第1个被分割的子字符串"&$Str1&@CRLF&"第2个被分割的子字符串"&$Str1& _
@CRLF&"第3个被分割的子字符串"&$Str1&@CRLF&"第4个被分割的子字符串"&$Str1&@CRLF& _
"第5个被分割的子字符串"&$Str1&@CRLF&"第6个被分割的子字符串"&$Str1&" ")
$Str2=StringSplit($Name,", ",1)
MsgBox(0,"test2 stringsplit",$Str2)
;感谢afn
;分割符是对分割符前的”子字符串"进行分割,到了第5个分割符前的子字符串是空
;对于只有1个分割符的StringSplit("字符串","分割符",flag),flag为0或1都一样
;对于大于等于2个分割符的StringSplit("字符串","分割符",flag),flag为0表示“分割符以 个体形式参与到分割字符串的行动中来
;对于大于等于2个分割符的StringSplit("字符串","分割符",flag),flag为1表示“分割符以 整体形式参与到分割字符串的行动中来
$Str9=StringStripWS($Name,8)
MsgBox(0,"去掉字符串中的所有空格空格",$str9) ;StringStripWS("字符串",标志) 标志为8是去掉所有空格,还可以设置为1 24
$Str10=StringTrimLeft($Name,17)
MsgBox(0,"从左截掉指定数量的字符后剩余的字符串",$Str10)
$Str11=StringTrimRight($Name,19)
MsgBox(0,"从右截掉指定数量的字符后剩余的字符串",$Str11)
$Str12=StringIsAlNum($Name);判定$Name是否完全是字母或数字,是返回1,因有空格和 ! ,所以返回0
;StringIsAlpha("string") 判定string是否完全是字母
MsgBox(0,"字符串是否完全是字母",$Str12)
$Str13=StringInStr($Name,"my",0)
;StringInStr("字符串","子字符串",是否区分大小写 0是不区分大小写,出现次序
MsgBox(0,"检查字符串中是否包含指定的子字符串",$Str13)
$Str14=StringInStr($Name,"my",1,1)
MsgBox(0,"检查字符串中是否包含指定的子字符串",$Str14)
15._arraydisplay函数的应用?
代码如下:
#include <array.au3>
Dim $HomeMember=[["zgk","1970",40],["yhh","1980",30],["zyy","2000",10]]
_ArrayDisplay($HomeMember,"家庭信息")
;我的错误是["yhh","1980,30]少了一个双引号,还以为是在中英输入状态下的[ ]出了问题呢?
16.打开指定网页?
错误:run(“iexplore.exe http://sohu.com”)
原因:iexplore.exe路径有问题,run无法找到它,Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131")解决
补充:Run("Notepad.exe", "", @SW_MAXIMIZE),最大化的运行记事本
Run("C:\Program Files\Internet Explorer\iexplore.exe http://10.64.240.131","",@SW_HIDE),打开指定网站并隐藏
Run(“controlsysdm.cpl”),打开“控制面板”下的“系统属性”
ShellExecute("rundll32.exe","shell32.dll,#61"),打开“开始”“运行”
ShellExecute("rundll32.exe","shell32.dll,#60"),打开“关闭Windows”窗口
遗留问题(2010.3.11):
如何将C:\Program Files换成%ProgramFiles%而变的通用?
解决(2010.3.11):
run(@ProgramFilesDir& “\InternetExplorer\iexplore.exe http://10.64”,””,@SW_Maximize)
@ProgramFilesDirAutoIt3系统变量,指定C:\Program Files具体位置
&字符串连接符号
如何打开指定的文件夹?
解决 (2010.3.11):
Run(“explorer c:\program files”)
Run(“explorer /e,c:\program files”) ,以“资源管理器”的方式打开指定的文件夹
17.如何用ControlCommand去掉软件安装中的某插件或快捷方式?
语法:ControlCommand ( "窗口标题", "窗口文本", 控件ID, "命令", "选项")
18.打开记事本自动输入定制内容后在自动关闭记事本程序?
原码:
Run('notepad.exe')
WinWait("无标题 - 记事本","")
WinWaitActive("无标题 - 记事本","")
Send("自动向记事本输入指定内容后并自动关闭它")
WinClose("无标题 - 记事本","")
WinWait("记事本","")
WinWaitActive("记事本","")
Send('&n')
错误:将winclose放到最后一行,那肯定不对,先要关闭记事本后才出现“是否存储内容”的窗口。
19.winzip自动化安装遇到的问题?
错误:捕捉到的“标题”是WinZip® 14.0 Setup,但是复制到编辑器@变成了? ,这样在winwaitactive中没有成功捕捉到该窗口,controlclickSetup当然错误。
20.创建GUI截面遇到的关于” “和“”的错误?
原码:
#include <GUIConstants.au3>
GUICreate("GUI图形窗口",200,100)
GUICtrlCreateLabel("邹国奎创建",20,20,70)
$okButton=GUICtrlCreateButton("还OK吧",40,40,60)
GUISetState(@SW_SHOW)
While 1
$msg=GUIGetMsg()
Select
Case $msg=$GUI_EVENT_CLOSE
MsgBox(0,"GUIs事件","你选择了关闭!正在退出")
Case $msg=$okButton
MsgBox(0, "GUI 事件", "您按下了“还OK吧”按钮!")
ExitLoop
EndSelect
Wend
注意:红色的“还OK吧”,不应该是在英文状态输入的” “。
21.学习GUI的onEvent模式遇到的问题?
代码如下:
#include <GUIConstants.au3>
Opt("GUIonEventMode",1)
$mainwindow=GUICreate("主窗口-邹国奎",200,100,200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")
GUICtrlCreateLabel("最近过的如何!",10,20)
$Button=GUICtrlCreateButton("还OK!",20,40,60)
GUICtrlSetOnEvent($Button,"BUTTON")
$secondwindow=GUICreate("这是一个测试的非主窗口,不会显示",200,100)
GUISetOnEvent($gui_event_close,"CLOSEClick")
GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
;GUISetState(@SW_SHOW,$mainwindow)也可以
While 1
Sleep(1000)
WEnd
Func BUTTON()
MsgBox(0,"GUI事件","你按下了“还OK!”按钮")
EndFunc
Func CLOSEClick()
If @GUI_WinHandle=$mainwindow Then
MsgBox(0,"GUI事件","你选择了关闭主窗口,正在关闭中...")
Exit
EndIf
EndFunc
注意红色部分,我点击按钮事件没反应啊?原来我是用了GUISetonEvent,而按钮是控件应该是GUICtrlSetonEvent()啊!机械学习不灵活呀!
22.使用#include多次包含同一个自定义的AU3文件错误?
代码如下:
;;; 下面是脚本 TIME.AU3 的代码 ;;;
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)
;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "TIME.AU3"
MsgBox(0,"", "示例")
#include "TIME.AU3"
Exit
; 运行 script.au3 将会输出以下三个消息框:
; 第一个报时,第二个是“示例”,第三个也是报时。
注意:在SCRIPT.AU3中使用#include多次包含TIME.AU3时,要在被包含的TIME.AU3文件头部添加#inclued-once,即
;;; 下面是脚本 TIME.AU3 的代码 ;;;
#inclued-once
MsgBox(0,"", "现在时间是: " & @HOUR & ":" & @MIN & ":" & @SEC)
;如果不加#include-once,会发生TIME.AU3已经包含错误提示,但“继续执行”同样会输出3个消息框
代码补充:
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once
Func myFunc()
MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc
;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
#include "Library.au3";若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误
MsgBox(0, "示例", "此对话框从 script.au3 中调出")
myFunc()
Exit
; 运行 script.au3 将会输出以下两个消息框:
; 第一个是“此对话框从 script.au3 中调出”
; 第二个是“此对话框由 library.au3 内的函数调出”
注意:虽然在script.au3中2次使用#include "Library.au3",但在执行script.au3时,只弹出2个信息框,说明“自定义函数-myFunc()”只用在被调用时才执行其特定的功能。
遗留问题:在scirpt.au3中的多个#include "Library.au3"是不是每一个都执行了呢?如果将以上代码改成
;;; 下面是脚本 LIBRARY.AU3 的代码 ;;;
#include-once
MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
Func myFunc()
MsgBox(0,"", "此对话框由 library.au3 内的函数调出")
EndFunc
;;; 下面是脚本 SCRIPT.AU3 的代码 ;;;
#include "Library.au3"
MsgBox(0, "示例", "此对话框从 script.au3 中调出")
#include "Library.au3";若LIBRARY.AU3为使用 #include-once指令则会抛出一个错误
myFunc()
Exit
那么还是显示2个消息框分别是:
"此对话框由 library.au3 内的函数调出"和"此对话框从 script.au3 中调出",感觉script.au3中第1个#include "Library.au3"执行了,可后一个#include "Library.au3" 和myFunc()没起作用啊???
23.交换数据错误?
代码如下:
dim $first=1,$second=2
swap($first,$second)
msgbox(0,"$first和$second交换后: ","$first= " &$first)
func swap( $x, $y)
local $t
$t=$x
$x=$y
$y=$t
endfunc
注意:无法完成交换,改成func swap(ByRef $x,ByRef $y)则可以完成交换,ByRef指定函数swap()所接受的参数必须是变量且可以被函数swap()修改。
知识补充:
主体程序的参数是实际参数,函数中的参数是形式参数。它们之间的值传递有2中形式:值传递和址传递。
如果不加ByRef,就是值传递,相当于主体参数将它的值传递给形式参数后,他们就没有任何关系了 ,无论形式参数怎么交换都不会影响实际参数的值,所以无法实现交换。
址传递是将代表变量的内存空间的地址进行传递,就好象映射一样,修改了形式参数,他所对应的实际参数也会变化。
24.for…next问题?
代码如下:
For 1 To $y Step 1
MsgBox(0,"显示寻麻疹文档内容:",$x)
Next
注意:For <控制变量> = <初始值> To <终值> ,基础不牢啊!
25.soundplay(“music”,0)任务栏的AU3图标一闪而过,将0改1就OK!0是不等歌曲播完直接执行下一语句,可下面什么都没有所以就退出了,1则是等歌曲播放完再退出。不细心看帮助啊!!!
26.关于@error的困惑?
代码如下:
$var = IniReadSection("C:\Temp\myfile.ini", "section2")
If @error Then
MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
For $i = 1 To $var
MsgBox(4096, "", "关键字:" & $var[$i] & @CRLF & "数值:" & $var[$i])
Next
EndIf
注意:总把 if @error 当成 if @error=0,0当然是没错误,实际它是“如果有错怎么怎么样”,IniReadSection()读取的返回的数组元素的数量默认都存储到$var是规定!
27.GUICtrlCreateAVI()的问题?
注意:不支持有声AVI文件。
外置的一样可以。但是网上的视频AVI又不行。郁闷。AU3安装目录自带的却行。
原因还在研究中。但是可以不用GUICtrlCreateAvi
直接用GUICtrlCreateObj。只是这个加载对象的,运行程序的时候感觉有点慢。
找到原因了。。。帮助没说明GUICtrlCreateAvi ()
上MSDN才查到原因。而帮助里边_GUICtrlAVI_Open才说有。FUCK
GUICtrlCreateAvi () 与_GUICtrlAVI_Open是一样不支持有声AVI的。
MSND说明:
Open does not support sound in an AVI clip; you can open only silent AVI clips.
两个都是只支持无声AVI,有声的用ObjCreate("WMPlayer.OCX")吧。
28.for…next从1加到100的问题?
代码如下:
Dim $Sum,$i
$Sum=0
$i=1
For $i=1 To 100
$Sum=$Sum+$i
Next
MsgBox(0,"从1一直加到100","总和:"&$Sum)
我的错误:在for循环内又加了 个$i=$i+1,真是多余+错误,for本身已经加了吗 !
29.ToolLip居中显示:ToolTip("测试ToolLip居中显示文字", @DesktopWidth/2 -100, @DesktopHeight/2 -100,"正在执行安装...")
30.random()取随机数?
#include <array.au3>
;在1-100之间随机的取出10个数并比较大小
Dim$Num=11 ;定义数组的下标
Dim$i,$RadomArray[$Num]
Dim$Min,$Max
For $i=1To $Num-1
$RadomArray[$i]=Random(1,100,1)
Next
_ArrayDisplay($RadomArray,"显示1-100之间的随机数")
;Random(最小值,最大植,flag) flag默认取”浮点数“,设置为1,取整数
$Min=$RadomArray
$Max=$RadomArray
For $i=2 To $Num-1
If $RadomArray[$i]>$MaxThen
$Max=$RadomArray[$i]
EndIf
If$RadomArray[$i]<$Min Then
$Min=$RadomArray[$i]
EndIf
Next
MsgBox (0,"显示 1-100之间最小和最大的随即数","最小的随机数是:"&$Min&@CRLF&"最大的随机数是:"&$Max)
31.生成10个不重复的随机数?从小到大显示随机数?
;在1-10生成不重复的10个随机数
#include <array.au3>
Const $N=11 ;定义数组的下标,因为要选10个随机数,所以下标为11
Dim $RadomArray[$N] ;定义随机数组
Dim $Num ;判断生成的随机数是否相同中间过度变量
Dim $i,$j ;用于2个循环使用的中间过度变量
Dim $Flag ;用于判定是否有生成相同随机数的标志变量,0表示没有
$i=1
While $i<$N ;当条件成立,进入第1层循环
$Num=Random(1,10,1) ;首先生成1个随机数
$Flag=0 ;因为目前只有1个随机数,所以$Flag=0
$j=1;赋值$j,为 进入 第2个循环设置初始条件
While $j<$i ;判定进入第2个循环是否符合条件,首次肯定不执行,因为$i=$j,所以直接跳入到下一个 if判断语句
If $Num=$RadomArray[$j] Then
$Flag=1
ExitLoop
Else
$j +=1
EndIf
WEnd
If$Flag=0 Then;首次$Flag肯定为0
$RadomArray[$i]=$Num ;成功为随机数组元素进行第1次赋值
$i +=1 ;成功首次赋值后,第1个循环的中间过度变量加1,进行第2次的第1层循环
EndIf
WEnd
_ArrayDisplay($RadomArray,"显示不重复的随机数")
;当$i=2时,符合第1层循环条件,进入第1层循环,再次生成第2个随机数$Num
;当$i=2时,$j<$i符合进入第2层循环,将之前的已生成的第1个$RandomArray与新生成的第2个$Num比较,如果相同$Flag为1,
;退出第2层循环重新生成第2个$Num,否则$j加1破坏第2层的循环条件$j<$i返回到第1层循环,在进入下一个if 判断,继续为随机数组
;增加新的元素,此时的$j=2,$i=3
;剩下依次类推
For $i=1 To $N-2
For $j=$i+1 To $N-1 ;精华所在 $j=$i+1,如果写成$j=2则不能完成从小到大的排序
If $RadomArray[$i]>$RadomArray[$j] Then
$Temp=$RadomArray[$i]
$RadomArray[$i]=$RadomArray[$j]
$RadomArray[$j]=$Temp
EndIf
Next
Next
_ArrayDisplay($RadomArray,"从小到大显示随机数")
以函数完成上述功能:
#include <array.au3>
Local $RadomArray
$RadomArray=CreateRadomArray()
_ArrayDisplay($RadomArray)
$RadomArray=SortRadomArray($RadomArray)
_ArrayDisplay($RadomArray)
Func CreateRadomArray()
Local $N=11
Local $RadomArray[$N]
Local $i,$j,$Num,$Flag
$i=1
While $i<$N
$Num=Random(1,20,1)
$Flag=0
$j=1
While $j<$i
If $Num=$RadomArray[$j] Then
$Flag=1
ExitLoop
Else
$j +=1
EndIf
WEnd
If $Flag=0 Then
$RadomArray[$i]=$Num
$i +=1
EndIf
WEnd
$RadomArray=10
Return($RadomArray)
EndFunc
Func SortRadomArray($Array)
Local $i,$j,$t
For $i=1 To $Array-1
For $j=$i+1 To $Array
If $Array[$i]>$Array[$j] Then
$t=$Array[$i]
$Array[$i]=$Array[$j]
$Array[$j]=$t
EndIf
Next
Next
$Array="" ;为什么要将它置空呢?如不置空,将无法实现排序
;哎!该数组下标是存放数组元素的个数的,不需要参与到排序当中,死教条不灵活!
Return($Array)
EndFunc 本帖最后由 lynfr8 于 2010-4-20 15:55 编辑
独乐乐不如众乐乐
如果初学者都能养成像楼主一样的及时总结和乐于分享学习成果的话
那么既能帮助自己提高,也可帮助后人吸取精华
岂不善哉?
(靠!这里不是文学论坛,又文绉绉了...)
另,建议楼主代码部分还是用此种方式编辑一下,可能更美观方便后者阅读
GUICreate("ok",400,300) 本帖最后由 newuser 于 2010-4-20 17:11 编辑
回复 2# lynfr8
谢谢,有了大家的鼓励,我会更加努力的!不过还是没有明白如何用GuiCreate()来美化代码部分呢?guicreate("windows",300,400)
#include <array.au3>
Const $N=11 ;定义数组的下标,因为要选10个随机数,所以下标为11
Dim $RadomArray[$N] ;定义随机数组
Dim $Num ;判断生成的随机数是否相同中间过度变量
Dim $i,$j ;用于2个循环使用的中间过度变量
Dim $Flag ;用于判定是否有生成相同随机数的标志变量,0表示没有
$i=1
While $i<$N ;当条件成立,进入第1层循环
$Num=Random(1,10,1) ;首先生成1个随机数
$Flag=0 ;因为目前只有1个随机数,所以$Flag=0
$j=1;赋值$j,为 进入 第2个循环设置初始条件
While $j<$i ;判定进入第2个循环是否符合条件,首次肯定不执行,因为$i=$j,所以直接跳入到下一个 if判断语句
If $Num=$RadomArray[$j] Then
$Flag=1
ExitLoop
Else
$j +=1
EndIf
WEnd
If$Flag=0 Then;首次$Flag肯定为0
$RadomArray[$i]=$Num ;成功为随机数组元素进行第1次赋值
$i +=1 ;成功首次赋值后,第1个循环的中间过度变量加1,进行第2次的第1层循环
EndIf
WEnd
_ArrayDisplay($RadomArray,"显示不重复的随机数")
;当$i=2时,符合第1层循环条件,进入第1层循环,再次生成第2个随机数$Num
;当$i=2时,$j<$i符合进入第2层循环,将之前的已生成的第1个$RandomArray与新生成的第2个$Num比较,如果相同$Flag为1,
;退出第2层循环重新生成第2个$Num,否则$j加1破坏第2层的循环条件$j<$i返回到第1层循环,在进入下一个if 判断,继续为随机数组
;增加新的元素,此时的$j=2,$i=3
;剩下依次类推
For $i=1 To $N-2
For $j=$i+1 To $N-1 ;精华所在 $j=$i+1,如果写成$j=2则不能完成从小到大的排序
If $RadomArray[$i]>$RadomArray[$j] Then
$Temp=$RadomArray[$i]
$RadomArray[$i]=$RadomArray[$j]
$RadomArray[$j]=$Temp
EndIf
Next
Next
_ArrayDisplay($RadomArray,"从小到大显示随机数")
以函数完成上述功能:
#include <array.au3>
Local $RadomArray
$RadomArray=CreateRadomArray()
_ArrayDisplay($RadomArray)
$RadomArray=SortRadomArray($RadomArray)
_ArrayDisplay($RadomArray)
Func CreateRadomArray()
Local $N=11
Local $RadomArray[$N]
Local $i,$j,$Num,$Flag
$i=1
While $i<$N
$Num=Random(1,20,1)
$Flag=0
$j=1
While $j<$i
If $Num=$RadomArray[$j] Then
$Flag=1
ExitLoop
Else
$j +=1
EndIf
WEnd
If $Flag=0 Then
$RadomArray[$i]=$Num
$i +=1
EndIf
WEnd
$RadomArray=10
Return($RadomArray)
EndFunc
Func SortRadomArray($Array)
Local $i,$j,$t
For $i=1 To $Array-1
For $j=$i+1 To $Array
If $Array[$i]>$Array[$j] Then
$t=$Array[$i]
$Array[$i]=$Array[$j]
$Array[$j]=$t
EndIf
Next
Next
$Array="" ;为什么要将它置空呢?如不置空,将无法实现排序
;哎!该数组下标是存放数组元素的个数的,不需要参与到排序当中,死教条不灵活!
Return($Array)
EndFunc 回复lynfr8
谢谢,有了大家的鼓励,我会更加努力的!不过还是没有明白如何用GuiCreate()来美化代码部分呢 ...
newuser 发表于 2010-4-20 17:08 http://www.autoitx.com/images/common/back.gif
我晕,我是说你帖子里面代码部分用这种方式去编辑下 回复 4# lynfr8
我明白了,呵呵!千万别晕! 维护工具测试 看看 ok 这教程我以前也看过,不过现在忘得差不多了,没事的时候还得找出来看看 东西要温故而知新呀 呵呵,富有激情的楼主。加油! 回复lynfr8
我明白了,呵呵!千万别晕!
newuser 发表于 2010-4-20 17:13 http://www.autoitx.com/images/common/back.gif
明白怎么还不整理一下?{:face (125):} 加油 楼主 一起努力 加油 楼主 一起努力 不错不错~~~~~~~~~~~~ 楼主现在应该是个小高手了吧?
页:
[1]
2