2013-05-02 47 views
0

我總是能夠在這裏搜索我需要的東西,而且我通常很容易找到它,但這似乎是一個例外。Visual Basic(2010) - 在嵌入式文本文件中使用變量?

我正在用Visual Basic 2010 Express編寫一個程序,它是一個相當簡單的基於文本的冒險遊戲。

我有一個故事,根據您選擇的按鈕/選項有多個可能的路徑。 每個故事路徑的文本保存在其自己的嵌入式資源.txt文件中。我可能只是寫入文本文件的內容直接到VB中,這將解決我的問題,但這不是我想要做到這一點,因爲那最終會看起來非常混亂。

我的問題是,我需要我的故事中使用的變量名,這裏的嵌入文本文件之一的內容的一個例子,

"When "+playername+" woke up, "+genderheshe+" didn't recognise "+genderhisher+" surroundings." 

我用下面的代碼文件讀入到我的文本框

Private Sub frmAdventure_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim thestorytext As String 
    Dim imageStream As Stream 
    Dim textStreamReader As StreamReader 
    Dim assembly As [Assembly] 
    assembly = [assembly].GetExecutingAssembly() 
    imageStream = assembly.GetManifestResourceStream("Catastrophe.CatastropheStoryStart.png") 
    textStreamReader = New StreamReader(assembly.GetManifestResourceStream("Catastrophe.CatastropheStoryStart.txt")) 
    thestorytext = textStreamReader.ReadLine() 
    txtAdventure.Text = thestorytext 
End Sub 

其中一期工程在一定程度上,但究竟顯示,因爲它是在文本文件中,保存的報價和+ S和變量名,而不是去掉引號和+ S和更換變量名稱與存儲在變量中的內容。

任何人都可以告訴我需要更改或添加這項工作嗎?

謝謝,並表示道歉,如果這已被回答某處,我只是沒有認識到它的解決方案或不知道該找什麼或找什麼。

回答

1

由於您的應用程序已編譯,因此您不能只將一些VB代碼放入文本文件並在讀取時執行它。

可以做什麼,以及通常做,是你離開一定標籤您的文本文件中,然後找到他們,並與實際值進行替換。

例如:

When %playername% woke up, %genderheshe% didn`t recognise %genderhisher% surroundings. 

然後在你的代碼,你會發現所有的標籤:

Dim matches = Regex.Matches(thestorytext, "%(\w+?)%") 
For Each match in matches 
    ' the tag name is now in: match.Groups(1).Value 
    ' replace the tag with the value and replace it back into the original string 
Next 

當然,最大的問題仍然存在 - 這是如何在實際值填寫。不幸的是,沒有乾淨的方法來做到這一點,尤其是使用任何局部變量。

您可以手動維護標記名稱及其值的Dictionary,或使用反射直接在運行時獲取值。雖然應該小心使用它(速度,安全性......),但對於您的情況來說,它可以正常工作。

假設你已經定義爲同一類(Me)作爲讀取和處理這段文字代碼屬性所有變量,代碼如下所示:

Dim matches = Regex.Matches(thestorytext, "%(\w+?)%") 
For Each match in matches 
    Dim tag = match.Groups(1).Value 
    Dim value = Me.GetType().GetField(tag).GetValue(Me) 
    thestorytext = thestorytext.Replace(match.Value, value) ' Lazy code 
Next 

txtAdventure.Text = thestorytext 

如果你不使用性能,但只有場,行改成這樣:

Dim value = Me.GetType().GetField(tag).GetValue(Me) 

注意,這個例子是粗糙的,如果標籤拼寫錯誤或不存在(你應該做一些錯誤檢查)的代碼會很樂意崩潰,但它應該讓你開始。

+0

謝謝!我沒有考慮使用正則表達式,但我想這正是它創建的。 關於正則表達式構造的一個簡短教程後來,我走了! Domo arigato。 <3 – Ziazan 2013-05-07 15:38:47

+0

對於那些有興趣的人,這裏是我用來與此更好地瞭解發生了什麼事情的資源: http://www.regular-expressions.info/reference.html http://www.youtube。 COM /手錶?ν= FpAvBOhDrYk – Ziazan 2013-05-07 15:50:59