Игнорируются команды после тела цикла. Помогите новичку.

forem0st

New member
09.01.2011
1
0
#1
Все что следует после End While попросту игнорируется... Может так и надо и я что то упустил в книжках, только мне ещё нужен код для обработчика нажатия кнопки - не дописана процедура :rolleyes:. Как быть Как заставить выполняться код после End While?
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">
Код:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim str, str_beg, str_end As String
Dim k, x, n, wib_hight, edge As Integer
n = 0 : k = 0 : x = 9 : n = 0
Dim shift_x, shift_y As Single
Dim permission As Boolean = True
shift_x = 55 : shift_y = 55 : edge = 3
work_image_small = Nothing
open_src.InitialDirectory = "C:\document`s\Visual Studio 2008\Projects\ProE_Font_Visor\ProE_Font_Visor\Исходники шрифтов ProE"
open_src.ShowDialog()
Label2.Text = My.Computer.FileSystem.GetName(open_src.FileName)
'Process.Start("notepad.exe", open_src.FileName)
Dim put As String = open_src.FileName
str = crup_heder(reader(put))
Dim col As Color = Color.FromArgb(185, Color.LightGreen)
'str_beg = crup_char(str)
'str_end = crup_tail(str_beg, str)
While str.Length <> 0
k += 1
str_beg = crup_char(str)
str_end = crup_tail(str_beg, str)
If str_end = Nothing Then Exit Sub
Dim dsd As New draw_sym_date(str_beg)
Dim bms As New bit_map_sym(dsd.normalise_point, dsd.dim_sym, dsd.header, k)
If permission Then TextBox1.AppendText(dsd.header & vbCrLf)
permission = True
Try
Dim bm As Bitmap = Nothing
Array.Resize(work_image_small, k)
work_image_small(k - 1) = bms.bm
wib_hight = CInt(2 * edge + Math.Ceiling(k / x))
Catch ex As Exception
TextBox2.AppendText(dsd.header & vbCrLf)
permission = False
n += 1
Label1.Visible = True
Label1.Text = "Не распознано " & vbCrLf & " символов - " & CStr(n)
Exit Try
End Try
str = Nothing
str = str_end
End While
Debug.WriteLine(wib_hight.ToString)
work_image_big = New Bitmap(PictureBox1.Width, wib_hight)


End Sub
work_image_big -глобальная переменная -объявлена в классе, так же как и массив work_image_small...Может ещё какие замечания будут? Скажите. Я всего пару месяцев разбираюсь в Visual Basic любые подсказки ценны!
 
V

VBAaddict

#2
А Visual ли это Basic?

Я давненько им пользовался - сейчас все больше VBA
но, например,
1) конструкция k += 1 очень не бейсиковская
2) и еще - кто вас научил засовывать Dim в цикл ???!!! это же оператор объявления переменной - оно должно производится один раз и по этикету - в начале процедуры
3) Try ... и зачем вы залезли в использование обработки ошибок??? такое применение _обычно_ происходит в отладочных целях, а не для рабочего кода. А нормальную ситуацию необходимо обрабатывать If, Case и т.п.
 

forem0st

New member
09.01.2011
1
0
#4
А Visual ли это Basic?

Я давненько им пользовался - сейчас все больше VBA
но, например,
1) конструкция k += 1 очень не бейсиковская
2) и еще - кто вас научил засовывать Dim в цикл ???!!! это же оператор объявления переменной - оно должно производится один раз и по этикету - в начале процедуры
3) Try ... и зачем вы залезли в использование обработки ошибок??? такое применение _обычно_ происходит в отладочных целях, а не для рабочего кода. А нормальную ситуацию необходимо обрабатывать If, Case и т.п.
Во первых очень благодарен что откликнулись!
1. Конструкцию k+=1, a*=d, c>>=10 и т.д. умные книжки рекомендуют к применению (вроде ввели с 2005 VB), якобы при этом экономится одна ячейка памяти... Не знаю, но выглядит трикольно и короче пишется :what?:
2. На счет dim только сейчас понял, как вы правы! Объявить то можно было в начале, а присвоить уже в цикле! ( самоучительство - хуже самолечения ...). Больше не буду так делать.
3. Try тут совершенно необходима. Программа обрабатывает текстовый файл с возможными ошибками (это хреново декомпилированый файл шрифта ProEngineer с ним такое бывает) , если попадается кусок текста, где символ невозможно распознать, но дальше все нормально и нужно продолжать, программа выводит в текстбокс заголовок этого места в тексте файла и считает сколько симолов не поняла... И т.д.
 

forem0st

New member
09.01.2011
1
0
#5
кстати, в что после str = Nothing вернет str.Length?

не даст ошибку ли?
И вам большое спасибо за отзывчивость!
Сразу скажу - программа полностью рабочая, она дописана и делает то, что нужно - анализирует текстовый файл с исходниками шрифта и выводит в изображение ( as bitmap) начертания букв, а в текстбоксы соответствующие им коды.
На счет str = Nothing. Программа обрабатывает переменную типа str as string (весь текстовый файл). Откусывает от него по кусочку с переди (str_beg), оставляя кусочек сзади (str_end). Откусанный кусочек обрабатывается, потом переменная стриг обнуляется и ей присваивается значение оставшегося хвоста. Обработка продолжается пока текст не кончиться (While str.Length <> 0)
Сабжевую проблему я решил: искусственно засунув злосчастный цикл в подпрограмму sub() ... end sub
Но вопрос остался!
Какого хобота при использовании цикла While ... End While VB2008 после выполнения цикла скачет сразу на END Sub начисто игнорируя все что между End While и END Sub.
Причем я менял цикл на For...Next - все нормально работает!
Может есть какие нить соображения?
Может и правда - это из-за DIM в теле цикла?! Но тогда почему - в FOR NEXT все нормально?
 

hosm

* so what *
18.05.2009
2 442
6
#6
Да, правы, чего-то там я дальше недосмотрела внимательно, что строка переприсваивается, сорри. В цикле есть еще выход из процедуры Exit Sub (в теле цикла) - может, он влияет, там действительно так надо, а не просто выйти из цикла While?
 

forem0st

New member
09.01.2011
1
0
#7
... В цикле есть еще выход из процедуры Exit Sub (в теле цикла) - может, он влияет, там действительно так надо, а не просто выйти из цикла While?
Блин! Точно! Ну спасиб !! А то я всю головешку поломал. Вместо екзит вайл нечаяно из списка щелкнул на екзит саб. Смотрю и в упор не вижу!
А когда я для проверки на FOR менял - там естественно екзит саб не писалось и все намана было...
Все проблема решена, виной всему невнимательность.