Dark Frost Ответов: 3

Где я ошибся в этом коде ?


<pre>    
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If CheckBox1.Checked = True Then
            Dim a As String = "-clone"
        Else
        End If
        If CheckBox2.Checked = True Then
            Dim b As String = "-noerror"
        Else
        End If
        If CheckBox3.Checked = True Then
            Dim c As String = "-nocorr"
        Else
        End If
        If CheckBox4.Checked = True Then
            Dim d As String = "-notrunc"
        Else
        End If
        Dim file As System.IO.StreamWriter
        file = My.Computer.FileSystem.OpenTextFileWriter(Application.StartupPath & "test.bat", True)
        file.WriteLine("readom dev=0,0,0 f=Backup.raw" + a + b + c + d)
        file.Close()
    End Sub


Что я уже пробовал:

ошибка заключается в том, что если я добавил
+ a + b + c + d
код вроде этого
file.WriteLine("readom dev=0,0,0 f=Backup.raw" + a + b + c + d)

допустим, эта ошибка BC30451 'a' не объявлена. Он может быть недоступен из-за своей защиты
но я склоняюсь в а есть
If CheckBox1.Checked = True Then
            Dim a As String = "-clone"
        Else
здесь
где я ошибся ?

3 Ответов

Рейтинг:
19

Sandeep Mewara

If CheckBox1.Checked = True Then
            Dim a As String = "-clone"
        Else
        End If
        If CheckBox2.Checked = True Then
            Dim b As String = "-noerror"
        Else
        End If
        If CheckBox3.Checked = True Then
            Dim c As String = "-nocorr"
        Else
        End If
        If CheckBox4.Checked = True Then
            Dim d As String = "-notrunc"
        Else
        End If

Все переменные a,b,c,d объявляются в локальной области действия If Как только If будет сделано, они больше не будут доступны и, следовательно, ошибка.

попробовать это:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim someString  As String       
If CheckBox1.Checked = True Then
            someString = "-clone"
        Else
        End If
        If CheckBox2.Checked = True Then
            someString = "-noerror"
        Else
        End If
        If CheckBox3.Checked = True Then
            someString = "-nocorr"
        Else
        End If
        If CheckBox4.Checked = True Then
            someString = "-notrunc"
        Else
        End If
        Dim file As System.IO.StreamWriter
        file = My.Computer.FileSystem.OpenTextFileWriter(Application.StartupPath & "test.bat", True)
        file.WriteLine("readom dev=0,0,0 f=Backup.raw" + someString)
        file.Close()
    End Sub

Для получения более подробной информации и понимания: Область Применения - Visual Basic | Microsoft Docs[^]


Dark Frost

Спасибо :)

Рейтинг:
1

Richard MacCutchan

Ответ Сандипа частично верен, но я думаю, что вы хотите иметь возможность любой комбинации вариантов, поэтому что-то вроде:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim someString  As String
    someString = ""     
    If CheckBox1.Checked = True Then
        someString += "-clone "
    End If
    If CheckBox2.Checked = True Then
        someString += "-noerror "
    End If
    If CheckBox3.Checked = True Then
        someString += "-nocorr "
    End If
    If CheckBox4.Checked = True Then
        someString += "-notrunc "
    End If
    Dim file As System.IO.StreamWriter
    file = My.Computer.FileSystem.OpenTextFileWriter(Application.StartupPath & "test.bat", True)
    file.WriteLine("readom dev=0,0,0 f=Backup.raw" + someString)
    file.Close()
End Sub

Однако я бы предложил использовать StringBuilder объект более эффективен, чем операторы+=.


0x01AA

Конечно StringBuilder это более эффективно. Но для такого нажатия кнопки, как это, я думаю, что это действительно что-то излишнее. Это в частности касается окончательной обработки файлов ;) Во всяком случае, 5.

Richard MacCutchan

Спасибо. Но почему StringBuilder-это перебор?

0x01AA

Я думаю, что StringBuilder полезен, если вы объединяете сотни или тысячи строк. В случае, если один конкатенат только строки представления, это на самом деле не дает преимущества. Но это действительно только мое мнение, не принимайте его слишком серьезно.

(Кстати: я до сих пор не получаю уведомлений об ответах на комментарии Q&A, поэтому мой задержанный ответ, Извините)

Richard MacCutchan

Спасибо, я ценю ваши комментарии.

Dark Frost

Спасибо :),но если я использую это решение
.bat файлы просто пишут последний CheckBox4
подобный этому;
readom.exe -notruncdev=0.0.0 Ф=резервная копия.Сырье

Richard MacCutchan

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

Richard MacCutchan

Кроме отсутствующего места после .raw все вышесказанное дает правильный результат. Пожалуйста, обновите свой вопрос с помощью фактического кода, который вы используете.

Рейтинг:
0

Patrice T

Цитата:
Где я ошибся в этом коде ?

Перечитайте свой код и подумайте о том, что такое a, b, c и d, когда соответствующие флажки сняты.
Решение должно быть очевидным.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Visual Basic / Visual Studio Video Tutorial - Базовая Отладка - YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и средства отладки[^]

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


0x01AA

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

Patrice T

Я так много раз получал понижающий голос за то, что говорил об отладчике, что 3 идеально подходит для меня.
шаблон заключается в том, что другие решения, где уже обнаруживается проблема; так что нет необходимости повторять.