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

Это работает до некоторой степени, но отображает его точно так же, как в текстовом файле, сохраняет кавычки, + и имена переменных вместо удаления кавычек и + и замены имен переменных тем, что хранится в переменных.

Может ли кто-нибудь сказать мне, что мне нужно изменить или добавить, чтобы это заработало?

Спасибо и извините, если на этот вопрос где-то был дан ответ, и я просто не распознал его как решение или не знал, что искать, чтобы найти его или что-то в этом роде.


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
Спасибо! Я не думал об использовании регулярных выражений, но я думаю, что это именно то, для чего оно было создано. краткий учебник по построению регулярных выражений позже, и я ухожу! Домо аригато. ‹3 - person Ziazan; 07.05.2013
comment
Для тех, кому интересно, вот ресурсы, которые я использовал в связи с этим, чтобы лучше понять, что происходит: Regular-expressions.info/reference.html youtube.com/watch?v=FpAvBOhDrYk - person Ziazan; 07.05.2013