Как размножить группу контролов в форме?

Программирование на Visual Basic for Applications
rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Как размножить группу контролов в форме?

Сообщение rdva » 21.02.2008 (Чт) 19:49

В форме, в зависимости от кол-ва таблиц на листе, должны повторяться одинакове группы контролов, у контролов должны быть процедуры обработки событий.

По идее, нужно один раз создать форму, а потом тиражировать ее сождержимое. Как это сделать?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.02.2008 (Пт) 10:14

Тебе надо, чтобы было несколько одинаковых форм или форма с некоторым количеством одинаковых элементов?
Если первое, то создавай нужное количество форм оператором New. Если второе, то создай элемент с индексом 0, а потом добавляй нужное количество элементов при помощи Load.
Весь мир матрица, а мы в нем потоки байтов!

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 22.02.2008 (Пт) 10:20

Форма с некоторым кол-вом одинаковых элементов.
А как быть с процедурами обработки событий?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.02.2008 (Пт) 10:40

Для всех элементов массива используется одна процедура обработки событий.
Lasciate ogni speranza, voi ch'entrate.

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 22.02.2008 (Пт) 14:55

Можете в качестве примера привести кусок кода, создающего элемент с индексом 0, а потом добавляющего нужное количество элементов при помощи Load?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.02.2008 (Пт) 15:46

делов то, допустим есть текстбокс txtEdit, с индексом 0, добавим еще допустим 5
Код: Выделить всё
For i= 1 to 5
   Load txtEdit(i)
Next i

Удалить добавленное
Код: Выделить всё
For i = 5 To 1 Step -1
    Unload txtEdit(i)
Next i

или
Код: Выделить всё
For i = 1 To 5
    Unload txtEdit(1)
Next i
Весь мир матрица, а мы в нем потоки байтов!

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 22.02.2008 (Пт) 16:34

Создавать так?

Код: Выделить всё
Dim txtEdit() as Control


а как прицеплять обработку событий?

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 22.02.2008 (Пт) 20:29

Что то я не догоняю...

Модуль класса Class1

Код: Выделить всё
Public WithEvents ComboBoxEvents As MSForms.ComboBox

Private Sub ComboBoxEvents_Change()
    MsgBox "Change!"
End Sub


Property Let Top(digit As Integer)
    ComboBoxEvents.Top = digit
End Property


Модуль с кодом
Код: Выделить всё
Option Explicit
Sub test()
    Dim cbox() As Class1   
    Dim Size As Integer, i As Integer
       
    Size = 3
    ReDim cbox(1 To Size)
           
    For i = 1 To Size
        Set cbox(i) = UserForm1.Controls.Add("Forms.ComboBox.1", "Cbox" & i, True)
    Next
    UserForm1.Show
End Sub



Встает на строке Set cbox(i) = UserForm1... с ошибкой Type Mismatch. Что делаю не так?

И еще вопрос - при создании нового класса методы и свойства объекта, на основе которого создан новый класс, не наследуются? У меня , к примеру, .top ComboBox'a работать не захотел, пришлось писать Property Let top в модуле класса. Так и должно быть?

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 23.02.2008 (Сб) 5:29

rdva
В VBA нет массивов элементов Controls в отличии от VB6. Наследование не поддерживается. Можно организовать его включением. Для решения твоей задачи. Создай класс с именем ComboEventHandler
Код: Выделить всё
Option Explicit
Public WithEvents Combo As MSForms.ComboBox
'Общая процедура для всех раскрывающихся списокв
Private Sub Combo_Change()
    MsgBox Combo.Name
End Sub

В коде формы следующее (создаём на форме 3 раскрывающихся списка)
Код: Выделить всё
Option Explicit
'Коллекция раскрывающихся списков (вдруг понадобится доступ по индексу)
Private GroupCombo As New Collection

Private Sub UserForm_Activate()
    Dim pControl As MSForms.Control
    Dim pCombo As ComboEventHandler
    Dim i As Long, iTop As Long
   
    iTop = 4&
    For i = 1 To 3
        Set pCombo = New ComboEventHandler
        Set pCombo.Combo = Me.Controls.Add("Forms.ComboBox.1", "Combo" & CStr(i))
        pCombo.Combo.Left = 6
        pCombo.Combo.Top = iTop
        GroupCombo.Add pCombo
        iTop = iTop + 22
    Next i
End Sub

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 26.02.2008 (Вт) 16:53

Не работает. Останавливается на Set pCombo.Combo = Me.Controls.... c ошибкой Member or data member not found.

Каковы функции переменной pControl? Она нигде не используется, имхо...

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 27.02.2008 (Ср) 1:10

rdva
Private Sub UserForm_Activate() должна находится в коде формы, где строятся ComboBox, иначе замените Me на название формы (UserForm1, например)
pControl - лишний, давал ответ на другом форуме на почти такой же вопрос (ComboBox уже были на форме) :D

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 29.02.2008 (Пт) 12:56

Как можно идентифицировать контрол, который вызвал событие Combo_Change()?
Вычитал, что событим можно передавать аргументы, как процедурам, но что-то убей не получается ничего передать. Это возможно? Это да, то как?

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 01.03.2008 (Сб) 3:50

rdva
А Combo.Name чем не устраивает?


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 92

    TopList  
cron