2009年9月25日 星期五

久違半個月的面試

因為隨手亂投到了一間做自動化控制 又小又新的公司

來面試的課長超級年輕68年次的
工作要求主要是要會VC++
物件之類的東東
跟我所學及第一份工作完全是不一樣的
原以為會有些考試
不過似乎只有稍微聊聊而已
工作有可能要出差 還有問會不會開車
有可能到大陸出差

昨天 應該是前天晚上
大學同學勳哥除然傳MSN來
聊到他現在在南科做tsmc的擴散eq
看樣子我要多加油阿

2009年9月21日 星期一

文件管理系統

最近一直在excel home閒逛
看到了人家分享的文件管理系統
想起我之前在研究treeview物件
人家用一般的vba功能就寫出來了
我來試著改成中文版
還有一並用treeview物件寫同樣功能來看一下吧

浪費了一個假日

這次的假日 突然想把系統升級成windows7
結果因為windows7剛出沒多久
破解技術還很不完全 很多產品序號都被鎖了
看到那個使用盜版的訊息實在很不爽
最後還是換回xp
但是心有不甘 所以下載了 window 7 remix這種佈景主題
至少將畫面升成像windows7
大致上很順利
可是歡迎畫面卻是亂碼 所以還是被我打槍
結果還是要重灌
等我全部弄的跟之前一樣的時候
一天已經過去了

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 啦。

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
不過這個做法有個條件
就是預定要移入的資料夾必須先存在

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 '關閉檔案

2009年9月17日 星期四

沉迷於聊天室

沒想到我居然做了這種事
居然花很多時間在聊天室上
在那種只有安安幾歲多重 或是age/sex/location
的地方耗一整天
我真是太無聊了

弟弟的電腦壞了
要不要貢獻一點資金呢

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

研究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

研究treeview物件1

離上次發文隔了半個月
去excel home找了些許資料
也下載了別人的範例
有一些可以執行
接下來詳細看看 研究一下物件怎麼用
順便想想可以用這種物件幹嘛

寫程式還是要以目的為出發點
去構築拼湊想要的功能

2009年9月9日 星期三

發呆了好幾天

連續窩在電腦前面好幾天了
重複做著消耗時間沒有意義的事
逛PTT 在facebook種田 看漫畫
除了吃飯睡覺大便
剩下的時間全耗在這上面
開始出現枯燥感
應該換個消耗時間的方式

去念念英文好了

面試京元

前幾天京元某主管打電話來請我去面試
於是昨天去了
四個月前我有去面試過
很可惜的 從此沒有下文
不過我記得面試的人資大哥很帥
這次去還跟他打了聲招呼

這次去面試是課長自己約的
對我有禮遇阿
英文考不好
還讓我考第二次
成績高很多
頓時有種聽牌的感覺
說不定真的有機會肯收

話說回來
福利變好低喔
14個月的年薪都取消了
只剩12個月正常薪水了
三節禮金生日禮金等福利都還要視情況發放


希望公司真的願意用

2009年9月4日 星期五

說不定真的可以把系統改成ubuntu

幫妹妹買了筆電
這下電腦變成一人一台了
也許我能夠真的將linux系統當成主系統
而不用再藉著虛擬機玩那種被閹割般的運算速度所限制的系統了
試著打造個完美的系統吧

大破財

我的存款終於只剩十萬元了
幫妹妹買了筆電花了兩萬多
又幫爸爸付了第四台的錢
現在頭好大阿
不知道我還能撐多久