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 и да заменя имената на променливите с това, което се съхранява в променливите.

Може ли някой да ми каже какво трябва да променя или добавя, за да работи това?

Благодаря и се извинявам, ако това е отговорено някъде и просто не го разпознах като решение или не знаех какво да търся, за да го намеря или нещо подобно.


person Ziazan    schedule 02.05.2013    source източник


Отговори (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 имена на тагове и техните стойности, или да използвате Reflection, за да получите стойностите директно по време на изпълнение. Въпреки че трябва да се използва внимателно (скорост, сигурност, ...), той ще работи добре за вашия случай.

Ако приемем, че всичките ви променливи са дефинирани като свойства в същия клас (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)

Имайте предвид, че този пример е груб и кодът щастливо ще се срине, ако таговете са изписани неправилно или не съществуват (трябва да направите малко проверка за грешки), но трябва да започнете.

person Darko Kenda    schedule 02.05.2013
comment
Благодаря ти! Не мислех да използвам regex, но предполагам, че е точно това, за което е създаден. кратък урок за изграждането на регулярен израз по-късно и аз съм далеч! Домо аригато. ‹3 - person Ziazan; 07.05.2013
comment
За интересуващите се, ето ресурсите, които използвах във връзка с това, за да разбера по-добре какво се случва: regular-expressions.info/reference.html youtube.com/watch?v=FpAvBOhDrYk - person Ziazan; 07.05.2013