Страницы: 1
RSS
Оптимальный код для схожих контролов формы!
 
Добрый вечер!  
Подскажите решение, у меня на форме имеются контролы TextBox1...TextBox24 и для каждого из них свой Label1...Label24 (описание), также для каждого контроля добавлен код, отслеживающий его изменение. Код отличается только номером TextBox и номером Label. Подскажите как можно сократить код (код ограничивает ввод только цифрами с двумя знаками после точки и меняет цвет своего Label при заполнении соответствующего TextBox.  
 
Private Sub Dannye1_Change()  
   If Dannye1.Value = "" Then Label1.ForeColor = RGB(255, 0, 0) Else Label1.ForeColor = RGB(0, 120, 0)  
   Const DECSEP = "."  ' <== дес. разделитель: запятая или точка  
   Const DECPLACES = 2 ' <== количество дес. разрядов  
   Dim i As Double, j As Integer, ds As String, s As String  
   Static old As String  
       If DECSEP = "." Then ds = "," Else ds = "."  
       On Error Resume Next  
           s = Dannye1  
       If Len(s) = 0 Then old = "": Exit Sub  
           s = Replace(Replace(s, " ", ""), ds, DECSEP)  
           Dannye1 = s  
           i = CDbl(Replace(s, DECSEP, Mid$(CStr(1.2), 2, 1)))  
           j = InStr(s, DECSEP)  
       If j > 0 Then j = Len(s) - j  
       If Err <> 0 Or j > DECPLACES Then  
           Dannye1 = old  
       Else  
           old = Dannye1  
       End If  
End Sub
 
Я думаю, что можно сделать так, написать код на изменение каждого контрола следующего вида:  
 
Private Sub Dannye1_Change()  
Set Переменная1 = Dannye1  
Set Переменная2 = Label1  
Call ChangeDannye  
End Sub  
 
А дальше сделать Код:  
 
Public ChangeDannye()  
....  
End Sub  
 
Но может есть более правильное решение?
 
Пора уже начинать использовать классы...  
 
Пример можно посмотреть здесь: http://www.programmersforum.ru/showpost.php?p=279872&postcount=8
 
EducatedFool, спасибо, но пока это для меня трудно, но пытаюсь разобраться.  
У меня ведь только одна форма, а не 16.  
И контролы в принципе уже созданы в форме, их не надо создавать динамически, им только динамически надо присваивать значения, это я сделал через комбобокс на этой же форме выбора месяца.  
Пока сделал так:  
Private Sub Dannye1_Change()  
   e1 = 1  
   Call Dannye_Change  
End Sub  
И так до 24-ого  
И сам код:  
 
Public Sub Dannye_Change()  
   If Me.Controls("Dannye" & e1).Value = "" Then Me.Controls("Label" & e1).ForeColor = RGB(255, 0, 0) Else Me.Controls("Label" & e1).ForeColor = RGB(0, 120, 0)  
   Const DECSEP = "."  ' <== дес. разделитель: запятая или точка  
   Const DECPLACES = 2 ' <== количество дес. разрядов  
   Dim i As Double, j As Integer, ds As String, s As String  
   Static old As String  
       If DECSEP = "." Then ds = "," Else ds = "."  
       On Error Resume Next  
           s = Me.Controls("Dannye" & e1)  
       If Len(s) = 0 Then old = "": Exit Sub  
           s = Replace(Replace(s, " ", ""), ds, DECSEP)  
           Me.Controls("Dannye" & e1) = s  
           i = CDbl(Replace(s, DECSEP, Mid$(CStr(1.2), 2, 1)))  
           j = InStr(s, DECSEP)  
       If j > 0 Then j = Len(s) - j  
       If Err <> 0 Or j > DECPLACES Then  
           Me.Controls("Dannye" & e1) = old  
       Else  
           old = Me.Controls("Dannye" & e1)  
       End If  
End Sub
Страницы: 1
Читают тему
Наверх
Loading...