這一次要講解檔案的各個功能,就先從開新檔案的功能開始吧!先看程式碼:
Private Sub LoadNewFile_Click()
Dim i As Integer
Dim j As Integer
'Check Update Flag,Ask User Cancel,If No then Exit sub
'Else,Clear ProFile Data and List Box Item,Reset Control Type,Reset Update Flag
If ProFileUpdate = True Then
If MsgBox("你目前所做的設定並沒有儲存,要放棄嗎?", vbYesNo Or vbQuestion, "系統訊息") = vbNo Then Exit Sub
End If
If LoadFileUpdate = True Then
If MsgBox("你沒有儲存檔案!如果開啟一個新的設定檔 ,現在所更改的設定都將無效!要開啟檔案嗎?", vbQuestion Or vbYesNo) = vbNo Then Exit Sub
End If
'If MsgBox("要開啟新的設定檔嗎?", vbYesNo Or vbQuestion) = vbYes Then
If lstAddData.ListCount > 0 Then
j% = lstAddData.ListCount
For i% = j% To 1 Step -1
lstAddData.RemoveItem i% - 1
ProFile(i%).PicFile = ""
ProFile(i%).DelayTime = 0
ProFile(i%).MidiFile = ""
ProFile(i%).ReplayMidi = 0
ProFile(i%).WavFile = ""
ProFile(i%).ReplayWav = 0
ProFile(i%).FullPicture = 0
ProFile(i%).AddText = ""
ProFile(i%).TextSet.Name = ""
ProFile(i%).TextSet.Size = 0
ProFile(i%).TextSet.Color = 0
ProFile(i%).TextSet.Alignment = 0
ProFile(i%).Effect = 0
Next i%
End If
PictureSUM = 0
SetProFileNo = 0
LoadingFileName = ""
picName$ = ""
prePicName$ = ""
imgPreView.Picture = LoadPicture()
imgPreView.Move imgBackGround.Left + 2, imgBackGround.Top + 2
imgPreView.Width = imgBackGround.Width - 4
imgPreView.Height = imgBackGround.Height - 4
Call SetControlEnabled(False)
SetControlFlag = False
Call StopMusic
ProFileUpdate = False
LoadFileUpdate = False
saveFile.Caption = "儲存檔案"
'End If
End Sub
這個功能非常的簡單,概念就是,把所有的資料清除,就這樣子而已。在清除之前,可別忘了先
檢查一下檔案有沒有變動過(ProfileUpdate、LoadfileUpdate),這個是每個編輯程式都該有的
"禮貌",確定User要開新檔,才把資料清除,一些變數也要清掉,程式沒有規劃好的話,很容易
因為忘了清除某個變數而發生錯誤,要多注意(By 過來人的經驗談 :<)。
接下來是載入檔案功能,載入檔案功能所作的大致上與開新檔案時大同小異,檢查過檔案有沒有變更,
確定使用者的要求,即可進行開檔的工作。先看一下程式
Private Sub LoadFile_Click()
If LoadFileUpdate = True Then
If MsgBox("你沒有儲存檔案!如果開啟一個新的設定檔 ,現在所更改的設定都將無效!要開啟檔案嗎?", vbQuestion Or vbYesNo) = vbNo Then Exit Sub
End If
LoadFileName = ""
FileDialogType = FILE_DIALOG_LOAD
frmFileDialog.Show 1
If LoadFileName <> "" Then
lstAddData.Clear
Call LoadProFileData(LoadFileName)
'略 ,參數 物件設定
End If
End Sub
這裡作的都很簡單,叫出檔案對話盒,然後將使用者選的檔案載入即可,再來對物件做好相關
設定即可,主要的重點在LoadProFileData這一段副程式(相同的,你也可以把對話盒換成VB的
物件)
Private Sub LoadProFileData(LoadFile As String)
Dim fNum%, rBuf$, i%, no%
'Load ProFileData ,
'1.Check File Error,Head Data, If No Error Then InPut File to ProFile
'2.Get Picture Sum, Save the Load FileName, Change Menu SaveFile's Caption
On Error GoTo LoadError_Handle
If Dir$(LoadFile) <> "" And LoadFile <> "" Then
'Check Head Data
fNum% = FreeFile
Open LoadFile For Input As #fNum%
Line Input #fNum%, rBuf$
If rBuf$ <> "'[Please Don't Change This File!]" Then
MsgBox "開啟設定檔發生錯誤!請檢查檔案是否正確或經過修改!"
Exit Sub
End If
Line Input #fNum%, rBuf$
If rBuf$ <> "'[請勿更改此設定檔內容!否則系統可能無法正常運作!]" Then
MsgBox "開啟設定檔發生錯誤!請檢查檔案是否正確或經過修改!"
Exit Sub
End If
Line Input #fNum%, rBuf$
If rBuf$ <> "'[Screen Saver Maker Profile Information]" Then
MsgBox "開啟設定檔發生錯誤!請檢查檔案是否正確或經過修改!"
Exit Sub
End If
'Input ProFile Data
no% = 0
Do Until EOF(fNum%)
no% = no% + 1
Line Input #fNum%, rBuf$
Line Input #fNum%, ProFile(no%).PicFile
Line Input #fNum%, ProFile(no%).MidiFile
Line Input #fNum%, ProFile(no%).WavFile
Line Input #fNum%, ProFile(no%).AddText
Line Input #fNum%, rBuf$
ProFile(no%).TextSet.Color = CLng(Val(rBuf$))
Line Input #fNum%, rBuf$
ProFile(no%).TextSet.Size = CInt(Val(Left(rBuf$, 2)))
ProFile(no%).TextSet.Alignment = CInt(Val(Mid$(rBuf$, 3, 2)))
ProFile(no%).TextSet.Name = Right$(rBuf$, Len(rBuf$) - 4)
Line Input #fNum%, rBuf$
ProFile(no%).ReplayMidi = CInt(Val(Left(rBuf$, 2)))
ProFile(no%).ReplayWav = CInt(Val(Mid$(rBuf$, 3, 2)))
ProFile(no%).FullPicture = CInt(Val(Mid$(rBuf$, 5, 2)))
ProFile(no%).Effect = CInt(Val(Mid$(rBuf$, 7, 2)))
ProFile(no%).DelayTime = CInt(Val(Right$(rBuf$, 2)))
Loop
Close #fNum%
PictureSUM = no%
For i% = 1 To no%
lstAddData.AddItem ProFile(i%).PicFile
Next i%
LoadingFileName = UCase$(LoadFile)
For i% = Len(LoadingFileName) To 1 Step -1
If Mid$(LoadingFileName, i%, 1) = "\" Then
saveFile.Caption = "儲存檔案 (" & Right$(LoadingFileName, Len(LoadingFileName) - i%) & ")"
Exit For
End If
Next i%
End If
Exit Sub
LoadError_Handle:
MsgBox "開啟設定檔發生錯誤!請檢查檔案是否正確或經過修改!"
Resume LoadErrorQuit
LoadErrorQuit:
Close #fNum%
Exit Sub
End Sub
這段副程式作的工作有幾個,首先,先檢查檔案的檔頭,我寫了三行廢話,
'[Please Don't Change This File!]
'[請勿更改此設定檔內容!否則系統可能無法正常運作!]
'[Screen Saver Maker Profile Information]
雖然我已經取了很冷僻的副檔名了,不過,為了保險起見,加個檔頭,能確定這個就
是自己要的設定檔還是比較好的,順便提醒一下User不要亂動檔案,如果檔頭檢查發生錯誤,
當然就不是所要的設定檔囉!這裡要提醒一下,如果你要改成使用VB的檔案對話盒,
要記得在發生錯誤時跳出程式(是呼叫這個副程式的主要程式喔!不是跳出這一段副程式就好
了),看你是要設一個變數或將副程式改成Function,不然載入錯誤卻繼續往下Run會有錯誤
的(因為我是在檔案對話盒選取檔案時,就Check過了,所以打開的檔案可以確定是正確的,
所以這裡你看不到錯誤的處理,你可以自己先看一下檔案對話盒的程式),接下來就是載入設
定檔的資料,ProFile的資料儲存格式如下
[ProFile Data 001]
設定編號
C:\WALL\THEME001.BMP
圖檔的完整路徑
C:\MIDI\PLAY01.MID
MIDI檔的完整路徑
C:\WAVE\PLAY01.WAV
WAVE檔的完整路徑
天氣真好
使用者加入的文字
-002147483630
文字的顏色
1204新細明體
字型大小(2Byte)對齊方式(2Byte)字型名稱
0000010710
是否重覆播放MIDI(2Byte) WAV(2Byte)圖片是否自動縮放(2Byte)特效的代碼(2Byte)圖片的延遲時間
我們只要依此格式將檔案一一的代入ProFile之中即可,但是...!!!
這裡我犯了一個很嚴重的錯誤....,我忘記把ProFile裡的資料清除了....,
大Bug ....,請在'Input ProFile Data之後,將編號no%以後的ProFile資料清除,
否則如果你先載入十筆資料的檔案再載入三筆資料的檔案,當你加入第四筆檔案時,
會發現設定值沒有初使化....,至於為什麼要載入完之後再清除呢?因為即使檔案
的檔頭正確,如果內容被更改過,在載入的過程還是可能發生錯誤,所以還是等
載入完成後再將多餘的資料清除比較保險。
O.K.,最後我作了一點小功夫,將檔名顯示出來,儲存檔案的時候可以知道儲存的檔名,
可有可無,看自己的想法。接下來講儲存檔案,儲存分兩種,一種是照目前的檔名直接儲存覆蓋
,另一種則是另存一個新的檔案,不影響現有的檔案,至於是一個全新的檔案的話,不管他是儲
存檔案或是另存新檔都一律當成另存新檔來處理,還有一種特殊情況,一筆資料都沒有,
那我們該不該讓User執行存檔的目的呢?我想是否定的,畢竟,你存一個沒有資料的空白檔案,
對這個程式沒有認何的用處的,所以我就把它跳過了,現在來看一下儲存檔案的程式碼
Private Sub saveFile_Click()
'Check Save Type,SaveFile,Or New File Save,Then Call Save File Handle
If LoadingFileName = "" Then
If ProFileUpdate = True Then
MsgBox "請先將設定值儲存,再進行儲存的指令", vbOKOnly Or vbInformation
Exit Sub
End If
If PictureSUM <= 0 Then
MsgBox "沒有資料!無法儲存!", vbOKOnly Or vbInformation
Exit Sub
End If
LoadFileName = ""
FileDialogType = FILE_DIALOG_SAVE
frmFileDialog.Show 1
If LoadFileName <> "" Then
Dim i As Integer
For i% = Len(LoadFileName) To 1 Step -1
If Mid$(LoadFileName, i%, 1) = "\" Then
saveFile.Caption = "儲存檔案(" & LoadFileName & ")"
Exit For
End If
Next i%
LoadingFileName = LoadFileName
End If
Else
Call SaveProFileData(LoadingFileName)
End If
End Sub
首先我們先Check LoadingFileName確定現在是要儲存已開啟的設定檔或者是一個全新的檔案,
如果是全新的檔案,我們就要叫出檔案對話盒讓使用者輸入檔名再加以儲存,另存新檔的儲存
是在檔案對話盒處理的,如果儲存成功,LoadFileName會傳回儲存檔名,在儲存前別忘了Check
設定檔是否變更過又沒有儲存,或者檔案裡沒有資料,確定之後再加以儲存。如果是已開啟的
檔案,就直接呼叫SaveProFileData處理
Private Sub SaveProFileData(saveFile As String)
Dim i%, fName$, fNum%, rBuf$
'Save ProFile Data
'1.Check ProFile Update value,If True then Exi Sub
'2.Check Picture Sum,If Zero then Exit Sub
'3.Save ProFile Data to Save File and Check the Save Type - Default or ProFile
'4.When Save O.K. then Reset Update Flag
On Error GoTo SaveError_Handle
If ProFileUpdate = True Then
MsgBox "請先將設定值儲存,再進行儲存的指令", vbOKOnly Or vbInformation
Exit Sub
End If
If PictureSUM <= 0 Then
MsgBox "沒有資料!無法儲存!", vbOKOnly Or vbInformation
Exit Sub
End If
Me.MousePointer = 11
fNum% = FreeFile
Open saveFile For Output As #fNum
rBuf$ = "'[Please Don't Change This File!]" & vbCrLf & "'[請勿更改此設定檔內容!否則系統可能無法正常運作!]" & vbCrLf & "'[Screen Saver Maker Profile Information]"
Print #fNum, rBuf$
For i% = 1 To PictureSUM
'略 將資料寫入檔案之中
Next i%
Close #fNum%
LoadFileUpdate = False
Me.MousePointer = 0
MsgBox "儲存完畢", vbInformation Or vbOKOnly
Exit Sub
SaveError_Handle:
MsgBox "存檔時發生錯誤,請確定輸入的檔名及路徑是否正確", vbExclamation & vbOKOnly
Resume SaveErrorOuit
SaveErrorOuit:
Close #fNum%
Exit Sub
End Sub
這裡作的就很單純了,將檔頭及資料寫入檔案中即可,除此之外就沒什麼特別的地方了。
最後在另存新檔方面,所作的處理其實和儲存檔案一樣,開啟使用者輸入的檔案名稱,再將
資料寫入即可,唯一不同的是多做了一段原檔案已存在,要不要覆蓋原檔的處理。有興趣的
再自己研究一下吧!
後記
設定視窗的講解大概就是這樣子了,接下來要開始講解螢幕保護程視實際動作的視窗了,
敬請期待!對了!還有一項設定桌布的功能忘記講解了,這算附加功能,不很重要,
我再挑一段時間把它補上去,多多包涵囉!
話說回來,為了寫這個教學文件,又讓我發現了不少的Bug,在測試的時候一直沒發現,
最後在Screen Saver Maker教學文件告一段落的時候,我會重新整理一次,再將正式的
1.0版放出來給大家的
開站至今,教學文件已經寫了第七篇了,每天上站的人數大概都維持在100人次左右,
也有些人寫過Email給我,但是關於教學文件的內容一直沒有人反應,我也始終維持
自己的撰寫風格,但是,寫者寫者,總是會懷疑,這樣的寫法好不好,如果你有任何
意見的話,歡迎EMail
給我一起討論,謝謝!
|