Двумерный массив

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Двумерный массив

Сообщение DRU » 23.11.2008 (Вс) 23:25

Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Двумерный массив

Сообщение iGrok » 24.11.2008 (Пн) 0:31

DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.

Какой-нибудь Grid.
label:
cli
jmp label

DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Re: Двумерный массив

Сообщение DRU » 24.11.2008 (Пн) 2:34

iGrok писал(а):
DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.

Какой-нибудь Grid.

Можно по-подробнее?
Может есть у кого-то примерчик с использованием "Grid"?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Двумерный массив

Сообщение iGrok » 24.11.2008 (Пн) 3:08

DRU писал(а):
iGrok писал(а):
DRU писал(а):Доброго времени суток!
Возникла следующая проблема: необходимо создать двумерный массив textbox'ов, но я не понимаю как это осуществить. Если это невозможно, то подскажите какой компонент можно использовать и как к нему обращаться.

Какой-нибудь Grid.

Можно по-подробнее?
Может есть у кого-то примерчик с использованием "Grid"?

Грид - это элемент управления. Таблица. Как, к примеру, в Excel. Гриды бывают разные. Многие сделаны для работы с БД(базой данных), некоторые позволяют работать с ними прямо так.
К примеру FlexGrid, DBGrid, DataGrid. Поищи по форуму и в гугле из названия. Информации должно быть достаточно. )

Просто всё рассказывать - это придётся тут такую статью писать...
label:
cli
jmp label

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Двумерный массив

Сообщение Денис » 24.11.2008 (Пн) 9:00

DRU писал(а):необходимо создать двумерный массив textbox'ов, и как к нему обращаться.

Мне Хакер подсказал, а я тебе подскажу: Остаток от простого деления дает одну координату, целочисленное деление дает вторую координату. Массив одномерный. Делишь максимальное значение координаты на индекс текущего контрола.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Двумерный массив

Сообщение Alprog » 24.11.2008 (Пн) 9:20

Если нужно создать именно массив, содержащий контролы, то можно создать двумерный массив 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


Обращаться к массиву очень просто:
Arr(3, 4).Text = "Тест"

Но можно обойтись и без массива, а завести фунцию, возвращающую TextBox:

Код: Выделить всё
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


Обращаться тем не менее, можно точно также:
Arr(3, 4).Text = "Тест"

DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Re: Двумерный массив

Сообщение DRU » 24.11.2008 (Пн) 17:40

Огромное спасибо, Alprog! :alien:

DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Re: Двумерный массив

Сообщение DRU » 24.11.2008 (Пн) 18:15

И ещё вопросик: я взял первый код Alprog за основу, но не могу сделать так, чтобы можно было вводить только числа. Написал так, но это не работает :D
Код: Выделить всё
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

ACiD
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 261
Зарегистрирован: 10.12.2005 (Сб) 2:29
Откуда: г. Санкт - Петербург

Re: Двумерный массив

Сообщение ACiD » 24.11.2008 (Пн) 18:41

Код: Выделить всё
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
    If (KeyAscii < 48) Or (KeyAscii > 58) Then KeyAscii = 0
End Sub

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Двумерный массив

Сообщение Alprog » 24.11.2008 (Пн) 18:58

сделать так, чтобы можно было вводить только числа


Самый простой способ написал ACiD, но это не спасёт, если пользователь вставит текст через Ctrl+V.
Если же хочется защитится и от Ctrl+V, то легче всего при изменении содержимого, проверять является ли оно числом, и если нет, то очищать окошко.
Вот так:

Код: Выделить всё
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


Во втором варианте можно вводить даже отрицательные числа. Причём если оставить в поле только минус, то он автоматически поменяется на -1.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Двумерный массив

Сообщение Alprog » 24.11.2008 (Пн) 19:21

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Двумерный массив

Сообщение iGrok » 24.11.2008 (Пн) 20:28

Мда.
А мысль о том, что использовать нормальный грид с возможностью задания формата данных в ячейке будет проще и удобнее, никому в голову, похоже, так и не пришла..
label:
cli
jmp label

DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Re: Двумерный массив

Сообщение DRU » 25.11.2008 (Вт) 0:24

ACiD писал(а):
Код: Выделить всё
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
    If (KeyAscii < 48) Or (KeyAscii > 58) Then KeyAscii = 0
End Sub

Про Ascii я знаю :mrgreen: , но я не могу понять почему не работает dataformat? Или я что-то не правильно понял (он вообще для чего предназначен?))). Я как-то писал прогу, где мне надо было также вводить в текстбокс числа и только числа, после всего написанного я засомневался конечно, но с уверенстью в 40% могу сказать что у меня все работало. :roll: Стукните меня молотком если dataformat - это вообще не туда.
====================================================================
Спасибо за многочисленные отзывы, думаю что по этому вопросу больше вас напрягать не буду. Напишу через ascii и курсач готов)))

DRU
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 16.11.2008 (Вс) 23:26
Откуда: Беларусь, Гомель

Re: Двумерный массив

Сообщение DRU » 25.11.2008 (Вт) 0:27

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

Я думаю что мне достаточно будет использовать Tab, но за пример все-равно спасибо :D

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Двумерный массив

Сообщение iGrok » 25.11.2008 (Вт) 2:39

DRU писал(а):Стукните меня молотком если dataformat - это вообще не туда.

Молотком не буду, но в общем да. Не туда.
Если я не особо ошибаюсь - этот DataFormat используется при работе с БД. Задаёт формат отображения данных.
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 61

    TopList