這一次要講解檔案的各個功能,就先從開新檔案的功能開始吧!先看程式碼:
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 給我一起討論,謝謝!

回到VB教學教室