|
没有技术含量,只是想和大家分享自己的喜悦!
AutoIt基础实践练习笔记
1.列出本机驱动器个数并分别显示出来?
代码如下:
$drivetotal=DriveGetDrive("all")
If Not @error Then
MsgBox(0,"所有驱动器类型", "总共有" & $drivetotal[0] & "个驱动器")
For $x=1 To $drivetotal[0]
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下的setcurrentselection selectstring")
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=2 Then MsgBox(0,"超时了","在规定时间内你没有输入学生分数")
Select
Case $score>90 And $score<=100
MsgBox(0,"优秀类","该名学生成绩优秀")
Case $score>80 And $score<=90
MsgBox(0,"良好类","该名学生成绩良好")
Case $score>=60 And $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=1 To 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=1 To 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=1 To $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[1]&" "&"第2个字母"&$Str7[2]) ;之后省略吧
$Str8=StringSplit($Name,"",1)
MsgBox(0,"字符串按单词逐个分割","第1个字母"&$Str8[1]&" "&"第2个字母"&$Str8[2]) ;之后省略吧
; [已解决]谁能告诉我 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[1]&@CRLF&"第2个被分割的子字符串"&$Str1[2]& _
@CRLF&"第3个被分割的子字符串"&$Str1[3]&@CRLF&"第4个被分割的子字符串"&$Str1[4]&@CRLF& _
"第5个被分割的子字符串"&$Str1[5]&@CRLF&"第6个被分割的子字符串"&$Str1[6]&" ")
$Str2=StringSplit($Name,", ",1)
MsgBox(0,"test2 stringsplit",$Str2[1])
;感谢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 2 4
$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[3][3]=[["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(“control sysdm.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 & “\Internet Explorer\iexplore.exe http://10.64”,””,@SW_Maximize)
@ProgramFilesDir AutoIt3系统变量,指定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中没有成功捕捉到该窗口,controlclick Setup当然错误。
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 <终值> [Step <步长>],基础不牢啊!
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[0][0]
MsgBox(4096, "", "关键字:" & $var[$i][0] & @CRLF & "数值:" & $var[$i][1])
Next
EndIf
注意:总把 if @error 当成 if @error=0,0当然是没错误,实际它是“如果有错怎么怎么样”,IniReadSection()读取的返回的数组元素的数量默认都存储到$var[0][0]是规定!
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 [Step 1]
$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=1 To $Num-1
$RadomArray[$i]=Random(1,100,1)
Next
_ArrayDisplay($RadomArray,"显示1-100之间的随机数")
;Random(最小值,最大植,flag) flag默认取”浮点数“,设置为1,取整数
$Min=$RadomArray[1]
$Max=$RadomArray[1]
For $i=2 To $Num-1
If $RadomArray[$i]>$Max Then
$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[1]与新生成的第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[0]=10
Return($RadomArray)
EndFunc
Func SortRadomArray($Array)
Local $i,$j,$t
For $i=1 To $Array[0]-1
For $j=$i+1 To $Array[0]
If $Array[$i]>$Array[$j] Then
$t=$Array[$i]
$Array[$i]=$Array[$j]
$Array[$j]=$t
EndIf
Next
Next
$Array[0]="" ;为什么要将它置空呢?如不置空,将无法实现排序
;哎!该数组下标是存放数组元素的个数的,不需要参与到排序当中,死教条不灵活!
Return($Array)
EndFunc |
评分
-
查看全部评分
|