Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.
DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.
iGrok писал(а):DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.
Какой-нибудь Grid.
DRU писал(а):iGrok писал(а):DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.
Какой-нибудь Grid.
Можно по-подробнее?
Может есть у кого-то примерчик с использованием "Grid"?
DRU писал(а):необходимо создать двумерный массив textbox'ов, и как к нему обращаться.
Option Explicit
Private Const Col As Integer = 7 'Количество столбцов
Private Const Row As Integer = 5 'Количество строк
Dim Arr() As TextBox
Private Sub Form_Load()
ReDim Arr(Col - 1, Row - 1) As TextBox
Dim n As Integer, m As Integer, Id As Integer
For n = 0 To Col - 1
For m = 0 To Row - 1
Id = n * Row + m
If Id Then
Load Text(Id) 'Добавляем контролы на форму. Чтобы код работал, на форме должен лежать text(0)
With Text(Id)
.Left = Text(0).Left + Text(0).Width * n
.Top = Text(0).Top + Text(0).Height * m
.Visible = True
End With
Set Arr(n, m) = Text(Id) 'Делаем ссылку из нашего двухмерного массива к контролу
End If
Next
Next
End Sub
Option Explicit
Private Const Col As Integer = 7
Private Const Row As Integer = 5
Private Sub Form_Load()
Dim n As Integer, m As Integer, Id As Integer
For n = 0 To Col - 1
For m = 0 To Row - 1
Id = n * Row + m
If Id Then
Load Text(Id)
With Text(Id)
.Left = Text(0).Left + Text(0).Width * n
.Top = Text(0).Top + Text(0).Height * m
.Visible = True
End With
End If
Next
Next
End Sub
Function Arr(n As Integer, m As Integer) As TextBox
Set Arr = Text(n * Row + m)
End Function
With Text(Id)
.Left = Text(0).Left + Text(0).Width * n
.Top = Text(0).Top + Text(0).Height * m
.Visible = True
.DataFormat.Format = Number
.MaxLength = 3
End With
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
If (KeyAscii < 48) Or (KeyAscii > 58) Then KeyAscii = 0
End Sub
сделать так, чтобы можно было вводить только числа
Private Sub Text_Change(Index As Integer)
On Local Error GoTo err:
Dim I As Integer
I = Text(Index)
Exit Sub
err:
Text(Index) = ""
End Sub
Private Sub Text_Change(Index As Integer)
On Local Error GoTo err:
With Text(Index)
If .Text <> "" And .Text <> "-" Then
Dim I As Integer
I = .Text
End If
.Tag = .Text
Exit Sub
err:
.Text = .Tag
.SelStart = Len(.Text)
End With
End Sub
Private Sub Text_LostFocus(Index As Integer)
If Text(Index) = "-" Then Text(Index) = -1
End Sub
Private Sub Text_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
With Text(Index)
Select Case KeyCode
Case vbKeyDown
If Index < Row * Col - 1 Then
Text(Index + 1).SetFocus
Text(Index + 1).SelStart = 0
End If
Case vbKeyUp
If Index Then
Text(Index - 1).SetFocus
Text(Index - 1).SelStart = 0
End If
Case vbKeyRight
If Index + Row < Col * Row And .SelStart = Len(.Text) Then
Text(Index + Row).SetFocus
Text(Index + Row).SelStart = 0
End If
Case vbKeyLeft
If Index >= Row And .SelStart = 0 Then
Text(Index - Row).SetFocus
Text(Index - Row).SelStart = Len(Text(Index - Row))
End If
End Select
End With
End Sub
ACiD писал(а):
- Код: Выделить всё
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
If (KeyAscii < 48) Or (KeyAscii > 58) Then KeyAscii = 0
End Sub
Alprog писал(а):DRU
Предчувствую твой следущий вопрос: "Как переключаться между TextBox'ами с помощью клавиатуры?"
На всякий случай отвечу сразу:
- Код: Выделить всё
Private Sub Text_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
With Text(Index)
Select Case KeyCode
Case vbKeyDown
If Index < Row * Col - 1 Then
Text(Index + 1).SetFocus
Text(Index + 1).SelStart = 0
End If
Case vbKeyUp
If Index Then
Text(Index - 1).SetFocus
Text(Index - 1).SelStart = 0
End If
Case vbKeyRight
If Index + Row < Col * Row And .SelStart = Len(.Text) Then
Text(Index + Row).SetFocus
Text(Index + Row).SelStart = 0
End If
Case vbKeyLeft
If Index >= Row And .SelStart = 0 Then
Text(Index - Row).SetFocus
Text(Index - Row).SelStart = Len(Text(Index - Row))
End If
End Select
End With
End Sub
DRU писал(а):Стукните меня молотком если dataformat - это вообще не туда.
Сейчас этот форум просматривают: AhrefsBot и гости: 61