[教學][vb]記事本-進階版

[vb]記事本-進階版–超完整教學

想做出跟我一樣的記事本嗎

以下就是教學

記事本-進階版
————————————————————————–
需要引進的特殊元件:CommonDialog(Ctrl+T可以引進)
————————————————————————–
製作前準備
Command1 開啟檔案
Command2 儲存檔案
Command3 加入時間
Command4 離開
Command5 開新檔案
Command6 另存新檔
Command7 透明度-變深
Command8 透明度-變淡
Command9 透明度
Command10 透明度-隱藏
Text1 打字區
Label1 檔案位置
Label2 檔案位置(永遠維持空白)
Label3 透明度值(預設200)
Label5 版權
Frame1 透明度
Timer1 驗證 透明度
CommonDialog1 開啟檔案的彈跳視窗
————————————————————————–
製作 前敘

請先拉1個CommonDialog 再往下看

————————————————————————–
製作 “開新檔案”

代碼:

Private Sub Command5_Click()
Form1.Caption = “SKY記事本V2.0” ‘設定標題
Label1 = “” ‘新的檔案沒有檔案位置 所以要=””
Text1 = “” ‘新的文件內容是空的
End Sub

————————————————————————–
製作 “開啟檔案”

製作彈跳視窗

代碼:

Dim SFileName, SFilePath As String

Dim SFreeM(0) As String

Dim SInItems(0 To 5) As String

Dim LFreeM(0 To 1) As Long

Dim IFreeM(0 To 2) As Integer

Dim textline

On Error Resume Next

SFilePath = “”

SFileName = “”

CommonDialog1.DialogTitle = “開啟檔案” ‘標題

CommonDialog1.InitDir = App.Path ‘開啟的目錄

CommonDialog1.FileName = “”

CommonDialog1.Filter = “TXT 檔案(*.txt)|*.txt|所有 檔案(*.*)|*.*” ‘開啟的檔案名稱用”|”分開

CommonDialog1.ShowOpen

If Err.Number <> 0 Or CommonDialog1.FileTitle = “” Then ‘使用者按下取消按鈕

Exit Sub

End If

If InStr(1, Right(CommonDialog1.FileTitle, 4), “.log”, vbTextCompare) > 0 Then

SFileName = CommonDialog1.FileTitle

Else

SFileName = CommonDialog1.FileTitle ‘檔案名稱

End If

SFilePath = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) ‘檔案所在的目錄

設定讀取檔案

已知SFileName是檔案名稱 SFilePath是檔案所在的目錄

所以SFilePath+SFileName就是檔案的路徑

代碼:

Open SFilePath + SFileName For Input As #1 ‘開啟 SFilePath+SFileName

Text1 = “” ‘讓打字區為空白

Do While Not EOF(1)

Line Input #1, textline

Text1 = Text1 & textline & vbCrLf ‘讓打字區為檔案內容

Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0” ‘設定標題

Label1 = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) + SFileName ‘顯示檔案路徑

Loop

Close #1 ‘結束

但常常會遇到一種情況

在前面的”開啟檔案”視窗 如果按取消 也就是沒有選擇檔案

那麼SFilePath+SFileName就會等於空白(SFilePath+SFileName=””)

SFilePath+SFileName為空白 開以檔案就會當掉 (不信可以自己試試看)

所以為了避免這種事情發生

要在開啟檔案前面加個驗證

確保檔案是真的存在

最簡單就是用IF

只要當檔案路徑不=””就可以了

代碼:

If SFilePath + SFileName <> Label2 Then

End If

把上面的語法加入

就會成為

代碼:

If SFilePath + SFileName <> Label2 Then

Open SFilePath + SFileName For Input As #1 ‘開啟 SFilePath+SFileName

Text1 = “” ‘讓打字區為空白

Do While Not EOF(1)

Line Input #1, textline

Text1 = Text1 & textline & vbCrLf ‘讓打字區為檔案內容

Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0” ‘設定標題

Label1 = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) + SFileName ‘顯示檔案路徑

Loop

Close #1 ‘結束
End If

————————————————————————–
製作 “儲存檔案”

前面儲存視窗跟開啟視窗是相同的

所以這一部分簡單略過

代碼:

Dim SFileName, SFilePath, SFileall As String

On Error Resume Next

CommonDialog1.DialogTitle = “儲存檔案”

CommonDialog1.FileName = “”

CommonDialog1.Filter = “TXT 檔案(*.txt)|*.txt|所有 檔案(*.*)|*.*”

CommonDialog1.ShowSave

If Err.Number <> 0 Or CommonDialog1.FileTitle = “” Then ‘使用者按下取消按鈕

Exit Sub

End If

If InStr(1, Right(CommonDialog1.FileTitle, 4), “.log”, vbTextCompare) > 0 Then

SFileName = CommonDialog1.FileTitle

Else

SFileName = CommonDialog1.FileTitle

End If

SFilePath = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle))

SFileall = SFilePath + SFileName ‘整合好了檔案路徑

If SFileall <> Label2 Then ‘判別檔案路徑

Open SFileall For Output As #1

Print #1, Text1

Close #1

Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0”

Label1 = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) + SFileName

End If

儲存檔案可分為另存新檔案和直接儲存

甚麼意思呢?

就是要判別這個檔案是不是已經存在了

若檔案不存在

就會跳出一個視窗

要我們選擇存在哪裡

Label1為檔案位置顯示的地方

若Label1=”” 就代表檔案位置是沒有的 所以要有彈跳視窗

若Label1<>“” 就代表檔案位置是有的 不要有彈跳視窗 直接儲存

可以做出下列語法

代碼:

If Label1 = “” Then

Dim SFileName, SFilePath, SFileall As String

On Error Resume Next

CommonDialog1.DialogTitle = “儲存檔案”

CommonDialog1.FileName = “”

CommonDialog1.Filter = “TXT 檔案(*.txt)|*.txt|所有 檔案(*.*)|*.*”

CommonDialog1.ShowSave

If Err.Number <> 0 Or CommonDialog1.FileTitle = “” Then ‘使用者按下取消按鈕

Exit Sub

End If

If InStr(1, Right(CommonDialog1.FileTitle, 4), “.log”, vbTextCompare) > 0 Then

SFileName = CommonDialog1.FileTitle

Else

SFileName = CommonDialog1.FileTitle

End If

SFilePath = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle))

SFileall = SFilePath + SFileName

If SFileall <> Label2 Then

Open SFileall For Output As #1

Print #1, Text1

Close #1

Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0”

Label1 = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) + SFileName

End If
End If

If Label1 <> “” Then

Open Label1 For Output As #1 ‘因為檔案路徑是Label1 所以存到Label1

Print #1, Text1

Close #1

Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0”

Label1 = Label1
End If

————————————————————————–
製作 “另存新檔”

另存新檔跟儲存檔案的Label1 = “”一樣

所以節省版面 直接貼語法

代碼:

Dim SFileName, SFilePath, SFileall As String

On Error Resume Next

CommonDialog1.DialogTitle = “另儲存紀錄”

CommonDialog1.FileName = “”

CommonDialog1.Filter = “TXT 檔案(*.txt)|*.txt|所有 檔案(*.*)|*.*”

CommonDialog1.ShowSave

If Err.Number <> 0 Or CommonDialog1.FileTitle = “” Then ‘使用者按下取消按鈕

Exit Sub

End If

If InStr(1, Right(CommonDialog1.FileTitle, 4), “.log”, vbTextCompare) > 0 Then

SFileName = CommonDialog1.FileTitle

Else

SFileName = CommonDialog1.FileTitle

End If

SFilePath = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle))

SFileall = SFilePath + SFileName
If SFileall <> Label2 Then
Open SFileall For Output As #1
Print #1, Text1
Close #1
Form1.Caption = CommonDialog1.FileTitle + “-SKY記事本V2.0”
Label1 = Mid(CommonDialog1.FileName, 1, Len(CommonDialog1.FileName) – Len(CommonDialog1.FileTitle)) + SFileName
End If

若有地方看不懂請回覆一下

————————————————————————–
製作 “加入時間”

代碼:

Text1 = Text1 & vbCrLf & Date$ + ” ” + Time$

加入的時間通常會要換行

所以要在TEXT1後面加上vbCrLf 前後用&隔開

————————————————————————–
製作 “透明度”

先拉一個Frame

他要先隱藏

所以Visible = False

Command9是要解除Frame的隱藏

代碼:

Frame1.Visible = True

Command10是隱藏Frame

代碼:

Frame1.Visible = False

透明度的宣告

代碼:

Private Declare Function GetWindowLong Lib “user32” Alias _

“GetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib “user32” Alias _

“SetWindowLongA” (ByVal hwnd As Long, ByVal nIndex As Long, _

ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib “user32” _

(ByVal hwnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, _

ByVal dwFlags As Long) As Long

Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const WS_EX_TRANSPARENT = &H20&
Private Const LWA_ALPHA = &H2&
Dim lOldStyle As Long, i As Long
Dim bTrans As Byte

Option Explicit

貼在程式碼的最上面

Command7是透明度+10(變深)

代碼:

Label3 = Label3 + 10

Me.Visible = False

bTrans = Label3 ‘透明度 0~255之間 越小越透明

lOldStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)

SetWindowLong Me.hwnd, GWL_EXSTYLE, lOldStyle Or WS_EX_LAYERED

SetLayeredWindowAttributes Me.hwnd, 0, bTrans, LWA_ALPHA

Me.Visible = True

Me.Refresh

Command8是透明度-10(變淺)

代碼:

Label3 = Label3 – 10

Me.Visible = False

bTrans = Label3 ‘透明度 0~255之間 越小越透明

lOldStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)

SetWindowLong Me.hwnd, GWL_EXSTYLE, lOldStyle Or WS_EX_LAYERED

SetLayeredWindowAttributes Me.hwnd, 0, bTrans, LWA_ALPHA

Me.Visible = True

Me.Refresh

當然為了讓程式好看

所以要在開啟程式時就會自動載入透明度

在Form_Load中

代碼:

Me.Visible = False

bTrans = 200 ‘透明度 0~255之間 越小越透明

lOldStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)

SetWindowLong Me.hwnd, GWL_EXSTYLE, lOldStyle Or WS_EX_LAYERED

SetLayeredWindowAttributes Me.hwnd, 0, bTrans, LWA_ALPHA

Me.Visible = True

Me.Refresh

請注意

透明度質不能超過255喔

————————————————————————–
製作 “離開按鈕”

如果每個人的離開都只有用END的話

看起來就會決得沒啥特別

像我就在離開前加上版權

代碼:

MsgBox “By SKY” & vbCrLf & “作者:SKY” & vbCrLf & “http://blog.xuite.net/sky0919382/sky”

你可以自己改掉
————————————————————————–
製作 “離開版權”

上面的方式是按按鈕才會出現版權

若有人不想看版權就想關閉

一定會按右上角的X來關閉程式

這樣就不能達到宣傳的功用

所以也要在X上加上版權

代碼:

Private Sub Form_Unload(Cancel As Integer)

MsgBox “By SKY” & vbCrLf & “作者:SKY” & vbCrLf & “http://blog.xuite.net/sky0919382/sky”
End Sub

只要把Form的型態改成Unload

就可以了

但不要傻傻的把Form_Load改成Form_Unload

————————————————————————–

好長阿種共有367行

若有哪裡打錯請告知一下

看完請回覆

在〈[教學][vb]記事本-進階版〉中有 2 則留言

留言功能已關閉。