2012-05-16 37 views
0

我正在創建一個視頻遊戲,我需要一次顯示文本一個字符,而互聯網的其他部分幾乎沒有什麼幫助,因爲它們是針對我一無所知的較舊版本的Visual Basic。如何在Visual Basic 2010中編碼打字機效果?

這裏是我的錯誤代碼:

Dim outfile As IO.StreamWriter 
Dim infile As IO.StreamReader 

Private Sub StartScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    Dim strTitle As String = " " 
    Dim strText() As String = {} 
    Dim intLoop As Integer = 0 

    If IO.File.Exists("save.txt") = False Then 
     outfile = IO.File.CreateText("save.txt") 
    End If 

    infile = IO.File.OpenText("save.txt") 
    Do Until infile.Peek = -1 
     strText(intLoop) = infile.Read 
     System.Threading.Thread.Sleep(1000) 
     intLoop += 1 
    Loop 
    intLoop = 0 
    Do While strText.Length <> intLoop 
     strTitle = strText(intLoop) 
     lblTitle.Text = lblTitle.Text & strTitle 
     intLoop += 1 
    Loop 
    infile.Close() 
    outfile.Close() 
End Sub 
+0

爲什麼你的代碼有問題?它做什麼(或不做)你不明白? –

+0

它根本不顯示錶格 – Kentaro51

回答

0

首先 - 從你的主要問題截然分開 - 似乎你Thread.Sleep是放錯了地方。當你將文件讀入內存時,你正在睡覺,但是當你將文本複製到你的`lblTitle'時不會 - 因此你花了很長時間來閱讀文件,然後立即將整個文件複製到UI中。這不是您要查找的效果:讀取整個文件,並將延遲放入第二個循環中。

您的表單沒有顯示的原因是您的所有代碼都在表單的_Load方法中,並且表單在完成之前不會顯示。所以,相反,您的表單將隱藏在您文字中的相同秒數內。它應該最終出現,但這不是你所追求的效果,我敢肯定!

處理此問題的最直接方法是將所有代碼都推送到單獨的方法中,並在後臺線程上調用該方法。這將允許您的表單加載並顯示,後臺線程將繼續處理您的文本。但是,您將需要稍微修改代碼,因爲您無法從後臺線程修改您的UI。查找Invoke和/或BeginInvoke方法以瞭解如何解決此問題。

另一種解決方案是取出您的Thread.Sleep(1000),將您的代碼移至單獨的方法,並在Timer上調用該方法。計時器每秒可以觸發一次,並每次添加文本的下一個字符。這可能會產生更清晰的代碼,但是您可能希望確保您正在閱讀並立即關閉文件,而不是(正如您現在所做的那樣)在整個過程完成之前將文件鎖定。