2013-05-02 50 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