powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменить идексацию массива элементов во время выполнения
12 сообщений из 12, страница 1 из 1
Изменить идексацию массива элементов во время выполнения
    #35831595
sadem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно вопрос в теме. Как изменить идекцию массива управления во время выполнения программы? Поясню: в программе динамически создается массив из элементов, например MSFlexGrid, т.е. изначально есть MSFlexGrid1(0), далее с помощью процедуры Load(MSFlexGrid1(k)) можно создать любое количество этих таблиц (процедуры переключения между ними я уже написал), где k-счетчик. Предположим, что пользователь создал массив и с индексами 0,1,2,3,4. Пользователь по нажатию кнопки может удалить любой из массива с помощью процедуры UnLoad(MSFlexGrid1(i)), где i - номер удаляемого элемента из массива. Например, если i=2 у него остается массив с индексами 0,1,3,4. Как переидексировать этот массив, чтобы у него остался массив из 0,1,2,3 (т.е. изменить индексы для элементов 3 и 4 на 2 и 3 соответственно)?
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35831616
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sademСобственно вопрос в теме. Как изменить идекцию массива управления во время выполнения программы? Поясню: в программе динамически создается массив из элементов, например MSFlexGrid, т.е. изначально есть MSFlexGrid1(0), далее с помощью процедуры Load(MSFlexGrid1(k)) можно создать любое количество этих таблиц (процедуры переключения между ними я уже написал), где k-счетчик. Предположим, что пользователь создал массив и с индексами 0,1,2,3,4. Пользователь по нажатию кнопки может удалить любой из массива с помощью процедуры UnLoad(MSFlexGrid1(i)), где i - номер удаляемого элемента из массива. Например, если i=2 у него остается массив с индексами 0,1,3,4. Как переидексировать этот массив, чтобы у него остался массив из 0,1,2,3 (т.е. изменить индексы для элементов 3 и 4 на 2 и 3 соответственно)?

Есть ведь наверное что - то типа коллекций(я не очень ориентируюсь во MSFlexGrid1), но индексацию массива менять если и можно, так в любом случае - не нужно.
Если коллекций нет - достаточно массиву с данным индексом выставить значение в -1, например или типа того.
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35831634
sadem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL_Lamer, идею я понял, но в MSFlexGrid нет значения Value, можно конечно сделать свою индексацию используя Tag, но я думал есть возможность проще. А переидексация нужна, так как мне нужно согласовать элемент TabStrip (вкладки) и эти таблицы, т.е. чтобы по нажатию определенной вкладки открывалась соответсвующая ей таблица (что-то наподобии как реализовано в Exсel с его листами). Проблема в том, что TabStrip.Value при удалении одной из вкладок само установливает значение для всех вкладок в порядке возрастания, а MSFlexGrid свою индексаацию оставляет прежнюю (хотя фактически я пытаюсь согласовать различные свойства, TabStrip - единственный элемент с несколькими вкадками, а MSFlexGrid - массив элементов).
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35831637
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sadem,

Поищите еще.
Уверен, можно обойтись без изменения индексов, так как действительно не есть гут.
Вы в чем пишете? VB6 или VB.Net?
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35831692
sadem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL_Lamer, ну если я создаю тему в этом разделе, то естественно на VB6 (понимаю от чего вопрос, некоторые не туда свои топики закидывают). Мне просто кажется что индексы поменять массиву управления не получится (как ни печально). А по другому у меня идей сделать пока нет, т.к. TabStrip достаточно ограниченный элемент (в своих свойствах). Есть конечно идея "поддтягивать" выше идущие (по индексу) таблицы на место старых удаленных идексов, но как понимаете это достаточно долгая процедура, связанная с несколькими циклами и копированием всех данных, хотя в моем случае она применима, так предположительный объем данных в каждой таблице будет небольшой. Может кто-то еще заглянет в этот топик, посмотрим, может есть и другие решения.
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834623
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вместо массива контролей взять их коллекцию и добавлять их (контроли) через ProgID и использовать методы Add и Remove.
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834642
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто динамическое создание элементов на форме надо делать в своей коллекции, соответственно, ключ у тебя будет свой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim MyCol as New MyControlCollection
Dim grd as MSFlexGrid

Set grd=MyCol.Add("1")
...
MyCol.Remove "1"
...
MyCol.ReIndex
...
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834653
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за класс MyControlCollection?
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834684
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
свой собственный конечно, где надо все и написать. я привел просто как пример
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834758
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. На самом деле, правила Microsoft регламентируют это очень строгим образом, а именно, посредством двух коллекций: Licences и Controls:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub cmdAddAXNeedsLicense_Click()
    Dim objCtrl As Object
    Dim strControlType As String
    
    strControlType = "MSFlexGridLib.MSFlexGrid.1"
    txtLicense.Text = Licenses.Add(strControlType)
    Set objCtrl = Controls.Add(strControlType, "fgdMY")
    objCtrl.Top =  600 
    objCtrl.Left =  500 
    objCtrl.Visible = True
    cmdAddAXNeedsLicense.Enabled = False
    
End Sub
Попробуйте обойтись без лайсенса, закомментировав соответствующую строку кода... Там надо бросить на форму кнопку и текстбох и назвать как в примере.
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35834915
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример добавления двух ActiveX контролей (в нашем случае, MSFlexGrid), требующих лайсенса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Private Sub cmdAddAXNeedsLicense_Click()
    Dim strControlType As String
    
    strControlType = "MSFlexGridLib.MSFlexGrid.1"
    txtLicense.Text = Licenses.Add(strControlType)
    
    AddCtrl strControlType,  500 ,  600 , True, "grdMyOne"
    AddCtrl strControlType,  500 ,  2000 , True, "grdMyTwo"
    
    cmdAddAXNeedsLicense.Enabled = False
    
End Sub

Private Sub AddCtrl(ByVal pstrControlType As String, ByVal pintTop As Integer, ByVal pintLeft As Integer, ByVal pblnVisible As Boolean, ByVal pstrName As String)
    Dim objCtrl As Control

    Set objCtrl = Controls.Add(pstrControlType, pstrName)
    
    With objCtrl
        .Top = pintTop
        .Left = pintLeft
        .Visible = pblnVisible
    End With

End Sub
...
Рейтинг: 0 / 0
Изменить идексацию массива элементов во время выполнения
    #35836788
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать и обычный массив контролов. Достаточно в MyControlCollection хранить объекты, в которых связаны ссылки на таб и на элемент массива — по барабану какие у них там индексы. Пример с массивом меню:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
'Форма
Dim mCol As Collection

Private Function NewTab()
Dim x As Integer
Dim c As New MyClass
    x = mnuWindow.Count
    Load mnuWindow(x)
    mnuWindow(x).Caption = Timer
    Set c.Menu = mnuWindow(x)
    Set c.CTab = TabStrip1.Tabs.Add(, , Timer)
    Set c.Strip = TabStrip1
    mCol.Add c
End Function

Private Sub mnuWindow_Click(Index As Integer)
Dim c As MyClass
    For Each c In mCol
        If c.Menu.Index = Index Then
            c.CTab.Selected = True
            Exit Sub
        End If
    Next
End Sub

'Класс MyClass
Dim WithEvents lStrip As TabStrip
Dim lMenu As Menu
Dim lTab As ComctlLib.Tab

Public Property Set Menu(rhs As Menu)
    Set lMenu = rhs
End Property

Public Property Set CTab(rhs As ComctlLib.Tab)
    Set lTab = rhs
End Property

Public Property Set Strip(rhs As ComctlLib.TabStrip)
    Set lStrip = rhs
End Property

Private Sub lStrip_Click()
    lMenu.Checked = lStrip.SelectedItem.Index = lTab.Index
End Sub
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Изменить идексацию массива элементов во время выполнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]