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

  • Автор темы rabsanek
  • Дата начала
R

rabsanek

#1
У меня два вопроса:
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 поводу второго вопроса может быть создать массив и потом циклу брать из этого массива элементы, только как это воплотить у меня не получается
 
T

Tanya

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

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

если 1, то это проще: обрабатываем потерю фокуса: Text1_LostFocus
Код:
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:
Код:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'нажата кнопка Enter
if KeyCode = vbKeyReturn then Text1_LostFocus
End Sub
в случае 2, если вводить по-порядку, то без проблем:
Код:
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
 
R

rabsanek

#3
Спасибо, ответ полноценный, и то что нужно
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 если задать ## ## ## ## то он будет автоматом ставить пробелы после каждой второй введнной цифры, а если все сиволы нужны то && && && &&
 
T

Tanya

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

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