newuser 发表于 2012-3-8 08:35:15

以前的学习笔记

今天给淘出来,不知道发过没有?
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&reg; 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
32.设计一个GUI并设置了背景PIC控件,但GUI上的BUTTON控件无反应的原因?
答:错误:$background = GUICtrlCreatePic("F:\儿子背景照片\080402069.jpg", 0, 0, 400, 400)
注意GuiCtrlCreatePIC()的语法,没有进行PIC控件“样式”的编辑:
以下是我帮你找的帮助资料,希望你能理解,其实我也不很理解,跟着学习!
1.        $background = GUICtrlCreatePic("F:\儿子背景照片\080402069.jpg", 0, 0, 400, 400, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))      
2.        ;$SS_NOTIFY:使按钮发送 BN_KILLFOCUS(取消焦点) 与 BN_SETFOCUS(设置焦点) 通知消息到父窗口. 注意不论按钮是否有这个样式,都能发送 BN_CLICKED 单击通知消息.
3.        ;要获取 BN_DBLCLK 双击通知消息, 按钮必须有 BS_RADIOBUTTON 或 BS_OWNERDRAW 样式.
4.        ;$WS_GROUP:指定控件组的第一个控件.控件组由第一个控件和其后定义的所有控件组成,一直到下一个控件带有 WS_GROUP 样式为止.
5.        ;$WS_CLIPSIBLINGS:剪辑子窗口相互对齐; 也就是说, 当某一子窗口收到 WM_PAINT 消息时, 此样式将剪辑所有其他子窗口重叠区域
6.        ;并更新子窗口. 如果未指定子窗口重叠, 这是有可能的, 在需绘制客户区域子窗口时, 只绘制客户区域临近的子窗口.
我的理解是他起了作用(不知道是否正确?):
$SS_NOTIFY:使按钮发送 BN_KILLFOCUS(取消焦点) 与 BN_SETFOCUS(设置焦点) 通知消息到父窗口. 注意不论按钮是否有这个样式,都能发送 BN_CLICKED 单击通知消息.---按钮可以获得焦点,而如果背景PIC控件不这样设置,BUTTON控件就无法获得焦点,自然就无法响应!
第2中解决方法:在$background = GUICtrlCreatePic("F:\ 080402069.jpg", 0, 0, 400, 400下一行加入:GUICtrlSetState(-1,$gui_DISABLE)也能解决。
GuiCtrlSetState(控件ID,状态)
GuiCtrlSetState(-1,$gui_DISABLE):-1本例指PIC控件,如果该行放到BUTTON控件下一行就是指
BUTTON,$gui_DISABLE是把控件变成灰色不可用。

lpxx 发表于 2012-3-8 10:10:38

好记性不如烂笔头,谢谢提供。

ybb03 发表于 2012-3-8 14:15:26

楼主的笔记是我最喜欢看的,都复制过来存成txt进行整理后放到mp4上每天晚上睡前看下很爽。欢迎楼主坚持写下去,也可以开个总贴子

dengweiqi 发表于 2012-3-12 10:04:48

好东西 !!!!!

dengweiqi 发表于 2012-3-12 10:04:51

好东西 !!!!!

ncxj 发表于 2013-4-29 18:12:08

非常好,赞赏有加

lcy 发表于 2013-9-16 17:19:03

非常好,赞赏有加

coolxyj 发表于 2013-9-18 00:24:44

多谢楼主分享。
页: [1]
查看完整版本: 以前的学习笔记