Решил написать вам, прочитав статью С. Лосева "Путешествие из сантиметров в пики" в КГ N№ 42. Программированием я не занимаюсь, с Viisual Basic for
Решил написать вам, прочитав статью С. Лосева "Путешествие из сантиметров в пики" в КГ N№ 42. Программированием я не занимаюсь, с Viisual Basic for Application не знаком, так что пользовался только материалами статьи и урывками знаний из давно прочитанной "дзеля прыколу" книги VB 5.0.
(c) Компьютерная газета
В процедуре ConvertData для каждого преобразования вы написали отдельную процедуру. А не легче ли было перевести исходную величину в пикселы, а потом пикселы — уже в итоговую величину? Например, так:
Sub ConvertData()
Dim Tmp As Double
Tmp = Val(TbSource.Text)
Select Case Src
With Application
Case1
Tmp = .CentimetersToPoints(Tmp)
Case2
Tmp = .InchesToPoints(Tmp)
Case3
Tmp = .LinesToPoints(Tmp)
Case4
Tmp = .MillimetersToPoints(Tmp)
Case5
Tmp = .PicasToPoint(Tmp)
Case6
End With
End Celect
Elect Case Rst
With Application
Case1
Tmp = .PointsToCentimeters(Tmp)
Case2
Tmp = .PointsToInches(Tmp)
Case3
Tmp = .PointsToLines(Tmp)
Case4
Tmp = .PointsToMillimeters(Tmp)
Case5
Tmp = .PointsToPicas(Tmp)
Case6
End With
End Select
Tmp = Int(10000*Tmp)/10000
TbResult.Text = Format(Tmp)
End Sub
214 строк вашего текста, и 36 — моего. Хороший архиватор или логика? К процедуре Commandbutton1_Click() претензий нет. Идем дальше… Опять же событие Click написано для каждой кнопки (переключателя?) OptionButton. По-моему, лучше объединить их (переключатели) в два класса, например, OptionButtonSource и OptionButtonResult. Тогда пришлось бы написать две процедуры обработки событий, а не двенадцать:
Private Sub OptionButtonSource_Click(Index As Integer)
Src = Index
ConvertData
End Sub
Private Sub OptionButtonResult_Click(Index As Integer)
Rst = Index
ConvertData
End Sub
У вас это занимало целых 48 строк, а здесь — только 8. Но после этого надо не забыть в раздел общих объявлений (там, где у нас Dim Src As Integer и Dim Rst As Integer), дописать строку Dim Index As Integer. Ну и, естественно, изменится процедура UserForm_Activate() (изменения показаны курсивом):
Private Sub UserForm_Activate()
TbSource.Text = 0
TbResult.Text = 0
Src = 1
Rst = 1
OptionButton Source(1) .Value = True
OptionButton Result(1). Value = True
End Sub
Жду вашей критики о том, что и как сделано неправильно, почему не работает и зачем все это нужно. Пишите.
P.S. Во фрагментах кода "сантиметры в пиксели", "дюймы в пиксели", "строки в пиксели" и "миллиметры в пиксели" у вас встречается "лишняя" строка, например, "сантиметры в пиксели":
Case6
Tmp = Val(TbSource.Text)
1. Tmp = Application.CentimetersPoints(Tmp)
Tmp = Application.PicasToPoints(Tmp)
Tmp = Int(10000*Tmp)/10000
TbResult.Text = Format(Tmp)
"Лишняя" строка подчеркнута. Она повторяется во всех вышеперечисленных фрагментах. В строке 1 сантиметры переводятся в пикселы — и получается итоговая величина. А вы зачем-то переменную Tmp, которая уже в пикселах, переводите из пик опять в пикселы. (Вы что-нибудь поняли? Я — нет.). Может, я еще плохо в этом разбираюсь, но по-моему эта строка не нужна. И самое интересное то, что во фрагменте "пики в пиксели" ее нет.
Скуратович Павел .
(c) Компьютерная газета
В процедуре ConvertData для каждого преобразования вы написали отдельную процедуру. А не легче ли было перевести исходную величину в пикселы, а потом пикселы — уже в итоговую величину? Например, так:
Sub ConvertData()
Dim Tmp As Double
Tmp = Val(TbSource.Text)
Select Case Src
With Application
Case1
Tmp = .CentimetersToPoints(Tmp)
Case2
Tmp = .InchesToPoints(Tmp)
Case3
Tmp = .LinesToPoints(Tmp)
Case4
Tmp = .MillimetersToPoints(Tmp)
Case5
Tmp = .PicasToPoint(Tmp)
Case6
End With
End Celect
Elect Case Rst
With Application
Case1
Tmp = .PointsToCentimeters(Tmp)
Case2
Tmp = .PointsToInches(Tmp)
Case3
Tmp = .PointsToLines(Tmp)
Case4
Tmp = .PointsToMillimeters(Tmp)
Case5
Tmp = .PointsToPicas(Tmp)
Case6
End With
End Select
Tmp = Int(10000*Tmp)/10000
TbResult.Text = Format(Tmp)
End Sub
214 строк вашего текста, и 36 — моего. Хороший архиватор или логика? К процедуре Commandbutton1_Click() претензий нет. Идем дальше… Опять же событие Click написано для каждой кнопки (переключателя?) OptionButton. По-моему, лучше объединить их (переключатели) в два класса, например, OptionButtonSource и OptionButtonResult. Тогда пришлось бы написать две процедуры обработки событий, а не двенадцать:
Private Sub OptionButtonSource_Click(Index As Integer)
Src = Index
ConvertData
End Sub
Private Sub OptionButtonResult_Click(Index As Integer)
Rst = Index
ConvertData
End Sub
У вас это занимало целых 48 строк, а здесь — только 8. Но после этого надо не забыть в раздел общих объявлений (там, где у нас Dim Src As Integer и Dim Rst As Integer), дописать строку Dim Index As Integer. Ну и, естественно, изменится процедура UserForm_Activate() (изменения показаны курсивом):
Private Sub UserForm_Activate()
TbSource.Text = 0
TbResult.Text = 0
Src = 1
Rst = 1
OptionButton Source(1) .Value = True
OptionButton Result(1). Value = True
End Sub
Жду вашей критики о том, что и как сделано неправильно, почему не работает и зачем все это нужно. Пишите.
P.S. Во фрагментах кода "сантиметры в пиксели", "дюймы в пиксели", "строки в пиксели" и "миллиметры в пиксели" у вас встречается "лишняя" строка, например, "сантиметры в пиксели":
Case6
Tmp = Val(TbSource.Text)
1. Tmp = Application.CentimetersPoints(Tmp)
Tmp = Application.PicasToPoints(Tmp)
Tmp = Int(10000*Tmp)/10000
TbResult.Text = Format(Tmp)
"Лишняя" строка подчеркнута. Она повторяется во всех вышеперечисленных фрагментах. В строке 1 сантиметры переводятся в пикселы — и получается итоговая величина. А вы зачем-то переменную Tmp, которая уже в пикселах, переводите из пик опять в пикселы. (Вы что-нибудь поняли? Я — нет.). Может, я еще плохо в этом разбираюсь, но по-моему эта строка не нужна. И самое интересное то, что во фрагменте "пики в пиксели" ее нет.
Скуратович Павел .
Компьютерная газета. Статья была опубликована в номере 45 за 1999 год в рубрике программирование :: разное