想做出跟我一樣的記事本嗎
以下就是教學
記事本-進階版
————————————————————————–
需要引進的特殊元件: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行
若有哪裡打錯請告知一下
看完請回覆