Помогите с циклом

Тема в разделе "Visual Basic", создана пользователем rabsanek, 4 июн 2008.

  1. rabsanek

    rabsanek Гость

    У меня два вопроса:
    1. Как сделать чтобы в событии textbox_change после каждого второго введенного символа автоматически ставился пробел, я пробовал в событии Command_click получается, но как только я пихаю код в событие textbox_change он мне пишет "Недостаточно места в стеке" и пишет четри что


    Private Sub Text1_Change()
    Dim a As String
    For i = 1 To Len(Text1.Text) Step 2
    a = Mid(Text1, i, 2) + " "
    Text1 = Text1 + a
    Next
    End Sub

    Private Sub Command1_Click()
    Dim a As String
    For i = 1 To Len(Text1.Text) Step 2
    a = Mid(Text1, i, 2) + " "
    Text2 = Text2 + a
    Next
    End Sub

    Что не так, направьте.....
    2. Второй вопрос как сделать цикл пошаговый к примру мне нужно чтобы в цикле перебирались цифры 1 3 6 9, вот для чего
    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 41
    frmeditor.ReplaceBytes Mid(sub1change, 3, 3), 42
    frmeditor.ReplaceBytes Mid(sub1change, 6, 3), 43
    frmeditor.ReplaceBytes Mid(sub1change, 9, 3), 44

    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 121
    frmeditor.ReplaceBytes Mid(sub1change, 3, 3), 122
    frmeditor.ReplaceBytes Mid(sub1change, 6, 3), 123
    frmeditor.ReplaceBytes Mid(sub1change, 9, 3), 124

    Чтобы не писать столько строк а все в одной, вот где написано (sub1change, 1, 3) в каждой строке меняется 1 3 6 9. Программу создаю hex-редактор...
    С уважением, Александр!

    rabsanek GJ поводу второго вопроса может быть создать массив и потом циклу брать из этого массива элементы, только как это воплотить у меня не получается
     
  2. Tanya

    Tanya Гость

    конечно Command1_Click явно лишний
    ошибка в обработчике Text1_Change: пытаясь добавить в этом обработчике символ ты снова вызываешь
    этот обработчик, то есть возникает бесконечная рекурсия, к тому же в цикле
    и отсюда и появляется "Недостаточно места в стеке"
    причем и цикл не совсем верен: ты вставляешь пробел после второго символа он становится третьим,
    тот который должен быть третьим становится чествертым и после него будет добавлен новый пробел, и т.д.
    то есть нарушается ход цикла
    и потом ты добавляешь пробел в конце строки, а что если ты правишь в середине строки?

    как будем выходить из этой ситуации?
    Значит мы вводим текст, и нам нужно, чтобы после каждого второго символа был проставлен пробел
    Вопрос: 1) нам это нужно как конечный результат, чтобы мы ввели текст и он преобразовался в нужный вид
    или 2) действительно, нужно чтобы на каждый ввод символа нам вставлялся пробел в нужном месте

    если 1, то это проще: обрабатываем потерю фокуса: Text1_LostFocus
    Код (Text):
    Private Sub Text1_LostFocus()
    Dim a As String, i As Integer

    For i = 1 To Len(Text1.Text) Step 2
    If Len(Mid(Text1.Text, i, 2)) = 2 Then
    a = a & Mid(Text1.Text, i, 2) + " "
    Else 'в тексте нечетное количество символов - не добавляем пробел
    a = a & Right(Text1.Text, 1)
    End If
    Next i

    Text1 = a

    End Sub
    и, например, при нажатии кнопки Enter:
    Код (Text):
    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    'нажата кнопка Enter
    if KeyCode = vbKeyReturn then Text1_LostFocus
    End Sub
    в случае 2, если вводить по-порядку, то без проблем:
    Код (Text):
    Private Sub Text1_Change()
    If Len(Me.Text1.Text) Mod 3 = 2 Then
    Me.Text1.Text = Me.Text1.Text + " "
    Me.Text1.SelStart = Len(Me.Text1.Text)
    End If
    End Sub
    а если нет, то нужно думать как нужно делать :)

    II)
    for i=0 to 3
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 41+i
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 121+i
    next i
     
  3. rabsanek

    rabsanek Гость

    Спасибо, ответ полноценный, и то что нужно
    Private Sub Text1_Change()
    If Len(Me.Text1.Text) Mod 3 = 2 Then
    Me.Text1.Text = Me.Text1.Text + " "
    Me.Text1.SelStart = Len(Me.Text1.Text)
    End If
    End Sub
    и насчет второго вопроса тоже помогло только чуток не так
    for i=0 to 3
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 41+i
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 121+i
    next i
    то получиться 0 3 6 9 мне нужно было 1 3 6 9
    придется вставить строчку и получиться
    for i=1 to 3
    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 41
    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 121
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 41+i
    frmeditor.ReplaceBytes Mid(sub1change, 3^i, 3), 121+i
    next i
    Спасибо Tanya!

    А вообще поковырялся всправке есть тккой компонет если его в ToolBox добавить называется MaskEdBox там в Custom меню этого компонента есть пункт Mask если задать ## ## ## ## то он будет автоматом ставить пробелы после каждой второй введнной цифры, а если все сиволы нужны то && && && &&
     
  4. Tanya

    Tanya Гость

    точно, с циклом я ошиблась )))
    только тогда он должен быть таким:

    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 41
    frmeditor.ReplaceBytes Mid(sub1change, 1, 3), 121

    for i=1 to 3
    frmeditor.ReplaceBytes Mid(sub1change, 3*i, 3), 41+i
    frmeditor.ReplaceBytes Mid(sub1change, 3*i, 3), 121+i
    next i
     
Загрузка...

Поделиться этой страницей