DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant (Long) 的值,表示两个指定 日期间的时间间隔数目 Second(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一分钟之中的某个秒
Minute(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一小时中的某分钟 Hour(time) 返回一个 Variant (Integer),其值为 0 到 23 之间的整数,表示一天之中的某一钟点 Day(date) 返回一个 Variant (Integer),其值为 1 到 31 之间的整数,表示一个月中的某一日
Month(date) 返回一个 Variant (Integer),其值为 1 到 12 之间的整数,表示一年中的某月
Year(date) 返回 Variant (Integer),包含表示年份的整数。
Weekday(date, [firstdayofweek]) 返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几
第二章 Excel VBA常用对象之使用
第一节 文件的操作
1) Excel文件
1.1 新建与打开
一.新建 Workbooks.Add
二.打开
Workbooks.Open "路径 \" & "文件名 .xls"
三.文件打开对话框的使用
Application.GetOpenFilename(fileFilter:="Excel files(*.xls),*.xls,All files (*.*),*.*")
示例 :
flag = False Do While Not flag ' 对话框打开已有 Excel文件 fm = Application.GetOpenFilename(fileFilter:=" Excel files(*.xls),*.xls, All files (*.*),*.*")
If fm <> False Then Workbooks.Open fm Set bb = ActiveWorkbook '把 bb变量设为当前活动工作簿对象,打开一工作簿时,该工作簿自动为当前活动工作簿 flag = True End If Loop
1.2 保存与关闭 一.保存 Workbooks("文
件.xls").Save
二.另存对话框的使用
Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls),*.xls,All files (*.*),*.*") 示例 :
flag = False Do While Not flag ' 循环要求必须输入文件名或选择文件名
fm = Application.GetSaveAsFilename(fileFilter:=" Excel files (*.xls),*.xls,All files (*.*),*.*") If fm <> False Then activeworkbook.SaveAs fm '
作簿另存 flag = True End If Loop
三.关闭
1.单个文件关闭 Workbooks("filename.xls").Close 当前活动工
2.所有该 Excel程序打开的文件都关闭 Workbooks.Close
如果文件使用中改动过内容 , 那么该命令使用时会弹出提示对话框 , 询问是否保存 .
如果要想不弹出提示对话框,可以使用第三或第四种文件关闭方法 , 或者如下示例 .
示例 :
二 、 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
sql2005教程 SQL2005学习教程较为详细
三 、 delphi线程详细教程简单到复杂
?
delphi之多线程编程(一)
本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。(]所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。
多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.
先试试这个:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
end;
end;
上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试...
Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
delphi多线程 delphi线程详细教程简单到复杂
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
Application.ProcessMessages;
end;
end;
这个 Application.ProcessMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息.
但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来...
在使用多线程以前, 让我们先简单修改一下程序:
function MyFun: Integer;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
delphi多线程 delphi线程详细教程简单到复杂
MyFun;
end;
细数上面程序的变化:
1、首先这还不是多线程的, 也会让窗体假 "死" 一会;
2、把执行代码写在了一个函数里, 但这个函数不属于 TForm1 的方法, 所以使用 Canvas 是必须冠以名称(Form1);
3、既然是个函数, (不管是否必要)都应该有返回值;
4、使用了 500001 次 Lock 和 Unlock.
Canvas.Lock 好比在说: Canvas(绘图表面)正忙着呢, 其他想用 Canvas 的等会;
Canvas.Unlock : 用完了, 解锁!
在 Canvas 中使用 Lock 和 Unlock 是个好习惯, 在不使用多线程的情况下这无所谓, 但保不准哪天程序会扩展为多线程的; 我们现在学习多线程, 当然应该用.
在 Delphi 中使用多线程有两种方法: 调用 API、使用 TThread 类; 使用 API 的代码更简单. function MyFun(p: Pointer): Integer; stdcall;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
delphi多线程 delphi线程详细教程简单到复杂
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: THandle;
begin
CreateThread(nil, 0, @MyFun, nil, 0, ID);
end;
代码分析:
CreateThread 一个线程后, 算上原来的主线程, 这样程序就有两个线程、是标准的多线程了;
CreateThread 第三个参数是函数指针, 新线程建立后将立即执行该函数, 函数执行完毕, 系统将销毁此线程从而结束多线程的故事.
CreateThread 要使用的函数是系统级别的, 不能是某个类(譬如: TForm1)的方法, 并且有严格的格式(参数、返回值)要求, 不管你暂时是不是需要都必须按格式来;
因为是系统级调用, 还要缀上 stdcall, stdcall 是协调参数顺序的, 虽然这里只有一个参数没有顺序可言, 但这是使用系统函数的惯例.
CreateThread 还需要一个 var 参数来接受新建线程的 ID, 尽管暂时没用, 但这也是格式; 其他参数以后再说吧.
这样一个最简单的多线程程序就出来了, 咱们再用 TThread 类实现一次
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
delphi多线程 delphi线程详细教程简单到复杂
procedure TMyThread.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放} for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False);
end;
TThread 类有一个抽象方法(Execute), 因而是个抽象类, 抽象类只能继承使用, 上面是继承为 TMyThread.
继承 TThread 主要就是实现抽象方法 Execute(把我们的代码写在里面), 等我们的 TMyThread 实例化后, 首先就会执行 Execute 方法中的代码.
按常规我们一般这样去实例化:
procedure TForm1.Button1Click(Sender: TObject);
var
delphi多线程 delphi线程详细教程简单到复杂
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(False);
end;
因为 MyThread 变量在这里毫无用处(并且编译器还有提示), 所以不如直接写做 TMyThread.Create(False);
我们还可以轻松解决一个问题, 如果: TMyThread.Create(True) ?
这样线程建立后就不会立即调用 Execute, 可以在需要的时候再用 Resume 方法执行线程, 譬如: procedure TForm1.Button1Click(Sender: TObject);
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(True);
MyThread.Resume;
end;
//可简化为:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyThread.Create(True) do Resume;
end;
一、入门
㈠、
function CreateThread(
lpThreadAttributes: Pointer; {安全设置}
dwStackSize: DWORD; {堆栈大小}
delphi多线程 delphi线程详细教程简单到复杂
lpStartAddress: TFNThreadStartRoutine; {入口函数}
lpParameter: Pointer; {函数参数}
dwCreationFlags: DWORD; {启动选项}
var lpThreadId: DWORD {输出线程 ID }
): THandle; stdcall; {返回线程句柄}
在 Windows 上建立一个线程, 离不开 CreateThread 函数;
TThread.Create 就是先调用了 BeginThread (Delphi 自定义的), BeginThread 又调用的 CreateThread.
既然有建立, 就该有释放, CreateThread 对应的释放函数是: ExitThread, 譬如下面代码: procedure TForm1.Button1Click(Sender: TObject);
begin
ExitThread(0); {此句即可退出当前程序, 但不建议这样使用}
end;
代码注释:
当前程序是一个进程, 进程只是一个工作环境, 线程是工作者;
每个进程都会有一个启动线程(或叫主线程), 也就是说: 我们之前大量的编码都是写给这个主线程的; 上面的 ExitThread(0); 就是退出这个主线程;
系统不允许一个没有线程的进程存在, 所以程序就退出了.
另外: ExitThread 函数的参数是一个退出码, 这个退出码是给之后的其他函数用的, 这里随便给个无符号整数即可.
或许你会说: 这个 ExitThread 挺好用的; 其实不管是用 API 还是用 TThread 类写多线程, 我们很少用到它; 因为:
1、假如直接使用 API 的 CreateThread, 它执行完入口函数后会自动退出, 无需 ExitThread;
2、用 TThread 类建立的线程又绝不能使用 ExitThread 退出; 因为使用 TThread 建立线程时会同时分配更多资源(譬如你自定义的成员、还有它的祖先类(TObject)分配的资源等等), 如果用 ExitThread
delphi多线程 delphi线程详细教程简单到复杂