到公司快兩個月了
工作越來越忙 不過我還是一知半解
大絕招還是叫救命
這樣不行阿
話說回來 現在又來了三位新人
我這下不能以新人自居了
要更加專業才行喔
2009年11月21日 星期六
2009年11月3日 星期二
2009年10月21日 星期三
2009年10月16日 星期五
2009年10月13日 星期二
上工第二天
昨天打電話給爸爸媽媽
抱怨以後一定會很慘
還有現在沒人理我
今天第2天上工 比較有事情做了
老闆請了一位工程師教我基本的系統使用
京元的系統比矽品的完備多了
可是測的東西似乎以國內產品比較多
以前的主要是國外產品
老闆還有給我操作手冊
還有測試界的聖經==我在spil看了一個月 所以馬上唉出聲來了
在這裡似乎上班時間是隨自己意思阿
下班也嘿....嘿...看客戶摟
反正由助理統一回報==+
不過這也證明拿不到加班費拉
今天有跟不少工程師聊天
得到八卦 ==不少人想離開了
有一位還想去我的前公司面試
有可能是我的缺==
看地點和名稱.........我想應該是吧
持續努力
抱怨以後一定會很慘
還有現在沒人理我
今天第2天上工 比較有事情做了
老闆請了一位工程師教我基本的系統使用
京元的系統比矽品的完備多了
可是測的東西似乎以國內產品比較多
以前的主要是國外產品
老闆還有給我操作手冊
還有測試界的聖經==我在spil看了一個月 所以馬上唉出聲來了
在這裡似乎上班時間是隨自己意思阿
下班也嘿....嘿...看客戶摟
反正由助理統一回報==+
不過這也證明拿不到加班費拉
今天有跟不少工程師聊天
得到八卦 ==不少人想離開了
有一位還想去我的前公司面試
有可能是我的缺==
看地點和名稱.........我想應該是吧
持續努力
2009年10月12日 星期一
第1天上班
暌違一年 現在又重新當新人了
新的公司文化和工作方式真的都不一樣阿
真是長了見識
新人報到時 有自己學校同系的學妹
另外就是認識好多工工人 這些人都是生管工程師
連我的室友也是工工系的學弟
和主管去廁所 居然沒有擦手的紙巾==
close-down太兇了
網路沒有騙人
同事和主管對我不錯
可是似乎沒太多時間理我
一來我的東西還不齊
二來大家還有工作
所以我看了半天的書
不過我還室友問了一些前公司沒有的處理方式
例如這邊會將travel card用折一角代表hold
折兩角代表已通知客戶
對折代表release
還有不同顏色的防塵袋代表緊急性
黃色特急件
藍色急件
紅色普通件
還有輪班工程師有自己的一個課
這些都跟前公司不一樣阿
後來想想 這是因為前公司專長是封裝
測試真的是小部門
現在待的是專業的測試廠
所以會更制度化
今天主管有稍微上個簡單的課
介紹基本流程
大致跟前公司差不多
但有些微差異還有用語也略有不同
還有他們的系統似乎也比前公司強還有完備
最後我仔細看了公司的工作文化
有一點很糟阿
似乎大家都待到很晚
工作雖然看起來不是非常忙
似乎都是穩穩的做
還可以休息去串個門子
可是待到8.9點似乎是常態
以前的公司除非是特殊狀況
可能要忙到半夜
但是大致上都準時 頂多晚一小時或是換班
看樣子我以前真的是過太爽了
新的公司文化和工作方式真的都不一樣阿
真是長了見識
新人報到時 有自己學校同系的學妹
另外就是認識好多工工人 這些人都是生管工程師
連我的室友也是工工系的學弟
和主管去廁所 居然沒有擦手的紙巾==
close-down太兇了
網路沒有騙人
同事和主管對我不錯
可是似乎沒太多時間理我
一來我的東西還不齊
二來大家還有工作
所以我看了半天的書
不過我還室友問了一些前公司沒有的處理方式
例如這邊會將travel card用折一角代表hold
折兩角代表已通知客戶
對折代表release
還有不同顏色的防塵袋代表緊急性
黃色特急件
藍色急件
紅色普通件
還有輪班工程師有自己的一個課
這些都跟前公司不一樣阿
後來想想 這是因為前公司專長是封裝
測試真的是小部門
現在待的是專業的測試廠
所以會更制度化
今天主管有稍微上個簡單的課
介紹基本流程
大致跟前公司差不多
但有些微差異還有用語也略有不同
還有他們的系統似乎也比前公司強還有完備
最後我仔細看了公司的工作文化
有一點很糟阿
似乎大家都待到很晚
工作雖然看起來不是非常忙
似乎都是穩穩的做
還可以休息去串個門子
可是待到8.9點似乎是常態
以前的公司除非是特殊狀況
可能要忙到半夜
但是大致上都準時 頂多晚一小時或是換班
看樣子我以前真的是過太爽了
2009年10月9日 星期五
2009年10月2日 星期五
2009年10月1日 星期四
2009年9月25日 星期五
2009年9月21日 星期一
2009年9月20日 星期日
NO_PUBKEY? for apt-get update
重灌ubuntu 每次都會遇到匯入金鑰的問題
有時是親自到/etc/apt/source.list去處理
有時用別人寫好的腳本
既然常要處理
把作法記下來
==================
加入 launchpad 或者其他的軟體來源(/etc/apt/source.list)後要是沒匯入金鑰,使用 apt-get update 手動更新時就會有以下的錯誤訊息出現。
jonny@ubuntu:~$ sudo apt-get update
...
...
W: GPG error: http://ppa.launchpad.net hardy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY 6AF0E1940624A220
W: 您也許得執行 apt-get update 以修正這些問題
下載公鑰
jonny@ubuntu:~$ sudo gpg --keyserver keyserver.ubuntu.com --recv 0624A220
# 0624A220 為 key 的後八碼。
匯入公鑰
jonny@ubuntu:~$ sudo gpg --export --armor 0624A220 | sudo apt-key add -
之後再怎麼更新都 ok 啦。
有時是親自到/etc/apt/source.list去處理
有時用別人寫好的腳本
既然常要處理
把作法記下來
==================
加入 launchpad 或者其他的軟體來源(/etc/apt/source.list)後要是沒匯入金鑰,使用 apt-get update 手動更新時就會有以下的錯誤訊息出現。
jonny@ubuntu:~$ sudo apt-get update
...
...
W: GPG error: http://ppa.launchpad.net hardy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY 6AF0E1940624A220
W: 您也許得執行 apt-get update 以修正這些問題
下載公鑰
jonny@ubuntu:~$ sudo gpg --keyserver keyserver.ubuntu.com --recv 0624A220
# 0624A220 為 key 的後八碼。
匯入公鑰
jonny@ubuntu:~$ sudo gpg --export --armor 0624A220 | sudo apt-key add -
之後再怎麼更新都 ok 啦。
2009年9月19日 星期六
檔案分類
今天在excel home看到了人家問 關於檔案歸類的問題
她的寫法其實是用很傳統的迴圈處理方式去判斷新增資料夾還有分類檔案處理
Sub MoveFiles()
'
' MoveFiles Macro
Dim i As Integer
Dim s As String
Dim FilPath As String
Dim aaa As String
Dim bbb As String
Dim MyFile As Object
With Sheet1
For i = 1 To .Range("a65536").End(xlUp).Row
FilPath = ThisWorkbook.Path & "\" & .Cells(i, 1).Text & ".doc"
aaa = ThisWorkbook.Path & "\" & Sheet1.Range("b" & i).Value & "\" & .Cells(i, 1).Text & ".doc"
bbb = ThisWorkbook.Path & "\" & Sheet1.Range("b" & i).Value & ""
If Dir(bbb, vbDirectory) <> "" Then
If Dir(FilPath) <> "" Then
Set MyFile = CreateObject("Scripting.FileSystemObject")
MyFile.MoveFile FilPath, aaa
Set MyFile = Nothing
Else
s = s & Chr(10) & .Cells(i, 1).Text
End If
Else
MkDir (bbb)
Set MyFile = CreateObject("Scripting.FileSystemObject")
MyFile.MoveFile FilPath, aaa
Set MyFile = Nothing
End If
Next
End With
If s <> "" Then
MsgBox s & Chr(10) & "無以上文件!"
End If
End Sub
====================
上面的做法是將檔名寫在a列 分類寫在b類
最後用迴圈分類 移動檔案跟產生資料夾
他還用了FileSystemObject
不過只拿來做資料的移動
有點殺雞用牛刀的感覺
之後有比較厲害的人
寫了下面的語法
Sub MoveFiles()
On Error Resume Next
For Each c In Range([a1], [a65536].End(3))
Name ThisWorkbook.Path & "\" & c.Value & ".doc" As ThisWorkbook.Path & "\" & c(1, 2).Value & "\" & c.Value & ".doc"
Next
End Sub
==================================
這個就高明很多
利用Name陳述式(重新命名一個檔案、目錄、或檔案夾)
Name陳述式可以做到更改檔名,並將檔案搬移至另一個目錄中語法如下
Name OldName As NewName
不過這個做法有個條件
就是預定要移入的資料夾必須先存在
她的寫法其實是用很傳統的迴圈處理方式去判斷新增資料夾還有分類檔案處理
Sub MoveFiles()
'
' MoveFiles Macro
Dim i As Integer
Dim s As String
Dim FilPath As String
Dim aaa As String
Dim bbb As String
Dim MyFile As Object
With Sheet1
For i = 1 To .Range("a65536").End(xlUp).Row
FilPath = ThisWorkbook.Path & "\" & .Cells(i, 1).Text & ".doc"
aaa = ThisWorkbook.Path & "\" & Sheet1.Range("b" & i).Value & "\" & .Cells(i, 1).Text & ".doc"
bbb = ThisWorkbook.Path & "\" & Sheet1.Range("b" & i).Value & ""
If Dir(bbb, vbDirectory) <> "" Then
If Dir(FilPath) <> "" Then
Set MyFile = CreateObject("Scripting.FileSystemObject")
MyFile.MoveFile FilPath, aaa
Set MyFile = Nothing
Else
s = s & Chr(10) & .Cells(i, 1).Text
End If
Else
MkDir (bbb)
Set MyFile = CreateObject("Scripting.FileSystemObject")
MyFile.MoveFile FilPath, aaa
Set MyFile = Nothing
End If
Next
End With
If s <> "" Then
MsgBox s & Chr(10) & "無以上文件!"
End If
End Sub
====================
上面的做法是將檔名寫在a列 分類寫在b類
最後用迴圈分類 移動檔案跟產生資料夾
他還用了FileSystemObject
不過只拿來做資料的移動
有點殺雞用牛刀的感覺
之後有比較厲害的人
寫了下面的語法
Sub MoveFiles()
On Error Resume Next
For Each c In Range([a1], [a65536].End(3))
Name ThisWorkbook.Path & "\" & c.Value & ".doc" As ThisWorkbook.Path & "\" & c(1, 2).Value & "\" & c.Value & ".doc"
Next
End Sub
==================================
這個就高明很多
利用Name陳述式(重新命名一個檔案、目錄、或檔案夾)
Name陳述式可以做到更改檔名,並將檔案搬移至另一個目錄中語法如下
Name OldName As NewName
不過這個做法有個條件
就是預定要移入的資料夾必須先存在
2009年9月18日 星期五
匯入資料
今天耗在excel home好長的時間
記得之前寫過匯入資料的程式
在論壇中還是有很多人問類似的問題
本來想試著幫忙寫寫看
結果版主板友回得很快
而且程式碼又簡潔又迅速
相對的我寫的就差多了
Sub DAORU()
Dim s() As String, f As String, i As Long, b() As Byte
f = Dir(ThisWorkbook.Path & "\*.TXT")
While f > ""
Open ThisWorkbook.Path & "\" & f For Input As #1
s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1
[a1].Offset(, i).Resize(UBound(s) + 1) = WorksheetFunction.Transpose(s)
i = i + 1
f = Dir()
Wend
MsgBox "OK"
End Sub
上面這個副程式 可以將所在資料夾內的文件檔分別輸出在各列
Sub m()
Dim f As String, s() As String, i As Long, j As Long, arr(10000, 255)
f = Dir(ThisWorkbook.Path & "\*.txt")
While f > ""
Open ThisWorkbook.Path & "\" & f For Input As #1
s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1
arr(0, j) = Split(f, ".")(0)
For i = 0 To UBound(s)
arr(i + 1, j) = Split(s(i), vbTab)(0)
arr(i + 1, j + 1) = Split(s(i), vbTab)(1)
Next
j = j + 2
f = Dir
Wend
[a1].Resize(10001, j + 2) = arr
End Sub
另外這個是進階版 每個文件內每行有兩筆資料
不但在第一行輸出檔案名稱 也成功的把每筆資料對應的輸出到儲存格
從這次看到的程式碼裡
我學到除了用input,line input加上迴圈來處理讀檔外
其實有更快的方式讀檔
從網路上找到以下的讀檔方式
這次使用的程式也是用這種方法
--------------------------------------------------------------------------------
使用 TextBox 顯示文字檔內容,通常對應設計的程式片段是
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
While Not EOF(1) '未到檔案尾端
Line Input #1, a$ '逐行讀取
txtContent.Text = txtContent.Text & a$ & vbCrLf '逐行加入txtContent及換行符號
Wend '反覆執行
Close #1 '關閉檔案
若是將 TextBox(txtContent) 顯示內容 的處理敘述略作變更,將可加快處理速度
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
While Not EOF(1) '未到檔案尾端
Line Input #1, a$ '逐行讀取
txtContent.SelText = a$ & vbCrLf '逐行加入txtContent及換行符號
Wend '反覆執行
Close #1 '關閉檔案
其中的道理是:
因為 txtContent.Text = txtContent.Text & a$ & vbCrLf 會安排一個記憶體位置儲存等式右側的運算結果,再清除 txtContent 原有內容,以此一運算結果取代之,其間包含許多的動作;而 txtContent.SelText = a$ & vbCrLf 是直接把右側的運算結果放入 txtContent 裡,少了很多不必要的的動作,所以比較快。
此外,以單一敘述一次讀入整個檔案更可加快完成
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
txtContent.Text = StrConv(InputB(LOF(F), #1), vbUnicode) '一次讀入整個檔案
Close #1 '關閉檔案
記得之前寫過匯入資料的程式
在論壇中還是有很多人問類似的問題
本來想試著幫忙寫寫看
結果版主板友回得很快
而且程式碼又簡潔又迅速
相對的我寫的就差多了
Sub DAORU()
Dim s() As String, f As String, i As Long, b() As Byte
f = Dir(ThisWorkbook.Path & "\*.TXT")
While f > ""
Open ThisWorkbook.Path & "\" & f For Input As #1
s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1
[a1].Offset(, i).Resize(UBound(s) + 1) = WorksheetFunction.Transpose(s)
i = i + 1
f = Dir()
Wend
MsgBox "OK"
End Sub
上面這個副程式 可以將所在資料夾內的文件檔分別輸出在各列
Sub m()
Dim f As String, s() As String, i As Long, j As Long, arr(10000, 255)
f = Dir(ThisWorkbook.Path & "\*.txt")
While f > ""
Open ThisWorkbook.Path & "\" & f For Input As #1
s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1
arr(0, j) = Split(f, ".")(0)
For i = 0 To UBound(s)
arr(i + 1, j) = Split(s(i), vbTab)(0)
arr(i + 1, j + 1) = Split(s(i), vbTab)(1)
Next
j = j + 2
f = Dir
Wend
[a1].Resize(10001, j + 2) = arr
End Sub
另外這個是進階版 每個文件內每行有兩筆資料
不但在第一行輸出檔案名稱 也成功的把每筆資料對應的輸出到儲存格
從這次看到的程式碼裡
我學到除了用input,line input加上迴圈來處理讀檔外
其實有更快的方式讀檔
從網路上找到以下的讀檔方式
這次使用的程式也是用這種方法
--------------------------------------------------------------------------------
使用 TextBox 顯示文字檔內容,通常對應設計的程式片段是
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
While Not EOF(1) '未到檔案尾端
Line Input #1, a$ '逐行讀取
txtContent.Text = txtContent.Text & a$ & vbCrLf '逐行加入txtContent及換行符號
Wend '反覆執行
Close #1 '關閉檔案
若是將 TextBox(txtContent) 顯示內容 的處理敘述略作變更,將可加快處理速度
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
While Not EOF(1) '未到檔案尾端
Line Input #1, a$ '逐行讀取
txtContent.SelText = a$ & vbCrLf '逐行加入txtContent及換行符號
Wend '反覆執行
Close #1 '關閉檔案
其中的道理是:
因為 txtContent.Text = txtContent.Text & a$ & vbCrLf 會安排一個記憶體位置儲存等式右側的運算結果,再清除 txtContent 原有內容,以此一運算結果取代之,其間包含許多的動作;而 txtContent.SelText = a$ & vbCrLf 是直接把右側的運算結果放入 txtContent 裡,少了很多不必要的的動作,所以比較快。
此外,以單一敘述一次讀入整個檔案更可加快完成
txtContent.Text = "" '清除內容
Open sFile$ For Input As #1 '開啟文字檔
txtContent.Text = StrConv(InputB(LOF(F), #1), vbUnicode) '一次讀入整個檔案
Close #1 '關閉檔案
2009年9月17日 星期四
2009年9月14日 星期一
treeview參考資料
这里我要向您推荐一组高级的ActiveX控件—Common家族。这一家子共有八个兄弟。他们习性相似,却各有不同的本领。利用他们可以为您的应用程序添加漂亮的界面,强大实用的功能。比如,带有图标的快捷工具条、进度指示器等。而这并不复杂,您只需看完下文,一切立即搞定。
一、图像资料中心----ImageList
ImageList控件是一个向其它控件提供图像的资料中心,它包含了一组ListImage对象即一组图像的集合,该集合中的每个对象都可以通过其索引或关键字被其他控件所引用,但控件本身并不能单独使用。
ImageList控件可以和任何具有Picture属性的控件一起使用,如PictureBox、ListView、ToolBar、TabStrip和TreeView等控件。
ImageList控件的主要属性有ImageHeight属性,ImageWidth属性,MaskColor属性和UseMaskColor属性。
ImageHeight属性和ImageWidth属性
这两个属性返回或设置ImageList控件中ListImage对象的高度和宽度。可以在添加第一个ListImage对象之前预先设置ImageHeight和ImageWidth属性。如果没有预先设置,则第一个添加到集合中的ListImage对象保持原图大小,其后添加的所有ListImage对象都被强制与第一个ListImage对象大小相同。
MaskColor属性
该属性返回或设置在ImageList控件的图形操作中透明的颜色。具体地讲,就是设置一种颜色,使ImageList控件的图形中的此种颜色变为透明。
UseMaskColor属性
该属性决定是否能在ImageList控件中使用MaskColor属性。
Add方法
要给ImageList控件添加图像,在设计时,可以用“ImageList控件属性”对话框图1;在运行时,可以用Add方法。
Add方法的语法如下:
Add(index,key,picture)
Index是可选的参数。它是一个整数,指定了要插入的ListImage对象的位置。如果没有指定index,ListImage对象将被添加到ListImages集合的末尾。
Key也是可选的参数。它是用来标识ListImage对象的唯一字符串。ImageList控件用该值来检索某个特定的ListImage对象。
Picture是必需的参数。它指定了欲添加到集合中的图片。
Add方法的具体用法如下例:
Dim imgX As ListImage
Set imgX=ImageList1.ListImages.Add_
(,,LoadPicture("filename"))
Set imgX=ImageList1.ListImages.Add(,,Picture1.Picture)
Overlay方法
除了存储Picture对象外,ImageList控件还可以在把图像赋值给其它控件前,对它们执行图形操作。例如,Overlay方法可以从两个不同的图像出发创建一个复合图像。该方法从一个ListImages集合绘制一幅图像,叠加在另一幅上面,并返回结果。它的语法如下:
Overlay(index1,index2)
index1参数是必需的。它是一个整数(Index属性)或唯一的字符串(Key属性),指定了将被叠加的图像。
index2参数也是必需的。它指定了将被绘制在由index1指定的对象上的图像。该图像中与MaskColor属性相匹配的颜色被设置成透明的。如果没有任何颜色与之匹配,该图像将不透明地绘制在其它图像上。
下面,我们介绍一个具体的例子。
先在窗体上放置一个ImageList控件和一个Image框,然后添加如下代码:
Private Sub Form_Load()
Dim imgX As ListImage
'加载位图
SetimgX=ImageList1.ListImages.Add(,"No",_
LoadPicture("graphics\bitmaps\assorted\Intl_No.bmp"))
SetimgX=ImageList1.ListImages.Add(,,_LoadPicture("graphics\bitmaps\assorted\smokes.bmp"))
SetimgX=ImageList1.ListImages.Add(,,_LoadPicture("graphics\bitmaps\assorted\beany.bmp"))
ScaleMode=vbPixels
'设置MaskColor属性
ImageList1.MaskColor=vbGreen
'设置窗体的BackColor为白色
Form1.BackColor=vbWhite
End Sub
Private Sub Form_Click()
'静态变量,用于图像计数。
Static int Count As Integer
'如果变量超过ListImages.Count的值则重置变量为2
If intCount>ImageList1.ListImages.Count
Or intCount<1 Then
intCount=2
End If
'把ListImage(1)叠加在ListImages2-3之上
Image1.Picture=ImageList1.Overlay(intCount,1)
intCount=intCount+1
'创建变量来保存ImageList.ImageWidth的值
Dim intW
intW=ImageList1.ImageWidth
'为了引用方便把图像绘制到窗体上,
'用ImageWidth值来间隔图像
ImageList1.ListImages(1).DrawForm1.hDC,0,0,imlNormal
ImageList1.ListImages(2).DrawForm1.hDC,0,intW,imlNormal
ImageList1.ListImages(3).DrawForm1.hDC,0,intW*2,imlNormal
End Sub
在本例中,图片Intl_No.bmp的背景色原来是绿色,由于MaskColor也设置为绿色,所以图片的背景色变为了透明。
为了节约系统资源,可以把一个或多个ImageList控件与其它的Windows95公共控件关联。这些公共控件包括ListView、ToolBar、TabStrip和TreeView控件。为了关联在一起,对于ListView控件来说,必须将Icons和SmallIcons属性设置为ImageList控件;对于TreeView、TabStrip和Toolbar控件来说,必须将ImageList属性设置为ImageList控件。
一旦ImageList与某个控件相关联,就可以在过程中用Index属性或Key属性的值来引用ListImage对象了。
二、多彩工具条----Toolbar
在大多数应用程序中都有工具栏。工具栏包含有一些按钮,这些按钮与应用程序菜单中各项的按钮对应,为用户访问应用程序的最常用功能和命令提供了图形界面。在VB5.0中,可以用Toolbar控件来实现这一功能。
Toolbar控件包含一个按钮(Button对象)集合,可以通过将Button对象添加到Buttons集合中的方法来创建工具栏。在设计时可用Toolbar控件的属性页中的“按钮”选项卡上的“插入按钮”和“删除按钮”来插入和删除按钮,并设置按钮的索引、标题、关键字、样式、标记、工具提示文本和图像属性;当然,也可以在运行时用语句指定这些属性。
样式(Style)属性
该属性决定Toolbar控件中每个按钮的外观和状态。
使用时请注意必须将具有ButtonGroup样式的按钮分组。为区分组,应该将所有具有相同样式(ButtonGroup)的Button对象放置在两个有分隔符样式的Button对象之间。
Button对象为占位符样式时,可以将其它的控件放置在工具栏上。例如,为了在设计时将下拉组合框放在工具栏上,可添加一个具有占位符样式的Button对象,并把它调整到ComboBox控件的大小。然后将ComboBox放置在占位符处。
每个Button对象都可有文本或图像,或者兼而有之。图像是由相关联的ImageList控件提供的,可以用Image属性为每个Button对象添加一幅图像;文本则是通过设置每个按钮的Caption属性来显示的。
ImageList属性
该属性返回或设置与控件相关的ImageList控件。控件要使用该属性,必须先将ImageList控件放在窗体上,然后在设计时可在相关控件的“属性页”对话框中设置ImageList属性。在运行时可以用以下语句来设置:
Set ToolBar1.ImageList=ImageList1
ShowTips属性
该属性决定是否允许显示每个按钮的帮助提示。
Wrappable属性
该属性决定当重新设置窗口的大小时,Toolbar控件按钮是否自动换行。
Customize方法
该方法调用“自定义工具栏”对话框,该对话框允许用户在Toolbar控件上重新安排或隐藏Button对象。
当Toolbar控件的AllowCustomize属性为True时,双击工具栏后就会调用Customize方法显示出对话框。
我们可以限制用户自定义工具栏的权限。例如,下列代码仅在用户给出密码字时才允许自定义工具栏:
Private Sub Command1_Click()
If InputBox("Password:")="WYT" Then
Toolbar1.Customize
'调用Customize方法。
End If
End Sub
SaveToolbar方法和RestoreToolbar方法
这两个方法的作用分别是把用Toolbar控件创建的工具栏的状态保存在注册表中和将工具栏恢复到原先保存的状态。它们的语法为:
Toolbar1.SaveToolbar(keyAsString,subkeyAsString,valueAsString)
Toolbar1.RestoreToolbar(keyAsString,subkeyAsString,valueAsString)
这三个参数都是必选参数。其中key是一个字符串表达式,指定了保存的信息在注册表中的关键字;subkey也是一个字符串表达式,指定了在注册表中key参数下的一个子键;value同样是一个字符串表达式,指定了保存在subkey中的Toolbar信息。
下列代码将Toolbar1的状态信息保存在HKEY_USERS\.DEFAULT关键字下的WYT子关键字中:
Toolbar1.SaveToolbar"","WYT","Toolbar1"
如果指定的子关键字不存在,该语句将在注册表中创建新的子关键字。因为在自定义工具栏之后要发生Toolbar控件的Change事件,所以在大多数情况下,可将上述代码放置在工具栏的Change事件中。
下列代码为当前用户恢复Toolbar控件的设置值,不过要确定先前已经用SaveToolbar方法将它们保存起来了。
Toolbar1.RestoreToolbar"","WYT","Toolbar1"
注意当使用RestoreToolbar方法时,任何不包含ImageListListImage对象的工具栏按钮都将消失。用户可再次使用自定义工具栏对话框上的复位按钮使它们可见。
为了在运行时添加和删除按钮,可以用Add方法,Clear方法和Remove方法。
Add方法
该方法将Button对象添加到Buttons集合中,并返回对新创建对象的引用。
下面给出一个简单的程序代码,具体介绍一下如何在运行中添加按钮和图像以及对Click事件作出反应。
Private SubForm1_Load()
'为ImageList创建对象变量
Dim imgX As ListImage
'将图片加载到ImageList控件中
Set imgX=ImageList1.ListImages.Add(,"open",_
LoadPicture("Graphics\bitmaps\tlbr_w95\open.bmp"))
Set imgX=ImageList1.ListImages.Add(,"save",_LoadPicture("Graphics\bitmaps\tlbr_w95\save.bmp"))
Toolbar1.ImageList=ImageList1
'为Button创建对象变量
Dim btnX As Button
'以下代码是用Add方法将按钮对象添加到Buttons集合中。创建每个按钮后,设置Description和
ToolTipText属性。
Toolbar1.Buttons.Add,,,tbrSeparator
Set btnX=Toolbar1.Buttons.Add_(,"open",,tbrDefault,"open")
btnX.ToolTipText="OpenFile"
btnX.Description=btnX.ToolTipText
Set btnX=Toolbar1.Buttons.Add_(,"save",,tbrDefault,"save")
btnX.ToolTipText="SaveFile"
btnX.Description=btnX.ToolTipText
Set btnX=Toolbar1.Buttons.Add(,,,tbrSeparator)
End Sub
Private Sub toolbar1_ButtonClick(ByValButton As Button)
'用Key属性和SelectCase语句来指定一个动作。
Select Case Button.Key
Case Is="open"'打开文件。
MsgBox"Addcodetoopenfilehere!"
Case Is="save"'保存文件。
MsgBox"Addcodetosavefilehere!"
End Select
End Sub
三、精美卡片盒---Tabsterip
TabStrip控件象笔记本的书签或者一组文件夹的标签,通过使用TabStrip控件,可以在应用程序中为某个窗口或者对话框的相同区域定义多个页面,如图。其具体使用方法与Toolbar控件相似,限于篇幅,在这里就不再多说了。
四、实时状态条----StatusBar
StatusBar控件代表性地显示有关在窗体上查看的对象、对象组件的信息或关系到对象操作的上下文的信息。StatusBar控件与其它控件如Toolbar控件一起,提供建立界面的工具,该界面既经济又含有丰富的信息。
StatusBar控件提供了一个窗体,通过这一窗体,应用程序能显示各种状态数据。每个窗体由窗格(Panel对象)组成,每一个Panel对象能包含文本或图片。StatusBar最多能被分成16个Panel对象,这些对象组成Panels集合。
在设计时,可以通过StatusBar控件的属性页的“窗格”选项卡来添加和删除窗格并设置每个窗格的各种属性。在这里,我们对其中比较重要的属性作一些介绍。
斜面(Belvel)属性
该属性返回或设置窗格的斜面样式。
自动调整大小(AutoSize)属性
该属性在调整了StatusBar控件的大小以后,返回或设置窗格对象宽度的值。
含有目录样式的窗格优先于含有弹回样式的窗格。这就意味着如果含有目录样式的窗格需要空间,则将缩短弹回样式的窗格。
宽度(Width)属性和最小宽度(MinWidth)属性
宽度属性返回或设置窗格的当前宽度,最小宽度属性则返回或设置窗格的最小宽度。当AutoSize属性被设置为目录或弹回时,使用MinWidth属性可以防止面板因自动调整大小被调整到太小的宽度。当AutoSize属性被设置为None时,MinWidth属性总是被设定为与Width属性相同的值。
下例用StatusBar控件的缺省面板显示当前时间。设置MinWidth属性以便在单击面板时清除时间但保留面板的大小不变。
Private Sub Form_Load()
StatusBar1.Panels(1).AutoSize=sbrContents
StatusBar1.Panels(1).Text="NowTimeis:"&Str(Time)
StatusBar1.Panels(1).MinWidth=StatusBar1.Panels(1).Width
'将最小宽度设置为面板的当前大小。
End Sub
Private Sub StatusBar1_PanelClick(ByValPanel As ComctlLib.Panel)
'清除时间但保持大小在最小宽度。
Panel.Text="NowTimeis:"
End Sub
StatusBar控件的重要属性有Style属性和SimpleText属性。
Style属性
该属性返回或设置StatusBar控件的样式。当它为sbrNormal时,StatusBar控件显示所有的Panel对象;当它为sbrSimple时,控件仅显示一个大面板。当设置Style属性为sbrSimple时,用SimpleText属性设置要显示的字符串的文本。
注意当设置Style属性为Simple时,StatusBar控件显示大面板(控件的宽度),该面板不能通过面板集合来控制。
SimpleText属性
该属性是当StatusBar控件的Style属性为Simple时,返回或设置显示文本。
为了在运行中添加和删除窗格,可以用Add方法,Clear方法和Remove方法。其中Clear方法和Remove方法与前面讲的控件一样,这里不再赘述。(图5)
Add方法
该方法将Panel对象添加到Panels集合中并返回对新建立的Panel对象的引用。它的语法如下:
StatusBar1.Add(index,key,text,style,picture)
下面的代码将两个Panel对象添加到具有Normal样式的StatusBar控件中,然后添加字符串(用SimpleText属性),该字符串在设置Style属性为Simple时才出现。该控件在Simple和Normal样式之间切换。
Private Sub Form_Load()
Dim I As Integer
For I=1 to 2
StatusBar1.Panels.Add
'添加两个Panel对象。
Next I
With StatusBar1.Panels.Item(1).Style=sbrNum'Number锁定.Item(2).Style=sbrCaps'Caps锁定
.Item(3).Style=sbrScrl'Scroll锁定
End With
End Sub
Private Sub StatusBar1_Click()
'在简单和正常样式之间切换。
With StatusBar1
If .Style=0 Then
'当StatusBar是用Simple样式时,显示该文本。
.SimpleText="DateandTime:"&Now.Style=sbrSimple'Simple样式。
Else
.Style=sbrNormal'Normal样式。
End If
End With
End Sub
五、资源管理树---TreeView
TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成。TreeView一般用于显示文档标题、索引入口、磁盘上的文件和目录或能被有效地分层显示的其它各种信息。类似于Win95的资源管理器的界面就可以用该控件来实现。
在设计时可以通过TreeView控件的属性页来指定控件的部分属性。在TreeView控件的属性中,比较重要的有如下属性:
样式(Style)属性
该属性返回或设置Node对象的图形类型(图像、文本、+/-号、直线)以及出现在TreeView控件中每一Node对象上的文本类型。
行样式(LineStyle)属性
这个属性返回或设置在Node对象之间显示的线的样式。
注意:若Style属性设置为包含直线的值,则LineStyle属性就确定了直线的外观。如果Style属性设置为不含直线的值,则LineStyle属性将被忽略。
Sort属性
该属性返回或设置一布尔值,此值确定Node对象的子节点和TreeView控件的根层节点是否按字母顺序排序。
Sorted属性有两种用法:第一,在TreeView控件的根(顶)层排列Node对象;第二,对任何单个Node对象的立即子节点(即第一层子接点)排序。例如,下面的代码是对TreeView控件的根节点排序:
TreeView1.Sorted=True。而代码Node1.Sorted=True则是对当前选中的Node对象的立即子节点排序。
注意:当设置Sorted属性为True时,仅对当前Nodes集合排序;在TreeView控件中添加新的Node对象时,必须再次设置Sorted属性为True,以便对添加的Node对象排序。
FullPath属性
这个属性返回在TreeView控件中引用的Node对象的完整限定路径。通常完整限定路径是引用的Node对象的Text属性中的文本与它的所有前辈的Text属性值的连接。
Root、Parent、Child、FirstSibling、LastSibling、Previous和Next属性
这些属性分别返回对Node对象的根节点,父节点,子节点,同层的第一个节点和最后一个节点,同层的前一个相邻节点和后一个相邻节点的引用。
同前面所讲的控件一样,TreeView控件也使用由ImageList属性指定的ImageList控件,来存储显示于Node对象的位图和图标。任何时刻,TreeView控件只能使用一个ImageList。这意味着,当TreeView控件的Style属性被设置成显示图像的样式时,TreeView控件中每一项的旁边都有一个同样大小的图像。为了使被选中的Node对象显示不同的图像,需要使用SelectedImage属性。
SelectedImage属性
该属性返回或设置当Node对象被选中时显示的图像。如果它为Null,则使用由ImageList属性指定的图像的屏蔽图像。
TreeView控件与前几个控件一样,用Add方法,Clear方法和Remove方法来添加Node对象,但它不能在设计时利用属性页来进行添加和删除。
TreeView控件的Clear方法和Remove方法与前面所讲的控件基本一致,这里主要讲Add方法。
Add方法
该方法在TreeView控件的Nodes集合中添加一个Node对象,语法如下:
TreeView1.Add(relative,relationship,key,text,
image,selectedimage)
在这些参数中,只有text参数是必需的,其它的参数都是可选的。relative参数是已存在的Node对象的索引号或键值。Relationship指定了Node对象的相对位置,如后表所述。Key是唯一的字符串,可用于检索Node对象。Text是在Node中出现的字符串。Image是在关联的ImageList控件中的图像的索引。Selectedimage是在关联的ImageList控件中的图像的索引,在Node被选中时显示。
CreateDragImage方法
这个方法使用Node对象的关联图像的抖动形式来创建拖动图像。这种图像一般用于拖放操作。该方法一般用于在拖放操作开始时给DragIcon属性赋值一个图像(图6)。
EnsureVisible方法
这个方法确保指定的ListItem或Node对象是可视的。如果需要,这个方法可展开Node对象并滚动TreeView控件下列代码创建一棵树,并可以演示拖动操作(由于篇幅所限,这段代码并未真正实现拖动)。
Dim indrag As Boolean
'指示拖放操作的标志。
Dim nodX As Object
'被拖动的项。
Private Sub Form_Load()
'在Imagelist控件中加载一个位图。
Dim imgX As ListImage
Dim BitmapPath As String
BitmapPath="graphics\icons\mail\mail01a.ico"
Set imgX=ImageList1.ListImages.Add_
(,,LoadPicture(BitmapPath))
'初始化TreeView控件并创建几个节点。
TreeView1.ImageList=ImageList1
Dim nodX As Node'创建一棵树。
Set nodX=TreeView1.Nodes.Add(,,,"Parent1",1)
Set nodX=TreeView1.Nodes.Add(,,,"Parent2",1)
Set nodX=TreeView1.Nodes.Add(1,tvwChild,,
"Child1",1)
Set nodX=TreeView1.Nodes.Add(1,tvwChild,,"Child2",1)
Set nodX=TreeView1.Nodes.Add(2,tvwChild,,"Child3",1)
Set nodX=TreeView1.Nodes.Add(2,tvwChild,,"Child4",1)
Set nodX=TreeView1.Nodes.Add(3,tvwChild,,"Child5",1)
nodX.EnsureVisible'展开树显示全部节点。
End Sub
Private Sub TreeView1_MouseDown_
(Button As Integer,Shift As Integer,x As Single,y As Single)
Set nodX=TreeView1.SelectedItem
'设置要拖动的项。
End Sub
Private Sub TreeView1_MouseMove(Button As Integer,
Shift As Integer,x As Single,y As Single)
If Button=vbLeftButton Then
'指示拖动操作。
indrag=True
'设置标志为true。
'用CreateDragImage方法设置拖动图标。
TreeView1.DragIcon=TreeView1.SelectedItem.CreateDragImage
TreeView1.DragvbBeginDrag'拖动操作。
End If
End Sub
六、图片式文件夹---ListView
ListView控件比前面几种控件要复杂一些,通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。(图7)
ColumnHeader对象是ListView控件中包含标头文字的项目。利用ColumnHeader对象,用户可以:
▲单击对象触发ColumnClick事件并根据数据项目将项目排序。
▲拖动对象的右边框来调整列宽度。
▲在报表视图中隐藏ColumnHeader对象。
ColumnHeader对象的数目决定每个ListItem对象可包含的子项目数目。删除ColumnHeader对象后所有与列关联的子项目也将被删除,并且每个ListItem对象的子项目数组将平移以更新ColumnHeader的索引,而这将导致剩余的列标头SubItemIndex属性的改变。
ColumnHeader对象的SubItemIndex属性
该属性返回与ListView控件中ColumnHeader对象关联的子项目的索引。子项目是字符串数组,代表显示在报表视图中的ListItem对象的数据。第一列的列标头SubItemIndex属性设置为0,这是因为小图标和ListItem对象的文字总出现在第一列中,而且它们被当作ListItem对象而不是子项目。列标头数目取决于子项目数目。列标头数目总是比子项目数目多1。
在设计时可以利用属性页的“列首”选项卡将ColumnHeader对象添加到ListView控件中,在运行时则用Add方法添加。
ColumnHeader对象的Add方法
该方法的使用与前面那些控件基本相似,就不再介绍了。
ListView1.ColumnHeader.Add(index,key,text,width,alignment)
ListItem对象是指控件中的一行(不包含标头行)的所有内容。它也可包含文本和图片,但是要使用图片则必须通过Icons和SmallIcons属性引用ImageList控件。
ListItem对象的SubItems属性
返回或设置一个字符串(子项目)数组,它代表ListView控件中ListItem对象的数据。
ListItem对象可包含任意多个的关联项目数据字符串(子项目),但每个ListItem对象子项目数目必须相同。每个子项目都对应于相关的列标头,无法直接向子项目数组添加元素,只有通过ColumnHeaders的Add方法添加列标头的方法来添加子项目。
ListItem对象的Add方法
该方法添加ListItem对象到ListView控件的ListItems集合中并返回对新创建对象的引用。
它的语法如下:
ListItem1.Add(index,key,text,icon,smallIcon)
ListView控件的View属性
ListView控件可使用四种不同视图显示项目,这可以用View属性来确定。该属性返回或设置ListView控件中ListItem对象的外观。
ListView控件的SortOrder,SortKey和Sorted属性
控件中的ListItem对象可以按要求进行排序,与排序有关的属性是SortOrder,Sorted和SortKey属性。
SortOrder属性返回或设置一个值,此值决定ListView控件中的ListItem对象以升序或降序排序。
SortKey属性返回或设置一个值,此值决定ListView控件中的ListItem对象如何排序。
Sorted属性返回或设置确定ListView控件中的ListItem对象是否排序的值。
下面的代码说明了如何创建ColumnHeaders和ListItem对象,SubItemIndex和SubItem属性的使用方法以及如何排序。
Private Sub Form_load()
'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport
'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"
ListView1.ColumnHeaders.Add,"Sex","性别"
ListView1.ColumnHeaders.Add,"Age","年龄"
'向控件添加ListItem对象。
Dim itmX As ListItem
'添加column1的名称。
Set itmX=ListView1.ListItems.Add(1,"ZL","张力")
'使用SubItemIndex将SubItem与正确的ColumnHeader关联。使用关键字("Sex")指定正确的ColumnHeader。
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
'使用ColumnHeader关键字将SubItems字符串与
'正确的ColumnHeader关联。
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="19"
Set itmX=ListView1.ListItems.Add(1,"LF","李芳")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"
Set itmX=ListView1.ListItems.Add(1,"WW","王伟")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader)
Select Case ColumnHeader.Key
Case "Sex":ListView1.SortKey=1
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
Case "Age":ListView1.SortKey=2
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
End Select
End Sub
七、带刻度滑块---Slider
Slider控件是一个包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块来选择一个值。
在选择离散数值或某个范围内的一组连续数值时,Slider控件十分有用。例如,无需键入数字,通过将滑块移动到刻度标记处,可以用Slider控件来输入数值。
Silder控件的大多数基本属性比较简单,我们这里重点介绍一些较有用而又常易忽略的属性。
TickStyle属性
该属性返回或设置Slider控件上显示的刻度标记的样式。
SelectRange,SelStart和SelLength属性
Slider控件可以选择某个范围内的数值,这就要用到SelectRange,SelStart和SelLength属性。
SelectRange属性决定Slider控件是否可以选择一个范围。如果SelectRange属性为True,SelStart为选定范围的起始值,SelLength为选定范围的长度。
如果SelectRange属性为False,则SelStart属性的设置值与Value属性的设置值相同,SelLength属性无效。
下列代码允许在按住SHIFT键时,用鼠标拖动或单击Slider控件以选择一个范围。
Private Sub Form_Load()
'设置slider控件的设置值
Slider1.Max=20
End Sub
Private Sub Slider1_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single)
If Shift=1 Then '如果按住Shift键,则Slider1.SelectRange=True '打开SelectRange。
Slider1.SelStart=Slider1.Value'设置SelStart数值
Slider1.SelLength=0'设置先前的SelLength(如存在)为0。
End If
End Sub
Private Sub Slider1_MouseUp(Button As Integer,Shift As Integer,x As Single,y As Single)
if Shift=1 Then
'如果在一点决定返回上一步,将发生错误。
On Error Resume Next
'否则使用SelStart和当前数值设置SelLength。
Slider1.SelLength=Slider1.Value-Slider1.SelStart
Else
Slider1.SelectRange=False'如果松开SHIFT键。
End If
End Sub
在程序中,常用Slider控件来代替键盘输入数字,如下面的例子。
该例通过Slider控件来显示不同的长度。
Private Sub Form_Load()
Slider1.Min=0
Slider1.Max=50
Slider1.SmallChange=1
Slider1.LargeChange=10
Slider1.TickFrequency=5
End Sub
Private Sub Slider1_Change()
Label1.Caption="长度是"&Format(Slider1.Value/5,"#.00")&"厘米"
End Sub
八、ProgressBar控件
最后,我们来看一下ProgressBar。在应用程序中,当进行一个较长的操作比如安装或载入程序 时,通常会用一个进度指示器来表示进度。在VB中,这个工作可以由ProgressBar控件来完成。ProgressBar控件通过从左到右用一些方块填充矩形来表示一个较长操作的进度。
在运行时,ProgressBar控件监视着操作完成的进度。控件有一个行程和一个当前位置。行程代表该操作的整个持续时间。当前位置则代表应用程序在完成该操作过程时的进度。其使用方法与Slider控件相似。
好了,到这里我们把Common家族都介绍完了,各位VB同道,若您把他们兄弟几个调教好了,保管您的应用程序界面具有专业水准。如果您在工具箱里找不到他们的话,可以用右键单击工具箱,选择“部件”,然后选中MicrosoftWindowsCommonControls5.0,最后单击“确定”就行了。
引用自http://www.mypcera.com/softxue/vb/new/m57.htm
一、图像资料中心----ImageList
ImageList控件是一个向其它控件提供图像的资料中心,它包含了一组ListImage对象即一组图像的集合,该集合中的每个对象都可以通过其索引或关键字被其他控件所引用,但控件本身并不能单独使用。
ImageList控件可以和任何具有Picture属性的控件一起使用,如PictureBox、ListView、ToolBar、TabStrip和TreeView等控件。
ImageList控件的主要属性有ImageHeight属性,ImageWidth属性,MaskColor属性和UseMaskColor属性。
ImageHeight属性和ImageWidth属性
这两个属性返回或设置ImageList控件中ListImage对象的高度和宽度。可以在添加第一个ListImage对象之前预先设置ImageHeight和ImageWidth属性。如果没有预先设置,则第一个添加到集合中的ListImage对象保持原图大小,其后添加的所有ListImage对象都被强制与第一个ListImage对象大小相同。
MaskColor属性
该属性返回或设置在ImageList控件的图形操作中透明的颜色。具体地讲,就是设置一种颜色,使ImageList控件的图形中的此种颜色变为透明。
UseMaskColor属性
该属性决定是否能在ImageList控件中使用MaskColor属性。
Add方法
要给ImageList控件添加图像,在设计时,可以用“ImageList控件属性”对话框图1;在运行时,可以用Add方法。
Add方法的语法如下:
Add(index,key,picture)
Index是可选的参数。它是一个整数,指定了要插入的ListImage对象的位置。如果没有指定index,ListImage对象将被添加到ListImages集合的末尾。
Key也是可选的参数。它是用来标识ListImage对象的唯一字符串。ImageList控件用该值来检索某个特定的ListImage对象。
Picture是必需的参数。它指定了欲添加到集合中的图片。
Add方法的具体用法如下例:
Dim imgX As ListImage
Set imgX=ImageList1.ListImages.Add_
(,,LoadPicture("filename"))
Set imgX=ImageList1.ListImages.Add(,,Picture1.Picture)
Overlay方法
除了存储Picture对象外,ImageList控件还可以在把图像赋值给其它控件前,对它们执行图形操作。例如,Overlay方法可以从两个不同的图像出发创建一个复合图像。该方法从一个ListImages集合绘制一幅图像,叠加在另一幅上面,并返回结果。它的语法如下:
Overlay(index1,index2)
index1参数是必需的。它是一个整数(Index属性)或唯一的字符串(Key属性),指定了将被叠加的图像。
index2参数也是必需的。它指定了将被绘制在由index1指定的对象上的图像。该图像中与MaskColor属性相匹配的颜色被设置成透明的。如果没有任何颜色与之匹配,该图像将不透明地绘制在其它图像上。
下面,我们介绍一个具体的例子。
先在窗体上放置一个ImageList控件和一个Image框,然后添加如下代码:
Private Sub Form_Load()
Dim imgX As ListImage
'加载位图
SetimgX=ImageList1.ListImages.Add(,"No",_
LoadPicture("graphics\bitmaps\assorted\Intl_No.bmp"))
SetimgX=ImageList1.ListImages.Add(,,_LoadPicture("graphics\bitmaps\assorted\smokes.bmp"))
SetimgX=ImageList1.ListImages.Add(,,_LoadPicture("graphics\bitmaps\assorted\beany.bmp"))
ScaleMode=vbPixels
'设置MaskColor属性
ImageList1.MaskColor=vbGreen
'设置窗体的BackColor为白色
Form1.BackColor=vbWhite
End Sub
Private Sub Form_Click()
'静态变量,用于图像计数。
Static int Count As Integer
'如果变量超过ListImages.Count的值则重置变量为2
If intCount>ImageList1.ListImages.Count
Or intCount<1 Then
intCount=2
End If
'把ListImage(1)叠加在ListImages2-3之上
Image1.Picture=ImageList1.Overlay(intCount,1)
intCount=intCount+1
'创建变量来保存ImageList.ImageWidth的值
Dim intW
intW=ImageList1.ImageWidth
'为了引用方便把图像绘制到窗体上,
'用ImageWidth值来间隔图像
ImageList1.ListImages(1).DrawForm1.hDC,0,0,imlNormal
ImageList1.ListImages(2).DrawForm1.hDC,0,intW,imlNormal
ImageList1.ListImages(3).DrawForm1.hDC,0,intW*2,imlNormal
End Sub
在本例中,图片Intl_No.bmp的背景色原来是绿色,由于MaskColor也设置为绿色,所以图片的背景色变为了透明。
为了节约系统资源,可以把一个或多个ImageList控件与其它的Windows95公共控件关联。这些公共控件包括ListView、ToolBar、TabStrip和TreeView控件。为了关联在一起,对于ListView控件来说,必须将Icons和SmallIcons属性设置为ImageList控件;对于TreeView、TabStrip和Toolbar控件来说,必须将ImageList属性设置为ImageList控件。
一旦ImageList与某个控件相关联,就可以在过程中用Index属性或Key属性的值来引用ListImage对象了。
二、多彩工具条----Toolbar
在大多数应用程序中都有工具栏。工具栏包含有一些按钮,这些按钮与应用程序菜单中各项的按钮对应,为用户访问应用程序的最常用功能和命令提供了图形界面。在VB5.0中,可以用Toolbar控件来实现这一功能。
Toolbar控件包含一个按钮(Button对象)集合,可以通过将Button对象添加到Buttons集合中的方法来创建工具栏。在设计时可用Toolbar控件的属性页中的“按钮”选项卡上的“插入按钮”和“删除按钮”来插入和删除按钮,并设置按钮的索引、标题、关键字、样式、标记、工具提示文本和图像属性;当然,也可以在运行时用语句指定这些属性。
样式(Style)属性
该属性决定Toolbar控件中每个按钮的外观和状态。
使用时请注意必须将具有ButtonGroup样式的按钮分组。为区分组,应该将所有具有相同样式(ButtonGroup)的Button对象放置在两个有分隔符样式的Button对象之间。
Button对象为占位符样式时,可以将其它的控件放置在工具栏上。例如,为了在设计时将下拉组合框放在工具栏上,可添加一个具有占位符样式的Button对象,并把它调整到ComboBox控件的大小。然后将ComboBox放置在占位符处。
每个Button对象都可有文本或图像,或者兼而有之。图像是由相关联的ImageList控件提供的,可以用Image属性为每个Button对象添加一幅图像;文本则是通过设置每个按钮的Caption属性来显示的。
ImageList属性
该属性返回或设置与控件相关的ImageList控件。控件要使用该属性,必须先将ImageList控件放在窗体上,然后在设计时可在相关控件的“属性页”对话框中设置ImageList属性。在运行时可以用以下语句来设置:
Set ToolBar1.ImageList=ImageList1
ShowTips属性
该属性决定是否允许显示每个按钮的帮助提示。
Wrappable属性
该属性决定当重新设置窗口的大小时,Toolbar控件按钮是否自动换行。
Customize方法
该方法调用“自定义工具栏”对话框,该对话框允许用户在Toolbar控件上重新安排或隐藏Button对象。
当Toolbar控件的AllowCustomize属性为True时,双击工具栏后就会调用Customize方法显示出对话框。
我们可以限制用户自定义工具栏的权限。例如,下列代码仅在用户给出密码字时才允许自定义工具栏:
Private Sub Command1_Click()
If InputBox("Password:")="WYT" Then
Toolbar1.Customize
'调用Customize方法。
End If
End Sub
SaveToolbar方法和RestoreToolbar方法
这两个方法的作用分别是把用Toolbar控件创建的工具栏的状态保存在注册表中和将工具栏恢复到原先保存的状态。它们的语法为:
Toolbar1.SaveToolbar(keyAsString,subkeyAsString,valueAsString)
Toolbar1.RestoreToolbar(keyAsString,subkeyAsString,valueAsString)
这三个参数都是必选参数。其中key是一个字符串表达式,指定了保存的信息在注册表中的关键字;subkey也是一个字符串表达式,指定了在注册表中key参数下的一个子键;value同样是一个字符串表达式,指定了保存在subkey中的Toolbar信息。
下列代码将Toolbar1的状态信息保存在HKEY_USERS\.DEFAULT关键字下的WYT子关键字中:
Toolbar1.SaveToolbar"","WYT","Toolbar1"
如果指定的子关键字不存在,该语句将在注册表中创建新的子关键字。因为在自定义工具栏之后要发生Toolbar控件的Change事件,所以在大多数情况下,可将上述代码放置在工具栏的Change事件中。
下列代码为当前用户恢复Toolbar控件的设置值,不过要确定先前已经用SaveToolbar方法将它们保存起来了。
Toolbar1.RestoreToolbar"","WYT","Toolbar1"
注意当使用RestoreToolbar方法时,任何不包含ImageListListImage对象的工具栏按钮都将消失。用户可再次使用自定义工具栏对话框上的复位按钮使它们可见。
为了在运行时添加和删除按钮,可以用Add方法,Clear方法和Remove方法。
Add方法
该方法将Button对象添加到Buttons集合中,并返回对新创建对象的引用。
下面给出一个简单的程序代码,具体介绍一下如何在运行中添加按钮和图像以及对Click事件作出反应。
Private SubForm1_Load()
'为ImageList创建对象变量
Dim imgX As ListImage
'将图片加载到ImageList控件中
Set imgX=ImageList1.ListImages.Add(,"open",_
LoadPicture("Graphics\bitmaps\tlbr_w95\open.bmp"))
Set imgX=ImageList1.ListImages.Add(,"save",_LoadPicture("Graphics\bitmaps\tlbr_w95\save.bmp"))
Toolbar1.ImageList=ImageList1
'为Button创建对象变量
Dim btnX As Button
'以下代码是用Add方法将按钮对象添加到Buttons集合中。创建每个按钮后,设置Description和
ToolTipText属性。
Toolbar1.Buttons.Add,,,tbrSeparator
Set btnX=Toolbar1.Buttons.Add_(,"open",,tbrDefault,"open")
btnX.ToolTipText="OpenFile"
btnX.Description=btnX.ToolTipText
Set btnX=Toolbar1.Buttons.Add_(,"save",,tbrDefault,"save")
btnX.ToolTipText="SaveFile"
btnX.Description=btnX.ToolTipText
Set btnX=Toolbar1.Buttons.Add(,,,tbrSeparator)
End Sub
Private Sub toolbar1_ButtonClick(ByValButton As Button)
'用Key属性和SelectCase语句来指定一个动作。
Select Case Button.Key
Case Is="open"'打开文件。
MsgBox"Addcodetoopenfilehere!"
Case Is="save"'保存文件。
MsgBox"Addcodetosavefilehere!"
End Select
End Sub
三、精美卡片盒---Tabsterip
TabStrip控件象笔记本的书签或者一组文件夹的标签,通过使用TabStrip控件,可以在应用程序中为某个窗口或者对话框的相同区域定义多个页面,如图。其具体使用方法与Toolbar控件相似,限于篇幅,在这里就不再多说了。
四、实时状态条----StatusBar
StatusBar控件代表性地显示有关在窗体上查看的对象、对象组件的信息或关系到对象操作的上下文的信息。StatusBar控件与其它控件如Toolbar控件一起,提供建立界面的工具,该界面既经济又含有丰富的信息。
StatusBar控件提供了一个窗体,通过这一窗体,应用程序能显示各种状态数据。每个窗体由窗格(Panel对象)组成,每一个Panel对象能包含文本或图片。StatusBar最多能被分成16个Panel对象,这些对象组成Panels集合。
在设计时,可以通过StatusBar控件的属性页的“窗格”选项卡来添加和删除窗格并设置每个窗格的各种属性。在这里,我们对其中比较重要的属性作一些介绍。
斜面(Belvel)属性
该属性返回或设置窗格的斜面样式。
自动调整大小(AutoSize)属性
该属性在调整了StatusBar控件的大小以后,返回或设置窗格对象宽度的值。
含有目录样式的窗格优先于含有弹回样式的窗格。这就意味着如果含有目录样式的窗格需要空间,则将缩短弹回样式的窗格。
宽度(Width)属性和最小宽度(MinWidth)属性
宽度属性返回或设置窗格的当前宽度,最小宽度属性则返回或设置窗格的最小宽度。当AutoSize属性被设置为目录或弹回时,使用MinWidth属性可以防止面板因自动调整大小被调整到太小的宽度。当AutoSize属性被设置为None时,MinWidth属性总是被设定为与Width属性相同的值。
下例用StatusBar控件的缺省面板显示当前时间。设置MinWidth属性以便在单击面板时清除时间但保留面板的大小不变。
Private Sub Form_Load()
StatusBar1.Panels(1).AutoSize=sbrContents
StatusBar1.Panels(1).Text="NowTimeis:"&Str(Time)
StatusBar1.Panels(1).MinWidth=StatusBar1.Panels(1).Width
'将最小宽度设置为面板的当前大小。
End Sub
Private Sub StatusBar1_PanelClick(ByValPanel As ComctlLib.Panel)
'清除时间但保持大小在最小宽度。
Panel.Text="NowTimeis:"
End Sub
StatusBar控件的重要属性有Style属性和SimpleText属性。
Style属性
该属性返回或设置StatusBar控件的样式。当它为sbrNormal时,StatusBar控件显示所有的Panel对象;当它为sbrSimple时,控件仅显示一个大面板。当设置Style属性为sbrSimple时,用SimpleText属性设置要显示的字符串的文本。
注意当设置Style属性为Simple时,StatusBar控件显示大面板(控件的宽度),该面板不能通过面板集合来控制。
SimpleText属性
该属性是当StatusBar控件的Style属性为Simple时,返回或设置显示文本。
为了在运行中添加和删除窗格,可以用Add方法,Clear方法和Remove方法。其中Clear方法和Remove方法与前面讲的控件一样,这里不再赘述。(图5)
Add方法
该方法将Panel对象添加到Panels集合中并返回对新建立的Panel对象的引用。它的语法如下:
StatusBar1.Add(index,key,text,style,picture)
下面的代码将两个Panel对象添加到具有Normal样式的StatusBar控件中,然后添加字符串(用SimpleText属性),该字符串在设置Style属性为Simple时才出现。该控件在Simple和Normal样式之间切换。
Private Sub Form_Load()
Dim I As Integer
For I=1 to 2
StatusBar1.Panels.Add
'添加两个Panel对象。
Next I
With StatusBar1.Panels.Item(1).Style=sbrNum'Number锁定.Item(2).Style=sbrCaps'Caps锁定
.Item(3).Style=sbrScrl'Scroll锁定
End With
End Sub
Private Sub StatusBar1_Click()
'在简单和正常样式之间切换。
With StatusBar1
If .Style=0 Then
'当StatusBar是用Simple样式时,显示该文本。
.SimpleText="DateandTime:"&Now.Style=sbrSimple'Simple样式。
Else
.Style=sbrNormal'Normal样式。
End If
End With
End Sub
五、资源管理树---TreeView
TreeView控件显示Node对象的分层列表,每个Node对象均由一个标签和一个可选的位图组成。TreeView一般用于显示文档标题、索引入口、磁盘上的文件和目录或能被有效地分层显示的其它各种信息。类似于Win95的资源管理器的界面就可以用该控件来实现。
在设计时可以通过TreeView控件的属性页来指定控件的部分属性。在TreeView控件的属性中,比较重要的有如下属性:
样式(Style)属性
该属性返回或设置Node对象的图形类型(图像、文本、+/-号、直线)以及出现在TreeView控件中每一Node对象上的文本类型。
行样式(LineStyle)属性
这个属性返回或设置在Node对象之间显示的线的样式。
注意:若Style属性设置为包含直线的值,则LineStyle属性就确定了直线的外观。如果Style属性设置为不含直线的值,则LineStyle属性将被忽略。
Sort属性
该属性返回或设置一布尔值,此值确定Node对象的子节点和TreeView控件的根层节点是否按字母顺序排序。
Sorted属性有两种用法:第一,在TreeView控件的根(顶)层排列Node对象;第二,对任何单个Node对象的立即子节点(即第一层子接点)排序。例如,下面的代码是对TreeView控件的根节点排序:
TreeView1.Sorted=True。而代码Node1.Sorted=True则是对当前选中的Node对象的立即子节点排序。
注意:当设置Sorted属性为True时,仅对当前Nodes集合排序;在TreeView控件中添加新的Node对象时,必须再次设置Sorted属性为True,以便对添加的Node对象排序。
FullPath属性
这个属性返回在TreeView控件中引用的Node对象的完整限定路径。通常完整限定路径是引用的Node对象的Text属性中的文本与它的所有前辈的Text属性值的连接。
Root、Parent、Child、FirstSibling、LastSibling、Previous和Next属性
这些属性分别返回对Node对象的根节点,父节点,子节点,同层的第一个节点和最后一个节点,同层的前一个相邻节点和后一个相邻节点的引用。
同前面所讲的控件一样,TreeView控件也使用由ImageList属性指定的ImageList控件,来存储显示于Node对象的位图和图标。任何时刻,TreeView控件只能使用一个ImageList。这意味着,当TreeView控件的Style属性被设置成显示图像的样式时,TreeView控件中每一项的旁边都有一个同样大小的图像。为了使被选中的Node对象显示不同的图像,需要使用SelectedImage属性。
SelectedImage属性
该属性返回或设置当Node对象被选中时显示的图像。如果它为Null,则使用由ImageList属性指定的图像的屏蔽图像。
TreeView控件与前几个控件一样,用Add方法,Clear方法和Remove方法来添加Node对象,但它不能在设计时利用属性页来进行添加和删除。
TreeView控件的Clear方法和Remove方法与前面所讲的控件基本一致,这里主要讲Add方法。
Add方法
该方法在TreeView控件的Nodes集合中添加一个Node对象,语法如下:
TreeView1.Add(relative,relationship,key,text,
image,selectedimage)
在这些参数中,只有text参数是必需的,其它的参数都是可选的。relative参数是已存在的Node对象的索引号或键值。Relationship指定了Node对象的相对位置,如后表所述。Key是唯一的字符串,可用于检索Node对象。Text是在Node中出现的字符串。Image是在关联的ImageList控件中的图像的索引。Selectedimage是在关联的ImageList控件中的图像的索引,在Node被选中时显示。
CreateDragImage方法
这个方法使用Node对象的关联图像的抖动形式来创建拖动图像。这种图像一般用于拖放操作。该方法一般用于在拖放操作开始时给DragIcon属性赋值一个图像(图6)。
EnsureVisible方法
这个方法确保指定的ListItem或Node对象是可视的。如果需要,这个方法可展开Node对象并滚动TreeView控件下列代码创建一棵树,并可以演示拖动操作(由于篇幅所限,这段代码并未真正实现拖动)。
Dim indrag As Boolean
'指示拖放操作的标志。
Dim nodX As Object
'被拖动的项。
Private Sub Form_Load()
'在Imagelist控件中加载一个位图。
Dim imgX As ListImage
Dim BitmapPath As String
BitmapPath="graphics\icons\mail\mail01a.ico"
Set imgX=ImageList1.ListImages.Add_
(,,LoadPicture(BitmapPath))
'初始化TreeView控件并创建几个节点。
TreeView1.ImageList=ImageList1
Dim nodX As Node'创建一棵树。
Set nodX=TreeView1.Nodes.Add(,,,"Parent1",1)
Set nodX=TreeView1.Nodes.Add(,,,"Parent2",1)
Set nodX=TreeView1.Nodes.Add(1,tvwChild,,
"Child1",1)
Set nodX=TreeView1.Nodes.Add(1,tvwChild,,"Child2",1)
Set nodX=TreeView1.Nodes.Add(2,tvwChild,,"Child3",1)
Set nodX=TreeView1.Nodes.Add(2,tvwChild,,"Child4",1)
Set nodX=TreeView1.Nodes.Add(3,tvwChild,,"Child5",1)
nodX.EnsureVisible'展开树显示全部节点。
End Sub
Private Sub TreeView1_MouseDown_
(Button As Integer,Shift As Integer,x As Single,y As Single)
Set nodX=TreeView1.SelectedItem
'设置要拖动的项。
End Sub
Private Sub TreeView1_MouseMove(Button As Integer,
Shift As Integer,x As Single,y As Single)
If Button=vbLeftButton Then
'指示拖动操作。
indrag=True
'设置标志为true。
'用CreateDragImage方法设置拖动图标。
TreeView1.DragIcon=TreeView1.SelectedItem.CreateDragImage
TreeView1.DragvbBeginDrag'拖动操作。
End If
End Sub
六、图片式文件夹---ListView
ListView控件比前面几种控件要复杂一些,通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。(图7)
ColumnHeader对象是ListView控件中包含标头文字的项目。利用ColumnHeader对象,用户可以:
▲单击对象触发ColumnClick事件并根据数据项目将项目排序。
▲拖动对象的右边框来调整列宽度。
▲在报表视图中隐藏ColumnHeader对象。
ColumnHeader对象的数目决定每个ListItem对象可包含的子项目数目。删除ColumnHeader对象后所有与列关联的子项目也将被删除,并且每个ListItem对象的子项目数组将平移以更新ColumnHeader的索引,而这将导致剩余的列标头SubItemIndex属性的改变。
ColumnHeader对象的SubItemIndex属性
该属性返回与ListView控件中ColumnHeader对象关联的子项目的索引。子项目是字符串数组,代表显示在报表视图中的ListItem对象的数据。第一列的列标头SubItemIndex属性设置为0,这是因为小图标和ListItem对象的文字总出现在第一列中,而且它们被当作ListItem对象而不是子项目。列标头数目取决于子项目数目。列标头数目总是比子项目数目多1。
在设计时可以利用属性页的“列首”选项卡将ColumnHeader对象添加到ListView控件中,在运行时则用Add方法添加。
ColumnHeader对象的Add方法
该方法的使用与前面那些控件基本相似,就不再介绍了。
ListView1.ColumnHeader.Add(index,key,text,width,alignment)
ListItem对象是指控件中的一行(不包含标头行)的所有内容。它也可包含文本和图片,但是要使用图片则必须通过Icons和SmallIcons属性引用ImageList控件。
ListItem对象的SubItems属性
返回或设置一个字符串(子项目)数组,它代表ListView控件中ListItem对象的数据。
ListItem对象可包含任意多个的关联项目数据字符串(子项目),但每个ListItem对象子项目数目必须相同。每个子项目都对应于相关的列标头,无法直接向子项目数组添加元素,只有通过ColumnHeaders的Add方法添加列标头的方法来添加子项目。
ListItem对象的Add方法
该方法添加ListItem对象到ListView控件的ListItems集合中并返回对新创建对象的引用。
它的语法如下:
ListItem1.Add(index,key,text,icon,smallIcon)
ListView控件的View属性
ListView控件可使用四种不同视图显示项目,这可以用View属性来确定。该属性返回或设置ListView控件中ListItem对象的外观。
ListView控件的SortOrder,SortKey和Sorted属性
控件中的ListItem对象可以按要求进行排序,与排序有关的属性是SortOrder,Sorted和SortKey属性。
SortOrder属性返回或设置一个值,此值决定ListView控件中的ListItem对象以升序或降序排序。
SortKey属性返回或设置一个值,此值决定ListView控件中的ListItem对象如何排序。
Sorted属性返回或设置确定ListView控件中的ListItem对象是否排序的值。
下面的代码说明了如何创建ColumnHeaders和ListItem对象,SubItemIndex和SubItem属性的使用方法以及如何排序。
Private Sub Form_load()
'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport
'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"
ListView1.ColumnHeaders.Add,"Sex","性别"
ListView1.ColumnHeaders.Add,"Age","年龄"
'向控件添加ListItem对象。
Dim itmX As ListItem
'添加column1的名称。
Set itmX=ListView1.ListItems.Add(1,"ZL","张力")
'使用SubItemIndex将SubItem与正确的ColumnHeader关联。使用关键字("Sex")指定正确的ColumnHeader。
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
'使用ColumnHeader关键字将SubItems字符串与
'正确的ColumnHeader关联。
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="19"
Set itmX=ListView1.ListItems.Add(1,"LF","李芳")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"
Set itmX=ListView1.ListItems.Add(1,"WW","王伟")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader)
Select Case ColumnHeader.Key
Case "Sex":ListView1.SortKey=1
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
Case "Age":ListView1.SortKey=2
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
End Select
End Sub
七、带刻度滑块---Slider
Slider控件是一个包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块来选择一个值。
在选择离散数值或某个范围内的一组连续数值时,Slider控件十分有用。例如,无需键入数字,通过将滑块移动到刻度标记处,可以用Slider控件来输入数值。
Silder控件的大多数基本属性比较简单,我们这里重点介绍一些较有用而又常易忽略的属性。
TickStyle属性
该属性返回或设置Slider控件上显示的刻度标记的样式。
SelectRange,SelStart和SelLength属性
Slider控件可以选择某个范围内的数值,这就要用到SelectRange,SelStart和SelLength属性。
SelectRange属性决定Slider控件是否可以选择一个范围。如果SelectRange属性为True,SelStart为选定范围的起始值,SelLength为选定范围的长度。
如果SelectRange属性为False,则SelStart属性的设置值与Value属性的设置值相同,SelLength属性无效。
下列代码允许在按住SHIFT键时,用鼠标拖动或单击Slider控件以选择一个范围。
Private Sub Form_Load()
'设置slider控件的设置值
Slider1.Max=20
End Sub
Private Sub Slider1_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single)
If Shift=1 Then '如果按住Shift键,则Slider1.SelectRange=True '打开SelectRange。
Slider1.SelStart=Slider1.Value'设置SelStart数值
Slider1.SelLength=0'设置先前的SelLength(如存在)为0。
End If
End Sub
Private Sub Slider1_MouseUp(Button As Integer,Shift As Integer,x As Single,y As Single)
if Shift=1 Then
'如果在一点决定返回上一步,将发生错误。
On Error Resume Next
'否则使用SelStart和当前数值设置SelLength。
Slider1.SelLength=Slider1.Value-Slider1.SelStart
Else
Slider1.SelectRange=False'如果松开SHIFT键。
End If
End Sub
在程序中,常用Slider控件来代替键盘输入数字,如下面的例子。
该例通过Slider控件来显示不同的长度。
Private Sub Form_Load()
Slider1.Min=0
Slider1.Max=50
Slider1.SmallChange=1
Slider1.LargeChange=10
Slider1.TickFrequency=5
End Sub
Private Sub Slider1_Change()
Label1.Caption="长度是"&Format(Slider1.Value/5,"#.00")&"厘米"
End Sub
八、ProgressBar控件
最后,我们来看一下ProgressBar。在应用程序中,当进行一个较长的操作比如安装或载入程序 时,通常会用一个进度指示器来表示进度。在VB中,这个工作可以由ProgressBar控件来完成。ProgressBar控件通过从左到右用一些方块填充矩形来表示一个较长操作的进度。
在运行时,ProgressBar控件监视着操作完成的进度。控件有一个行程和一个当前位置。行程代表该操作的整个持续时间。当前位置则代表应用程序在完成该操作过程时的进度。其使用方法与Slider控件相似。
好了,到这里我们把Common家族都介绍完了,各位VB同道,若您把他们兄弟几个调教好了,保管您的应用程序界面具有专业水准。如果您在工具箱里找不到他们的话,可以用右键单击工具箱,选择“部件”,然后选中MicrosoftWindowsCommonControls5.0,最后单击“确定”就行了。
引用自http://www.mypcera.com/softxue/vb/new/m57.htm
研究treeview物件2
從excel home中找到不錯的教學
順便把註解修成繁體中文
還有了解語法功能
把所學整理到這裡
====================
Private Sub UserForm_Initialize()
'初始化ImageList物件,添加圖片
Dim img As New ImageList
img.ListImages.Add 1, "book1", LoadPicture(ThisWorkbook.Path & "\book1.gif")
img.ListImages.Add 2, "book2", LoadPicture(ThisWorkbook.Path & "\book2.gif")
img.ListImages.Add 3, "book3", LoadPicture(ThisWorkbook.Path & "\book3.gif")
Set TreeView1.ImageList = img
'設置顯示節點路徑時的分隔符
TreeView1.PathSeparator = "\"
End Sub
Private Sub CommandButton1_Click()
'添加節點
Dim NodeX As Node
TreeView1.Nodes.Clear
Set NodeX = TreeView1.Nodes.Add(, , "課程科目", "課程科目", "book3")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "語文", "語文", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "數學", "數學", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "外語", "外語", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "政治", "政治", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "物理", "物理", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "化學", "化學", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "生物", "生物", "book1")
End Sub
Private Sub CommandButton2_Click()
'設置複選框顯示
TreeView1.CheckBoxes = True
End Sub
Private Sub CommandButton3_Click()
'清除節點
TreeView1.Nodes.Clear
End Sub
Private Sub CommandButton4_Click()
'去掉複選框顯示
TreeView1.CheckBoxes = False
End Sub
Private Sub CommandButton5_Click()
'開啟熱跟蹤功能
TreeView1.HotTracking = True
End Sub
Private Sub CommandButton6_Click()
'編輯節點
TreeView1.StartLabelEdit
End Sub
Private Sub CommandButton7_Click()
'顯示根節點連線
TreeView1.LineStyle = tvwRootLines
End Sub
Private Sub CommandButton8_Click()
'隱藏根節點連線
TreeView1.LineStyle = tvwTreeLines
End Sub
Private Sub CommandButton9_Click()
'移除所選節點
'若為根節點,則將其子節點一並移除
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index
End Sub
Private Sub CommandButton10_Click()
'統計節點個數
Label1.Caption = "TreeView物件中節點對象的個數?:" & TreeView1.Nodes.Count & "個."
End Sub
Private Sub CommandButton11_Click()
'將所選節點變為粗體
TreeView1.SelectedItem.Bold = True
End Sub
Private Sub CommandButton12_Click()
Dim i As Long
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = True '展開所有節點
Next i
End Sub
Private Sub CommandButton13_Click()
Dim i As Long
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = False '折疊所有節點
Next i
End Sub
Private Sub OptionButton1_Click()
'節點僅顯示文字
TreeView1.Style = tvwTextOnly
End Sub
Private Sub OptionButton2_Click()
'節點顯示圖像
TreeView1.Style = tvwPictureText
End Sub
Private Sub OptionButton3_Click()
'清除節點
TreeView1.Style = tvwPlusMinusText
End Sub
Private Sub OptionButton4_Click()
'節點間顯示虛線
TreeView1.Style = tvwTreelinesText
End Sub
Private Sub OptionButton5_Click()
'節點顯示恢複正常
TreeView1.Style = tvwTreelinesPlusMinusPictureText
End Sub
Private Sub Treeview1_Nodeclick(ByVal Node As MSComctlLib.Node)
'返回對象路徑
Label3.Caption = Node.FullPath
End Sub
Private Sub Treeview1_NodeCheck(ByVal Node As MSComctlLib.Node)
'複選框事件
Label5.Caption = "當前選擇的節點是:" & TreeView1.SelectedItem.Text
End Sub
順便把註解修成繁體中文
還有了解語法功能
把所學整理到這裡
====================
Private Sub UserForm_Initialize()
'初始化ImageList物件,添加圖片
Dim img As New ImageList
img.ListImages.Add 1, "book1", LoadPicture(ThisWorkbook.Path & "\book1.gif")
img.ListImages.Add 2, "book2", LoadPicture(ThisWorkbook.Path & "\book2.gif")
img.ListImages.Add 3, "book3", LoadPicture(ThisWorkbook.Path & "\book3.gif")
Set TreeView1.ImageList = img
'設置顯示節點路徑時的分隔符
TreeView1.PathSeparator = "\"
End Sub
Private Sub CommandButton1_Click()
'添加節點
Dim NodeX As Node
TreeView1.Nodes.Clear
Set NodeX = TreeView1.Nodes.Add(, , "課程科目", "課程科目", "book3")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "語文", "語文", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "數學", "數學", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "外語", "外語", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "政治", "政治", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "物理", "物理", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "化學", "化學", "book1")
Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "生物", "生物", "book1")
End Sub
Private Sub CommandButton2_Click()
'設置複選框顯示
TreeView1.CheckBoxes = True
End Sub
Private Sub CommandButton3_Click()
'清除節點
TreeView1.Nodes.Clear
End Sub
Private Sub CommandButton4_Click()
'去掉複選框顯示
TreeView1.CheckBoxes = False
End Sub
Private Sub CommandButton5_Click()
'開啟熱跟蹤功能
TreeView1.HotTracking = True
End Sub
Private Sub CommandButton6_Click()
'編輯節點
TreeView1.StartLabelEdit
End Sub
Private Sub CommandButton7_Click()
'顯示根節點連線
TreeView1.LineStyle = tvwRootLines
End Sub
Private Sub CommandButton8_Click()
'隱藏根節點連線
TreeView1.LineStyle = tvwTreeLines
End Sub
Private Sub CommandButton9_Click()
'移除所選節點
'若為根節點,則將其子節點一並移除
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index
End Sub
Private Sub CommandButton10_Click()
'統計節點個數
Label1.Caption = "TreeView物件中節點對象的個數?:" & TreeView1.Nodes.Count & "個."
End Sub
Private Sub CommandButton11_Click()
'將所選節點變為粗體
TreeView1.SelectedItem.Bold = True
End Sub
Private Sub CommandButton12_Click()
Dim i As Long
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = True '展開所有節點
Next i
End Sub
Private Sub CommandButton13_Click()
Dim i As Long
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(i).Expanded = False '折疊所有節點
Next i
End Sub
Private Sub OptionButton1_Click()
'節點僅顯示文字
TreeView1.Style = tvwTextOnly
End Sub
Private Sub OptionButton2_Click()
'節點顯示圖像
TreeView1.Style = tvwPictureText
End Sub
Private Sub OptionButton3_Click()
'清除節點
TreeView1.Style = tvwPlusMinusText
End Sub
Private Sub OptionButton4_Click()
'節點間顯示虛線
TreeView1.Style = tvwTreelinesText
End Sub
Private Sub OptionButton5_Click()
'節點顯示恢複正常
TreeView1.Style = tvwTreelinesPlusMinusPictureText
End Sub
Private Sub Treeview1_Nodeclick(ByVal Node As MSComctlLib.Node)
'返回對象路徑
Label3.Caption = Node.FullPath
End Sub
Private Sub Treeview1_NodeCheck(ByVal Node As MSComctlLib.Node)
'複選框事件
Label5.Caption = "當前選擇的節點是:" & TreeView1.SelectedItem.Text
End Sub
研究treeview物件1
離上次發文隔了半個月
去excel home找了些許資料
也下載了別人的範例
有一些可以執行
接下來詳細看看 研究一下物件怎麼用
順便想想可以用這種物件幹嘛
寫程式還是要以目的為出發點
去構築拼湊想要的功能
去excel home找了些許資料
也下載了別人的範例
有一些可以執行
接下來詳細看看 研究一下物件怎麼用
順便想想可以用這種物件幹嘛
寫程式還是要以目的為出發點
去構築拼湊想要的功能
2009年9月9日 星期三
2009年9月4日 星期五
2009年8月29日 星期六
研究treeview物件
我記得treeview物件好像還蠻常用在選取資料的工作上
而且很適合用在找尋分類資料上很方便
在excel home有看到相關的教學說明關於treeview
接下來就以此為主題做細部學習
而且很適合用在找尋分類資料上很方便
在excel home有看到相關的教學說明關於treeview
接下來就以此為主題做細部學習
excel vba 獲取儲存格資訊的秘技函數
蠻實用又簡潔的語法 節錄下來方便使用
====================================================
一些EXCEL 97的巨集函數已經受人遺忘,因此這些有用的函數就成為密技。這個GET.CELL就是其中之一。
語法
GET.CELL(type_num, reference)
Type_num 指定要獲取儲存格資訊的號碼, 內容如下:
Type_num
1 參照儲存格的絕對位址
2 參照儲存格的列號
3 參照儲存格的欄號
4 類似 TYPE 函數
5 參照位址的內容
6 文字顯示參照位址的公式
7 參照位址的格式,文字顯示
8 文字顯示參照位址的格式
9 傳回儲存格外框左方樣式,數位顯示
10 傳回儲存格外框右方樣式,數位顯示
11 傳回儲存格外框方上樣式,數位顯示
12 如果儲存格被設定 locked傳回 True
15 如果公式處於隱藏狀態傳回 True
16 傳回儲存格寬度
17 以點為單位傳回儲存格高度
18 字型名稱
19 以點為單位傳回字型大小
20 如果儲存格所有或第一個字元為加粗傳回 True
21 如果儲存格所有或第一個字元為斜體傳回 True
22 如果儲存格所有或第一個字元為單底線傳回True
23 如果儲存格所有或第一個字元字型中間加了一條水平線傳回 True
24 傳回儲存格第一個字元色彩數位, 1 至 56。如果設定為自動,傳回 0
25 MS Excel不支援大綱格式
26 MS Excel不支援陰影格式
27 數位顯示手動插入的分頁線設定
28 大綱的列層次
29 大綱的欄層次
30 如果範圍為大綱的摘要列則為 True
31 如果範圍為大綱的摘要欄則為 True
32 顯示活頁簿和工作表名稱
33 如果儲存格格式為多行文字則為 True
34 傳回儲存格外框左方色彩,數位顯示。如果設定為自動,傳回 0
35 傳回儲存格外框右方色彩,數位顯示。如果設定為自動,傳回 0
36 傳回儲存格外框上方色彩,數位顯示。如果設定為自動,傳回 0
37 傳回儲存格外框下方色彩,數位顯示。如果設定為自動,傳回 0
38 傳回儲存格前景陰影色彩,數位顯示。如果設定為自動,傳回 0
39 傳回儲存格背影陰影色彩,數位顯示。如果設定為自動,傳回 0
40 文字顯示儲存格樣式
41 傳回參照地址的原始公式
42 以點為單位傳回使用中視窗左方至儲存格左方水平距離
43 以點為單位傳回使用中視窗上方至儲存格上方垂直距離
44 以點為單位傳回使用中視窗左方至儲存格右方水平距離
45 以點為單位傳回使用中視窗上方至儲存格下方垂直距離
46 如果儲存格有插入批註傳回 True
47 如果儲存格有插入聲音提示傳回 True
48 如果儲存格有插入公式傳回 True
49 如果儲存格是陣列公式的範圍傳回 True
50 傳回儲存格垂直對齊,數位顯示
51 傳回儲存格垂直方向,數位顯示
52 傳回儲存格首碼字元
53 文字顯示傳回儲存格顯示內容
54 傳回儲存格樞紐分析表名稱
55 傳回儲存格在樞紐分析表的位置
56 樞紐分析
57 如果儲存格所有或第一個字元為上標傳回True
58 文字顯示傳回儲存格所有或第一個字元字型樣式
59 傳回儲存格底線樣式,數位顯示
60 如果儲存格所有或第一個字元為下標傳回True
61 樞紐分析
62 顯示活頁簿和工作表名稱
63 傳回儲存格的填滿色彩
64 傳回圖樣前景色彩
65 樞紐分析
66 顯示活頁簿名稱
Reference 一個儲存格或範圍,若省略則為activecell。
相關的討論請訪問http://www.officefans.net/cdb/viewthread.php?tid=16313。
請訪問http://support.microsoft.com/kb/q143466/
下載Excel 97 巨集函數說明文件XLMACR8.HLP。
或訪問http://support.microsoft.com/default.aspx?scid=kb;en-us;128185
下載Macrofun.hlp - the complete Macro Function help file of Microsoft Excel 4.0
====================================================
一些EXCEL 97的巨集函數已經受人遺忘,因此這些有用的函數就成為密技。這個GET.CELL就是其中之一。
語法
GET.CELL(type_num, reference)
Type_num 指定要獲取儲存格資訊的號碼, 內容如下:
Type_num
1 參照儲存格的絕對位址
2 參照儲存格的列號
3 參照儲存格的欄號
4 類似 TYPE 函數
5 參照位址的內容
6 文字顯示參照位址的公式
7 參照位址的格式,文字顯示
8 文字顯示參照位址的格式
9 傳回儲存格外框左方樣式,數位顯示
10 傳回儲存格外框右方樣式,數位顯示
11 傳回儲存格外框方上樣式,數位顯示
12 如果儲存格被設定 locked傳回 True
15 如果公式處於隱藏狀態傳回 True
16 傳回儲存格寬度
17 以點為單位傳回儲存格高度
18 字型名稱
19 以點為單位傳回字型大小
20 如果儲存格所有或第一個字元為加粗傳回 True
21 如果儲存格所有或第一個字元為斜體傳回 True
22 如果儲存格所有或第一個字元為單底線傳回True
23 如果儲存格所有或第一個字元字型中間加了一條水平線傳回 True
24 傳回儲存格第一個字元色彩數位, 1 至 56。如果設定為自動,傳回 0
25 MS Excel不支援大綱格式
26 MS Excel不支援陰影格式
27 數位顯示手動插入的分頁線設定
28 大綱的列層次
29 大綱的欄層次
30 如果範圍為大綱的摘要列則為 True
31 如果範圍為大綱的摘要欄則為 True
32 顯示活頁簿和工作表名稱
33 如果儲存格格式為多行文字則為 True
34 傳回儲存格外框左方色彩,數位顯示。如果設定為自動,傳回 0
35 傳回儲存格外框右方色彩,數位顯示。如果設定為自動,傳回 0
36 傳回儲存格外框上方色彩,數位顯示。如果設定為自動,傳回 0
37 傳回儲存格外框下方色彩,數位顯示。如果設定為自動,傳回 0
38 傳回儲存格前景陰影色彩,數位顯示。如果設定為自動,傳回 0
39 傳回儲存格背影陰影色彩,數位顯示。如果設定為自動,傳回 0
40 文字顯示儲存格樣式
41 傳回參照地址的原始公式
42 以點為單位傳回使用中視窗左方至儲存格左方水平距離
43 以點為單位傳回使用中視窗上方至儲存格上方垂直距離
44 以點為單位傳回使用中視窗左方至儲存格右方水平距離
45 以點為單位傳回使用中視窗上方至儲存格下方垂直距離
46 如果儲存格有插入批註傳回 True
47 如果儲存格有插入聲音提示傳回 True
48 如果儲存格有插入公式傳回 True
49 如果儲存格是陣列公式的範圍傳回 True
50 傳回儲存格垂直對齊,數位顯示
51 傳回儲存格垂直方向,數位顯示
52 傳回儲存格首碼字元
53 文字顯示傳回儲存格顯示內容
54 傳回儲存格樞紐分析表名稱
55 傳回儲存格在樞紐分析表的位置
56 樞紐分析
57 如果儲存格所有或第一個字元為上標傳回True
58 文字顯示傳回儲存格所有或第一個字元字型樣式
59 傳回儲存格底線樣式,數位顯示
60 如果儲存格所有或第一個字元為下標傳回True
61 樞紐分析
62 顯示活頁簿和工作表名稱
63 傳回儲存格的填滿色彩
64 傳回圖樣前景色彩
65 樞紐分析
66 顯示活頁簿名稱
Reference 一個儲存格或範圍,若省略則為activecell。
相關的討論請訪問http://www.officefans.net/cdb/viewthread.php?tid=16313。
請訪問http://support.microsoft.com/kb/q143466/
下載Excel 97 巨集函數說明文件XLMACR8.HLP。
或訪問http://support.microsoft.com/default.aspx?scid=kb;en-us;128185
下載Macrofun.hlp - the complete Macro Function help file of Microsoft Excel 4.0
2009年8月26日 星期三
2009年8月24日 星期一
2009年8月23日 星期日
2009年8月21日 星期五
2009年8月17日 星期一
2009年8月15日 星期六
2009年8月13日 星期四
2009年8月6日 星期四
2009年8月5日 星期三
2009年8月2日 星期日
初步richman想法與可能要解決的問題
天氣熱睡不著 用來思考程式的寫法最好
大致上的流程如下
初始設定 設定棋盤 棋子 各項資料初始化
骰子程式還有控制選單
取得資料庫中棋子的位置
移動
啟動事件
處理事件(將資料存入資料庫)
改變控制權
原本是想直接在原本的程式中用各項常數變數矩陣來做資料存取就好
不過對各副程式或是函式如何引入自己設的變數有點麻煩
後來想到無論是哪個副程式或是函式 都可以直接取用放在工作表中的資料
不如將各種需要的資料存放在工作表中
將工作表當成資料庫
這樣只要專心研究流程控制就好
還可以順便研究一下資料庫處理
初步考量到會遇到的問題有
1.已找到讀取未開啟excel某格內容的方法了(技巧196)還要找寫入的方法
2.控制選單的設計(技巧187)
3.如何讓視窗置中移至棋子附近(技巧169)
4.資料庫(做清單)
就先朝這幾個方面找資料還有研究吧!!
大致上的流程如下
初始設定 設定棋盤 棋子 各項資料初始化
骰子程式還有控制選單
取得資料庫中棋子的位置
移動
啟動事件
處理事件(將資料存入資料庫)
改變控制權
原本是想直接在原本的程式中用各項常數變數矩陣來做資料存取就好
不過對各副程式或是函式如何引入自己設的變數有點麻煩
後來想到無論是哪個副程式或是函式 都可以直接取用放在工作表中的資料
不如將各種需要的資料存放在工作表中
將工作表當成資料庫
這樣只要專心研究流程控制就好
還可以順便研究一下資料庫處理
初步考量到會遇到的問題有
1.已找到讀取未開啟excel某格內容的方法了(技巧196)還要找寫入的方法
2.控制選單的設計(技巧187)
3.如何讓視窗置中移至棋子附近(技巧169)
4.資料庫(做清單)
就先朝這幾個方面找資料還有研究吧!!
2009年7月30日 星期四
大富翁1
想完成這個遊戲程式
要先想想需要哪些功能
目前想到的是表格
棋子
棋子怎麼移動
看了書之後
找到了建立圖形的方法 如下
Set 矩形 = ActiveSheet.Shapes.AddShape(17, 180, 70, 80, 45)
第一個參數是形狀代號 後面四個參數是座標
至於移動棋子圖形的部分
還沒找到可以直接移動物件的方法
但找到了可以複製物件並傳回新複製物件參照 的方法
然後增減物件的位址
最後用Delete方法殺掉原始物件
目前這樣的想法是可行的
不過有些問題還要解決跟釐清
因為不斷複製新物件還有刪除物件
似乎程式會自動設定物件名稱
例如起始生成笑臉1 可是經過複製 移動新物件
就會生成笑臉2......移動越多 名稱編號越高
初步想到的是 應該可以加一個更改圖形命名的語法
將名稱固定為一個
另外就是移動的部分
IncrementLeft方法 明明就指水平移動
可是我在移動時發現會有誤差
似乎會有向下偏移的跡象
勉強用IncrementTop方法修正回來
可是為什麼會這樣 並不知道原因
還要再查一下
可是我覺得應該有直接移動原始圖形物件的方法
要先想想需要哪些功能
目前想到的是表格
棋子
棋子怎麼移動
看了書之後
找到了建立圖形的方法 如下
Set 矩形 = ActiveSheet.Shapes.AddShape(17, 180, 70, 80, 45)
第一個參數是形狀代號 後面四個參數是座標
至於移動棋子圖形的部分
還沒找到可以直接移動物件的方法
但找到了可以複製物件並傳回新複製物件參照 的方法
然後增減物件的位址
最後用Delete方法殺掉原始物件
目前這樣的想法是可行的
不過有些問題還要解決跟釐清
因為不斷複製新物件還有刪除物件
似乎程式會自動設定物件名稱
例如起始生成笑臉1 可是經過複製 移動新物件
就會生成笑臉2......移動越多 名稱編號越高
初步想到的是 應該可以加一個更改圖形命名的語法
將名稱固定為一個
另外就是移動的部分
IncrementLeft方法 明明就指水平移動
可是我在移動時發現會有誤差
似乎會有向下偏移的跡象
勉強用IncrementTop方法修正回來
可是為什麼會這樣 並不知道原因
還要再查一下
可是我覺得應該有直接移動原始圖形物件的方法
2009年7月28日 星期二
2009年7月27日 星期一
2009年7月26日 星期日
分點好運給我吧!!
我總覺得今年是運氣很差的一年
過年後被公司火掉了
面個試會被烏秋追殺
往年出門常下雨 今年還是一樣
拖到現在還沒找到工作(我可是個人才阿)
抱怨到此停止
雖然說是這樣 前天靖宜卻告訴我考上了沙鹿的特教師甄試了
之前他打電話要我幫忙送面試資料
因為審查地點離家裡很近
所以隨口就答應他了
沒想到送資料當天 = =
我馬上把她的照片遺失了
害我還得殺到大雅再拿一次照片
不但如此
那天 我見識到了什麼叫做流浪教師
根本不比流浪工程師差麻 = =
現場一堆擁有教師 幼教師 特教師資格的人擠滿了禮堂
光排隊就不知道要排幾個小時
中途還下大雨
我心裡只有一個感想(超.........級...不划算 我只是義務幫忙的阿)
不過 沒想到靖宜居然考上了
真是厲害又強運阿
事後有請我吃飯
不過我比較希望她能分一點好運氣給我
過年後被公司火掉了
面個試會被烏秋追殺
往年出門常下雨 今年還是一樣
拖到現在還沒找到工作(我可是個人才阿)
抱怨到此停止
雖然說是這樣 前天靖宜卻告訴我考上了沙鹿的特教師甄試了
之前他打電話要我幫忙送面試資料
因為審查地點離家裡很近
所以隨口就答應他了
沒想到送資料當天 = =
我馬上把她的照片遺失了
害我還得殺到大雅再拿一次照片
不但如此
那天 我見識到了什麼叫做流浪教師
根本不比流浪工程師差麻 = =
現場一堆擁有教師 幼教師 特教師資格的人擠滿了禮堂
光排隊就不知道要排幾個小時
中途還下大雨
我心裡只有一個感想(超.........級...不划算 我只是義務幫忙的阿)
不過 沒想到靖宜居然考上了
真是厲害又強運阿
事後有請我吃飯
不過我比較希望她能分一點好運氣給我
2009年7月22日 星期三
perl的學習中斷了嗎??
之前想說要學perl
因為我覺得正規表示法似乎很好用
而且去面試時 還有主管想找會這種語言的人
不過想要好好學這們語言還是應該要買本聖經來啃
在此之前還是先把VBA弄熟一點還有存錢買書再說
從這個主題第一篇文章發出到現在
其實我還是有找相關的書在看
不過似乎在很多功能上搞不清楚用途
至於在概念方面讀到模組之後就沒辦法在下一步理解了
而且除了拿來當成script語法用之外
我也沒有進一步的用途 最後就跟之前想學MFC的狀況一樣了
卡死 然後放棄
在這段期間其實也不是完全沒有收穫
在做VBA的學習時 也順便的看了一些VB的書
再查資料的這段期間
有些觀念逐漸被打通了
像是物件導向
以前實在是搞不清楚C++所謂的OO概念
為什麼有物件這種東西 其實也就是perl說的模組
有了物件還要繼承
繼承之間又有一大堆細節
C++書上寫的說法實在不好懂
卻在VB的書上找到很好的解釋
這些所謂的物件其實可以當作比較專業一點的程式設計師
設計好對某個主題的應用了 然後再將程式和程式碼的資訊隱藏
讓其他程設人員透過介面使用就好
使用時只要懂得透過屬性 事件 方法
去控制物件
就不需要再重頭設計
"聞道有先後 術業有專攻"
讓擅長某個領域的人去開發那個領域的物件
其他人用寫好的元件就好
所以教基本程設的書 很少說明物件的使用
因為介紹不完嘛 需要某種用途去找合適的類別
不同的應用用不同的類別
所以學完基本的程式語法後 還需要學習如何使用別人所寫的類別
還有在用VB時 雖然很方便
比起VC可以不用在意很多細節
像是變數的宣告
可是當我在寫VB語法時
卻發現C語言有很多語法功能在VB是被隱藏起來
像是指標
常常寫程式寫到一半 發現用指標操控比較方便
但是用VB就必須換一種寫法 雖然我記得VB其實還是有替代指標的方法
在實際用不同語言寫過一些範例之後
逐漸覺得C語言雖然嚴謹複雜
卻也是自由度最高的語言了
擁有最豐富的表達方式
等到VBA更熟悉一點
再回去研究MFC還有perl好了
因為我覺得正規表示法似乎很好用
而且去面試時 還有主管想找會這種語言的人
不過想要好好學這們語言還是應該要買本聖經來啃
在此之前還是先把VBA弄熟一點還有存錢買書再說
從這個主題第一篇文章發出到現在
其實我還是有找相關的書在看
不過似乎在很多功能上搞不清楚用途
至於在概念方面讀到模組之後就沒辦法在下一步理解了
而且除了拿來當成script語法用之外
我也沒有進一步的用途 最後就跟之前想學MFC的狀況一樣了
卡死 然後放棄
在這段期間其實也不是完全沒有收穫
在做VBA的學習時 也順便的看了一些VB的書
再查資料的這段期間
有些觀念逐漸被打通了
像是物件導向
以前實在是搞不清楚C++所謂的OO概念
為什麼有物件這種東西 其實也就是perl說的模組
有了物件還要繼承
繼承之間又有一大堆細節
C++書上寫的說法實在不好懂
卻在VB的書上找到很好的解釋
這些所謂的物件其實可以當作比較專業一點的程式設計師
設計好對某個主題的應用了 然後再將程式和程式碼的資訊隱藏
讓其他程設人員透過介面使用就好
使用時只要懂得透過屬性 事件 方法
去控制物件
就不需要再重頭設計
"聞道有先後 術業有專攻"
讓擅長某個領域的人去開發那個領域的物件
其他人用寫好的元件就好
所以教基本程設的書 很少說明物件的使用
因為介紹不完嘛 需要某種用途去找合適的類別
不同的應用用不同的類別
所以學完基本的程式語法後 還需要學習如何使用別人所寫的類別
還有在用VB時 雖然很方便
比起VC可以不用在意很多細節
像是變數的宣告
可是當我在寫VB語法時
卻發現C語言有很多語法功能在VB是被隱藏起來
像是指標
常常寫程式寫到一半 發現用指標操控比較方便
但是用VB就必須換一種寫法 雖然我記得VB其實還是有替代指標的方法
在實際用不同語言寫過一些範例之後
逐漸覺得C語言雖然嚴謹複雜
卻也是自由度最高的語言了
擁有最豐富的表達方式
等到VBA更熟悉一點
再回去研究MFC還有perl好了
精神又萎靡掉了
最近不知道為什麼 身體變得好重
一點都提不起精神 連吃飯也只剩下一天一餐就飽了
老媽似乎很擔心 只好跑跑步提振一點精神
消耗一點能量才能吃得下
也許這是抑鬱成疾的毛病吧
說起來 最近常有些心態怪怪的想法
應該是因為老是縮在家裡造成的後遺症
不過我真的好煩
已經足六個月沒工作了
去應徵工作依然沒有下文
下一步路該怎麼走 我一點想法也沒有
仔細想想 我這種個性越來越像
老媽口中的老爸 缺少行動的勇氣
雖然不是什麼非常不好的個性
不過一直駐足不前 死守的僅有的資源
做最小的消耗
缺乏放手一搏的勇氣
在消磨的日子裡 不斷的放眼前的機會流失
明明知道這樣子下去是不行的
不過我還是不斷的在消耗自己的人生
其實我有好多想做的事
但我卻拿不起勇氣義無反顧的投入
越長大越懦弱 越來越輸不起
於是很多東西很多事
都在稍微接觸後便放棄而沒有認真投入
說穿了就是我捨不得做投資
因為我不知道未來下一步這樣走會有什麼結果
結局會是好的嗎
萬一我的決定是錯的呢??
一這樣想 我便遲遲無法跨出去
不知道什麼時候 我能突破眼前這一步
重新再站起來
或是找到讓我前進的動力
加油阿~~~!!加油
一點都提不起精神 連吃飯也只剩下一天一餐就飽了
老媽似乎很擔心 只好跑跑步提振一點精神
消耗一點能量才能吃得下
也許這是抑鬱成疾的毛病吧
說起來 最近常有些心態怪怪的想法
應該是因為老是縮在家裡造成的後遺症
不過我真的好煩
已經足六個月沒工作了
去應徵工作依然沒有下文
下一步路該怎麼走 我一點想法也沒有
仔細想想 我這種個性越來越像
老媽口中的老爸 缺少行動的勇氣
雖然不是什麼非常不好的個性
不過一直駐足不前 死守的僅有的資源
做最小的消耗
缺乏放手一搏的勇氣
在消磨的日子裡 不斷的放眼前的機會流失
明明知道這樣子下去是不行的
不過我還是不斷的在消耗自己的人生
其實我有好多想做的事
但我卻拿不起勇氣義無反顧的投入
越長大越懦弱 越來越輸不起
於是很多東西很多事
都在稍微接觸後便放棄而沒有認真投入
說穿了就是我捨不得做投資
因為我不知道未來下一步這樣走會有什麼結果
結局會是好的嗎
萬一我的決定是錯的呢??
一這樣想 我便遲遲無法跨出去
不知道什麼時候 我能突破眼前這一步
重新再站起來
或是找到讓我前進的動力
加油阿~~~!!加油
2009年7月17日 星期五
有點突破了
在買了博碩文化引進的office即戰力系列 "經理人提升工作自動化效率的excel VBA活用技巧"這本書後,當中有很多實用的技巧和程式碼 一般的書大多以介紹語法和觀念為主 常常有一堆不知道用途的函式 ,屬性或是方法 這個系列以實用為出發 也很淺顯易懂
需要一個"active按鈕"啟動click事件
檔案系統控制
啟動檔案IO功能
字串處理
使用excel儲存格
這四個項目的要求都達到了
出乎意料的是寫出來程式碼非常的短阿
雖然還有一些需要修改或是增加的功能
不過雛形出來了 已經很接近當初看到的功能
Private Sub 載入_Click()
Dim d(30)
For num = 1 To 10
root1 = ActiveWorkbook.Path & "\" & "try" & num & ".txt"
Open root1 For Input As #1
Do Until EOF(1)
For n = 1 To 30
Input #1, d(n)
Cells(num + 5, n + 1).Value = d(n)
Next
Loop
Close #1
Next
End Sub
大致上程式的架構就是這樣
按鈕->取得要處理資料夾路徑->載入文字檔案資料
過程中還寫了一個亂數生成10個內含30筆資料檔案副程式
提供實驗
接下來只要再做細部修改就完成拉
需要一個"active按鈕"啟動click事件
檔案系統控制
啟動檔案IO功能
字串處理
使用excel儲存格
這四個項目的要求都達到了
出乎意料的是寫出來程式碼非常的短阿
雖然還有一些需要修改或是增加的功能
不過雛形出來了 已經很接近當初看到的功能
Private Sub 載入_Click()
Dim d(30)
For num = 1 To 10
root1 = ActiveWorkbook.Path & "\" & "try" & num & ".txt"
Open root1 For Input As #1
Do Until EOF(1)
For n = 1 To 30
Input #1, d(n)
Cells(num + 5, n + 1).Value = d(n)
Next
Loop
Close #1
Next
End Sub
大致上程式的架構就是這樣
按鈕->取得要處理資料夾路徑->載入文字檔案資料
過程中還寫了一個亂數生成10個內含30筆資料檔案副程式
提供實驗
接下來只要再做細部修改就完成拉
2009年7月16日 星期四
關於CSV檔
CSV檔是很普遍的Grid式資料匯出格式,而很多人也都知道Excel可以直接將CSV檔開啟成試算表。不過稱作Comma Separated Value的CSV,除了"用逗號將值隔開"之外,還有一些進階的花式技巧。例如:
1. 如果是內含逗號的字串值,可以用雙引號將字串包起來,例如: 886,"Taipei, Taiwan"
2. 如果在雙引號中的字串中又包含了雙引號,則可以遵循VB/VBScript的慣例,用兩個雙引號代替。例如: "12'30"""-->12'30"
3. 用Excel開啟CSV時,Excel會自動判斷值的性質,進行資料轉換。比較煩的是,明明編號是007,就算用了雙引號包夾成"007",Excel還是會將它轉換成7,即使在Excel中重新調整它的儲存格式為字串,也無法還原回007。
所以,我們可以用="007"的宣告方式,強制指定字串值,Excel就不會雞婆將它轉成數字。而這個技巧還可以再延伸,甚至可以用=SUM(B2:B5)的寫法,指定儲存格的運算式。
此外Excel只接受ANSI/BIG5編碼的CSV檔,如果將CSV檔存成Unicode編碼,Excel就無法識別出逗號,而會將整列資料視為同一個值。
----------------------------------------------
另外…Excel不默認支持UTF8的CSV文件
因此excel打開utf-8中文的csv百分百會發生問題。
有兩種解決辦法:
1. 可以先用notepad打開csv,另存為ANSI編碼,再用Excel打開
2. 先打開空的Excel,然後在資料->取得外部資料->從文字檔→選擇csv文件,在導入資料對話框中選好UTF-8的編碼(你會發現默認是ANSI),就可以了。
1. 如果是內含逗號的字串值,可以用雙引號將字串包起來,例如: 886,"Taipei, Taiwan"
2. 如果在雙引號中的字串中又包含了雙引號,則可以遵循VB/VBScript的慣例,用兩個雙引號代替。例如: "12'30"""-->12'30"
3. 用Excel開啟CSV時,Excel會自動判斷值的性質,進行資料轉換。比較煩的是,明明編號是007,就算用了雙引號包夾成"007",Excel還是會將它轉換成7,即使在Excel中重新調整它的儲存格式為字串,也無法還原回007。
所以,我們可以用="007"的宣告方式,強制指定字串值,Excel就不會雞婆將它轉成數字。而這個技巧還可以再延伸,甚至可以用=SUM(B2:B5)的寫法,指定儲存格的運算式。
此外Excel只接受ANSI/BIG5編碼的CSV檔,如果將CSV檔存成Unicode編碼,Excel就無法識別出逗號,而會將整列資料視為同一個值。
----------------------------------------------
另外…Excel不默認支持UTF8的CSV文件
因此excel打開utf-8中文的csv百分百會發生問題。
有兩種解決辦法:
1. 可以先用notepad打開csv,另存為ANSI編碼,再用Excel打開
2. 先打開空的Excel,然後在資料->取得外部資料->從文字檔→選擇csv文件,在導入資料對話框中選好UTF-8的編碼(你會發現默認是ANSI),就可以了。
2009年7月13日 星期一
柯南真的是越來越豪洨了
前天和朋友還有學弟妹們去看柯南"漆黑的追跡者"
雖然有不少笑點 例如
警察們開會後的閒聊 白鳥警官和千葉警官的身材變了
還有那對很壯的警官雙胞胎重悟和參悟 名字的諧音叫做三五十五
還有那位菜鳥警官居然有如此強大的運氣 靠柯南破的案子居然升官了
實在是.............(果然做人只要強運 做什麼都會往好的方向發展)
真是令人羨慕
柯南跟服部平次手機通話讓我覺得有點BL的感覺 想不到柯南也往這個領域發展了
元太頭上的圓形禿還在 讓我覺得電影版跟電視版關聯性很夠 不像其他卡通都只能當成架空的世界來看
回歸這次最令人在意的最讓人無法接受的劇情
(= =)a 黑暗組織要銷毀的記憶卡 最後居然沒交代 就讓它掉在天文台好嗎??
黑暗組織開武裝直升機大搖大擺出現在天文台 下方全是警車
哪個國家允許武裝直升機隨便在都市開火 這世界還有王法嗎
黑暗組織也太明目張膽了 如果黑暗組織這麼招搖
柯南幹嘛追查的這麼辛苦
最後補上阿笠博士的發明 實在是太神奇了>"<
柯南這次居然用博士發明的伸縮吊帶打爆武裝直升機
我要充分的懷疑其實博士是秘密組織的成員
他給柯南的那些裝備拿到軍事用途一定無可限量
雖然有不少笑點 例如
警察們開會後的閒聊 白鳥警官和千葉警官的身材變了
還有那對很壯的警官雙胞胎重悟和參悟 名字的諧音叫做三五十五
還有那位菜鳥警官居然有如此強大的運氣 靠柯南破的案子居然升官了
實在是.............(果然做人只要強運 做什麼都會往好的方向發展)
真是令人羨慕
柯南跟服部平次手機通話讓我覺得有點BL的感覺 想不到柯南也往這個領域發展了
元太頭上的圓形禿還在 讓我覺得電影版跟電視版關聯性很夠 不像其他卡通都只能當成架空的世界來看
回歸這次最令人在意的最讓人無法接受的劇情
(= =)a 黑暗組織要銷毀的記憶卡 最後居然沒交代 就讓它掉在天文台好嗎??
黑暗組織開武裝直升機大搖大擺出現在天文台 下方全是警車
哪個國家允許武裝直升機隨便在都市開火 這世界還有王法嗎
黑暗組織也太明目張膽了 如果黑暗組織這麼招搖
柯南幹嘛追查的這麼辛苦
最後補上阿笠博士的發明 實在是太神奇了>"<
柯南這次居然用博士發明的伸縮吊帶打爆武裝直升機
我要充分的懷疑其實博士是秘密組織的成員
他給柯南的那些裝備拿到軍事用途一定無可限量
2009年7月9日 星期四
讀取文字檔內容
找到了讀取文字檔內容 並且輸出到excel表格中的程式碼
Sub test1()
Open "C:\Documents and Settings\Administrator\桌面\test.txt" For Input As #1
i = 0
Do Until EOF(1)
Line Input #1, indata ' 讀入一行資料並將之指定給變數。
i = i + 1
bpos = 1 '字元指標
epos = 1
j = 0
Do
j = j + 1
epos = InStr(bpos, indata, Chr(32), vbTextCompare) '找空白字元的位址
If epos = 0 Then Exit Do
slen = epos - bpos '字串長度
Cells(i, j) = Mid(indata, bpos, slen) '從indata字串傳回特定數量字元所構成的Variant (String)。
bpos = epos + 1
Loop
Loop
Close #1
End Sub
此外,另外一種也不錯
Sub test2()
Dim Filename As String
Dim epos As Variant
ChDir "C:\Documents and Settings\Administrator\桌面"
LogFileName = Application.GetOpenFilename(FileFilter:="文字檔(*.txt),*.txt", Title:="請選取檔案")
If TypeName(LogFileName) = "Boolean" Then Exit Sub '按取消時
Open LogFileName For Input As #1
i = 0
Do Until EOF(1)
Line Input #1, indata
i = i + 1
epos = Split(indata, Chr(32), , vbTextCompare) '取得字串至空白
rCount = UBound(epos) '取得陣列維度最大值
Cells(i, 1).Resize(, rCount) = epos
Loop
Close #1
End Sub
test2載入資料時似乎全部資料都會判斷為字串
還要再查一下原因
補充:將chr(32)改為chr(9)則 資料間格無論為 tab 或空格均可讀取資料
Sub test1()
Open "C:\Documents and Settings\Administrator\桌面\test.txt" For Input As #1
i = 0
Do Until EOF(1)
Line Input #1, indata ' 讀入一行資料並將之指定給變數。
i = i + 1
bpos = 1 '字元指標
epos = 1
j = 0
Do
j = j + 1
epos = InStr(bpos, indata, Chr(32), vbTextCompare) '找空白字元的位址
If epos = 0 Then Exit Do
slen = epos - bpos '字串長度
Cells(i, j) = Mid(indata, bpos, slen) '從indata字串傳回特定數量字元所構成的Variant (String)。
bpos = epos + 1
Loop
Loop
Close #1
End Sub
此外,另外一種也不錯
Sub test2()
Dim Filename As String
Dim epos As Variant
ChDir "C:\Documents and Settings\Administrator\桌面"
LogFileName = Application.GetOpenFilename(FileFilter:="文字檔(*.txt),*.txt", Title:="請選取檔案")
If TypeName(LogFileName) = "Boolean" Then Exit Sub '按取消時
Open LogFileName For Input As #1
i = 0
Do Until EOF(1)
Line Input #1, indata
i = i + 1
epos = Split(indata, Chr(32), , vbTextCompare) '取得字串至空白
rCount = UBound(epos) '取得陣列維度最大值
Cells(i, 1).Resize(, rCount) = epos
Loop
Close #1
End Sub
test2載入資料時似乎全部資料都會判斷為字串
還要再查一下原因
補充:將chr(32)改為chr(9)則 資料間格無論為 tab 或空格均可讀取資料
2009年6月30日 星期二
輸入與輸出
利用輸入與輸出關鍵字可以找到
關於檔案輸入輸出的控制函式
目前關心的是如何開檔 讀檔 及寫入檔案這三個動作
===========================================
Open 陳述式
+++++++++++++++++++++++++++++++++++++++++++
Open 陳述式提供三種檔案存取型態
循序存取(Input、Output 以及 Append 模式)被用來寫入文字檔,比如錯誤登入以及報告。
隨機存取 (Random 模式)被用來讀取與寫入資料到檔案並且沒有關閉檔案。隨機存取會資料保留在記錄中,如此可輕易的找出資訊所在。
二進位存取(Binary 模式)被用來讀取或寫入資料到檔案中任何的位元組位置,例如儲存或顯示一個點陣圖。
============================================
讀檔 及寫入檔案
++++++++++++++++++++++++++++++++++++++++++++
存取型態 寫入資料 讀取資料
循序 Print #, Write # Input #
隨機 Put Get
二進位 Put Get
============================================
不過這時候遇到了點問題
因為不是很了解檔案存取型態對文件的影響
所以必須親自試試看差異
關於檔案輸入輸出的控制函式
目前關心的是如何開檔 讀檔 及寫入檔案這三個動作
===========================================
Open 陳述式
+++++++++++++++++++++++++++++++++++++++++++
Open 陳述式提供三種檔案存取型態
循序存取(Input、Output 以及 Append 模式)被用來寫入文字檔,比如錯誤登入以及報告。
隨機存取 (Random 模式)被用來讀取與寫入資料到檔案並且沒有關閉檔案。隨機存取會資料保留在記錄中,如此可輕易的找出資訊所在。
二進位存取(Binary 模式)被用來讀取或寫入資料到檔案中任何的位元組位置,例如儲存或顯示一個點陣圖。
============================================
讀檔 及寫入檔案
++++++++++++++++++++++++++++++++++++++++++++
存取型態 寫入資料 讀取資料
循序 Print #, Write # Input #
隨機 Put Get
二進位 Put Get
============================================
不過這時候遇到了點問題
因為不是很了解檔案存取型態對文件的影響
所以必須親自試試看差異
2009年6月29日 星期一
取得檔案路徑
一開始找到了檔案系統控制的函數 傳回目前路徑CurDir
不過似乎只能得到預設的路徑 一般是得到使用者路徑
而不是我要得到的當前路徑
我希望我的程式能抓excel範本所在的路徑資料
結果查了一下資料 取得當前路徑可以從物件的path屬性得到
Debug.Print Application.AltStartupPath '傳回取代啟動資料夾的名稱
Debug.Print ActiveWorkbook.Path '傳回目前工作簿的路徑(檔案未存檔時傳回空字串) "這個符合要求"
Debug.Print ActiveWorkbook.FullName '現用目前工作簿的路徑及檔案名稱(檔案未存檔時只傳回暫存檔名)
Debug.Print Application.NetworkTemplatesPath '傳回儲存範本所在的網路路徑,如果指定的網路路徑不存在,本屬性將傳回一空字串
Debug.Print Application.TemplatesPath '傳回儲存範本所在的區域路徑
Debug.Print Application.Path '傳回Excel程式完整路徑
Debug.Print Application.DefaultFilePath '傳回或者設定 Microsoft Excel 開啟檔案時使用的預設路徑
Debug.Print Application.StartupPath '傳回啟動資料夾的完整路徑
Debug.Print Application.LibraryPath '傳回程式庫資料夾的路徑
Debug.Print Application.UserLibraryPath '傳回使用者電腦上 COM 增益集安裝位置的路徑(2000以上)
Debug.Print Application.PathSeparator '傳回路徑分隔符號
Debug.Print CurDir '傳回目前的路徑(開啟舊檔時線市的路徑)
For a = 1 To 27
Cells(a, 1) = Environ(a)
Next
End Sub
能夠得到當前路徑 就可以讓這個excel放在需要載入資料的目錄下
就能正常執行了
不過似乎只能得到預設的路徑 一般是得到使用者路徑
而不是我要得到的當前路徑
我希望我的程式能抓excel範本所在的路徑資料
結果查了一下資料 取得當前路徑可以從物件的path屬性得到
Debug.Print Application.AltStartupPath '傳回取代啟動資料夾的名稱
Debug.Print ActiveWorkbook.Path '傳回目前工作簿的路徑(檔案未存檔時傳回空字串) "這個符合要求"
Debug.Print ActiveWorkbook.FullName '現用目前工作簿的路徑及檔案名稱(檔案未存檔時只傳回暫存檔名)
Debug.Print Application.NetworkTemplatesPath '傳回儲存範本所在的網路路徑,如果指定的網路路徑不存在,本屬性將傳回一空字串
Debug.Print Application.TemplatesPath '傳回儲存範本所在的區域路徑
Debug.Print Application.Path '傳回Excel程式完整路徑
Debug.Print Application.DefaultFilePath '傳回或者設定 Microsoft Excel 開啟檔案時使用的預設路徑
Debug.Print Application.StartupPath '傳回啟動資料夾的完整路徑
Debug.Print Application.LibraryPath '傳回程式庫資料夾的路徑
Debug.Print Application.UserLibraryPath '傳回使用者電腦上 COM 增益集安裝位置的路徑(2000以上)
Debug.Print Application.PathSeparator '傳回路徑分隔符號
Debug.Print CurDir '傳回目前的路徑(開啟舊檔時線市的路徑)
For a = 1 To 27
Cells(a, 1) = Environ(a)
Next
End Sub
能夠得到當前路徑 就可以讓這個excel放在需要載入資料的目錄下
就能正常執行了
2009年6月25日 星期四
VBA for excel
以前在公司工作的時候 有看到產品owner用excel開發的小程式
(更屌的程式應該是有人寫整套的測試系統可以載入不同的測試項)
用來載入每片晶圓測試的結果
方便比對bin別的數量
後來有位跟我同期進公司的工程師(不過人家幹6年了)
覺得不夠方便 就又寫了個介面 讓程式更方便使用了
這一個多月看了一些VBA的書
突然想試看看 能不能做到跟人家開發的程式類似的功能
邊看資料實作看看
順便把製作的過程紀錄一下
(更屌的程式應該是有人寫整套的測試系統可以載入不同的測試項)
用來載入每片晶圓測試的結果
方便比對bin別的數量
後來有位跟我同期進公司的工程師(不過人家幹6年了)
覺得不夠方便 就又寫了個介面 讓程式更方便使用了
這一個多月看了一些VBA的書
突然想試看看 能不能做到跟人家開發的程式類似的功能
邊看資料實作看看
順便把製作的過程紀錄一下
2009年6月17日 星期三
我是來面試的 不是來搶地盤
今天跑去聯電面試產品工程師
為了節省經費 加上以前就熟悉這條路線
所以交通就決定這樣 機車==>火車==>公車==>步行==>園區公車
在從園區入口走往科技生活館時,看到樹上有隻烏秋
於是隨口吹起哨子跟著他叫
沒想到似乎引來牠的不滿
一路追殺我50公尺..........
回程也一樣 不過烏秋變成兩隻了 依然追殺著我
至於面試過程................唉!!
八成不符要求了.........
不過也多少更認識產品工程師要什麼樣的技能
想要朝這條路玩下去 看樣子還要不斷努力
目前實力嚴重不足..........
也許該挑門檻比較低的工作了
然後趁那段時間得到足夠的能力
話說回來 兩個禮拜前欣詮的面試結果不知道如何
那個是跟以前工作內容一樣的工作阿!!!!
希望能上
為了節省經費 加上以前就熟悉這條路線
所以交通就決定這樣 機車==>火車==>公車==>步行==>園區公車
在從園區入口走往科技生活館時,看到樹上有隻烏秋
於是隨口吹起哨子跟著他叫
沒想到似乎引來牠的不滿
一路追殺我50公尺..........
回程也一樣 不過烏秋變成兩隻了 依然追殺著我
至於面試過程................唉!!
八成不符要求了.........
不過也多少更認識產品工程師要什麼樣的技能
想要朝這條路玩下去 看樣子還要不斷努力
目前實力嚴重不足..........
也許該挑門檻比較低的工作了
然後趁那段時間得到足夠的能力
話說回來 兩個禮拜前欣詮的面試結果不知道如何
那個是跟以前工作內容一樣的工作阿!!!!
希望能上
2009年5月28日 星期四
學perl計劃開始
第1份工作 雖然只有短短的五個月
不過其實見習到很多有趣的東西,unix基本的操作
還有很多工程師會各種不同的程式語言
有的會VBA,有的會C shell,VC,有的會PHP,
反正想的到的程式都有人會......
雖然不是必備要求,沒有要懂很深
不過似乎都能為現實的工作中提高很大的便利性
至少寫個簡單合用的控制介面
縮減繁複的動作
其實從很久以前,我就想好好的學習一下
如何寫程式
也曾經一時衝動買過了教VC++ MFC的書籍
不過相關的背景知識不足 野心又太大
這麼久以來還是沒能弄清楚程式的語法,架構
所以決定回歸原始,重頭開始學起
從簡單的程式開始學 從命令模式程式開始
perl很擅長做文字比對 做報表
語法觀念又能跟很多程式相近
最重要的是他的可攜性高,而且是Free
所以我決定用它當開始
不過我不見得會照一般書本的教法開始看
一邊挑有興趣的章節看
一邊挑以前沒注意到沒學到的觀念看
並在這裡做個學習紀錄
才不會又像以前一樣中途而廢
不過其實見習到很多有趣的東西,unix基本的操作
還有很多工程師會各種不同的程式語言
有的會VBA,有的會C shell,VC,有的會PHP,
反正想的到的程式都有人會......
雖然不是必備要求,沒有要懂很深
不過似乎都能為現實的工作中提高很大的便利性
至少寫個簡單合用的控制介面
縮減繁複的動作
其實從很久以前,我就想好好的學習一下
如何寫程式
也曾經一時衝動買過了教VC++ MFC的書籍
不過相關的背景知識不足 野心又太大
這麼久以來還是沒能弄清楚程式的語法,架構
所以決定回歸原始,重頭開始學起
從簡單的程式開始學 從命令模式程式開始
perl很擅長做文字比對 做報表
語法觀念又能跟很多程式相近
最重要的是他的可攜性高,而且是Free
所以我決定用它當開始
不過我不見得會照一般書本的教法開始看
一邊挑有興趣的章節看
一邊挑以前沒注意到沒學到的觀念看
並在這裡做個學習紀錄
才不會又像以前一樣中途而廢
2009年5月21日 星期四
2009年5月20日 星期三
2009年5月12日 星期二
2009年5月9日 星期六
加速firefox(火狐)網頁瀏覽的方法
突然覺得Firefox開啟網頁有點慢
想到也許可以跟IE一樣做個調整提升開啟速度
網路上搜到這篇作法
===================================================================
除了IE上網之外
很多人都會使用Firefox來當作網路瀏覽器
而我就是Firefox的愛用者
因為現今用IE7上網很不穩定
雖然有很多的人性化的工具列讓你可以輕鬆點閱
但是也此拖慢打開網頁的時間
光是開啟yahoo首頁的時間就要花好幾分鐘或是死當
相較之下Firefox的瀏覽速度比較令我滿意
每當我電腦重灌後就要再一次從新爬文如何再修改增進Firefox瀏覽速度的方法
因此我在此匯集一些大家熟知的方法供各位以及我日後之用
(一)改變火狐瀏覽參數值
1. 在 Firefox的網址欄裡面鍵入 "about:config"。尋找以下幾個欄位:
2. 把 network.http.pipelining和 network.http.proxy.pipelining這兩個欄位的值從 "false" 改成 "true" (直接用滑鼠在這兩行上面連續按兩下即可)。
3. 把 network.http.pipelining.maxrequests這個欄位的值改成大一點的值,例如 "30"。
4. 最後在 "about:config"這個畫面上的任何一個地方按一下滑鼠的右鍵。這個時候會出現一個小選單;選擇 "新增"這個項目,然後選擇 "整數"這個選項。在接下來出現的對話盒當中輸入 "nglayout.initialpaint.delay",按下 "OK"鍵之後會出現另外一個對話盒要求你輸入這個新參數的值。此時請輸入 "0",然後按 "OK"鍵。
完全關閉FireFox後退出,再重新打開FireFox,你將會有不一樣的速度體驗,會有2—3倍的速度提升。
(二) 讓Firefox減少記憶體使用量
其實只要在Firefox設定裡面多加一行文字,之後只要把它縮小到到工作列上,Firefox的記憶體用量就會爆減,最多能讓Firefox的記憶體使用量降低到10MB以下喔。
1.在操作前將Firefox開了七八個分頁,按下「Ctrl」+「Alt」+「Del」三鍵叫出工作管理員,可以看到Firefox用掉了161,988 K的巨量記憶體。
2.接下來切換到Firefox視窗,在網址列輸入「about:config」,就會看到詳細設定清單,在清單上按下滑鼠右鍵叫出選單,選擇【新增】→【真假(Boolean)值】。
3.在「新增真假值設定值」對話盒空格內,輸入「config.trim_on_minimize」後按下確定,下一步選擇「true」後按下確定,之後關閉Firefox並重新啟動。
一般的情況下瀏覽器一次只會向網頁伺服器提出一個連線要求。
如果做了上面這些設定,你的 Firefox將會一次向網頁伺服器提出十個連線要求,
因此連線速度就會大幅增加,在重開 Firefox 後,當你把 Firefox 縮工作列,
就會釋放記憶體了。
基本上藉由上述兩種方法稍做參數的修改即可以使你的Firefox上網速度加快了
通常經過這樣子的修飾後就足以大幅度改善Firefox的瀏覽速度了~~
====================================================================
我的版本是3.0.10
試著修改了一下 暫時還沒去查 修改這些參數的意義
寫在網頁上做個紀錄
順便看一下開啟有沒有真的變快
結論是 感覺上有差'一點點'拉
果然開啟的慢是因為在虛擬機內操作的關係
想到也許可以跟IE一樣做個調整提升開啟速度
網路上搜到這篇作法
===================================================================
除了IE上網之外
很多人都會使用Firefox來當作網路瀏覽器
而我就是Firefox的愛用者
因為現今用IE7上網很不穩定
雖然有很多的人性化的工具列讓你可以輕鬆點閱
但是也此拖慢打開網頁的時間
光是開啟yahoo首頁的時間就要花好幾分鐘或是死當
相較之下Firefox的瀏覽速度比較令我滿意
每當我電腦重灌後就要再一次從新爬文如何再修改增進Firefox瀏覽速度的方法
因此我在此匯集一些大家熟知的方法供各位以及我日後之用
(一)改變火狐瀏覽參數值
1. 在 Firefox的網址欄裡面鍵入 "about:config"。尋找以下幾個欄位:
2. 把 network.http.pipelining和 network.http.proxy.pipelining這兩個欄位的值從 "false" 改成 "true" (直接用滑鼠在這兩行上面連續按兩下即可)。
3. 把 network.http.pipelining.maxrequests這個欄位的值改成大一點的值,例如 "30"。
4. 最後在 "about:config"這個畫面上的任何一個地方按一下滑鼠的右鍵。這個時候會出現一個小選單;選擇 "新增"這個項目,然後選擇 "整數"這個選項。在接下來出現的對話盒當中輸入 "nglayout.initialpaint.delay",按下 "OK"鍵之後會出現另外一個對話盒要求你輸入這個新參數的值。此時請輸入 "0",然後按 "OK"鍵。
完全關閉FireFox後退出,再重新打開FireFox,你將會有不一樣的速度體驗,會有2—3倍的速度提升。
(二) 讓Firefox減少記憶體使用量
其實只要在Firefox設定裡面多加一行文字,之後只要把它縮小到到工作列上,Firefox的記憶體用量就會爆減,最多能讓Firefox的記憶體使用量降低到10MB以下喔。
1.在操作前將Firefox開了七八個分頁,按下「Ctrl」+「Alt」+「Del」三鍵叫出工作管理員,可以看到Firefox用掉了161,988 K的巨量記憶體。
2.接下來切換到Firefox視窗,在網址列輸入「about:config」,就會看到詳細設定清單,在清單上按下滑鼠右鍵叫出選單,選擇【新增】→【真假(Boolean)值】。
3.在「新增真假值設定值」對話盒空格內,輸入「config.trim_on_minimize」後按下確定,下一步選擇「true」後按下確定,之後關閉Firefox並重新啟動。
一般的情況下瀏覽器一次只會向網頁伺服器提出一個連線要求。
如果做了上面這些設定,你的 Firefox將會一次向網頁伺服器提出十個連線要求,
因此連線速度就會大幅增加,在重開 Firefox 後,當你把 Firefox 縮工作列,
就會釋放記憶體了。
基本上藉由上述兩種方法稍做參數的修改即可以使你的Firefox上網速度加快了
通常經過這樣子的修飾後就足以大幅度改善Firefox的瀏覽速度了~~
====================================================================
我的版本是3.0.10
試著修改了一下 暫時還沒去查 修改這些參數的意義
寫在網頁上做個紀錄
順便看一下開啟有沒有真的變快
結論是 感覺上有差'一點點'拉
果然開啟的慢是因為在虛擬機內操作的關係
2009年5月6日 星期三
2009年5月4日 星期一
Hem's home開張了
每次看到朋友用網誌,或是相簿來紀錄生活點滴 都覺得對方好有心 願意花時間紀錄自己的生活
雖然我自己也曾經申請過好幾個blog 不過從沒有認真在經營 直到帳號自然失效
因為我是個懶人 常常會提不起勁做事阿
不過最近晚上偶然開始回想過去 腦中卻是一片空白
平白的讓好多回憶自然流逝了
又興起了紀錄自己生活點滴的念頭
記得好像有個朋友的網誌開頭說過
"文章是寫給自己看的~或許文筆很爛~但這就是我的生活"
雖然我覺得現在的生活非常枯燥
而且非常不如意 說不定也沒紀念回憶的價值
但是也許在一段時間後 我能透過自己的點滴紀錄
抒發自己的心情 還有了解自己的成長
-枯燥煩雜的歷史,卻聯接著過去與未來,從點滴的紀錄中,也許能看出有趣的事-
雖然我自己也曾經申請過好幾個blog 不過從沒有認真在經營 直到帳號自然失效
因為我是個懶人 常常會提不起勁做事阿
不過最近晚上偶然開始回想過去 腦中卻是一片空白
平白的讓好多回憶自然流逝了
又興起了紀錄自己生活點滴的念頭
記得好像有個朋友的網誌開頭說過
"文章是寫給自己看的~或許文筆很爛~但這就是我的生活"
雖然我覺得現在的生活非常枯燥
而且非常不如意 說不定也沒紀念回憶的價值
但是也許在一段時間後 我能透過自己的點滴紀錄
抒發自己的心情 還有了解自己的成長
-枯燥煩雜的歷史,卻聯接著過去與未來,從點滴的紀錄中,也許能看出有趣的事-
訂閱:
文章 (Atom)