С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28

Обработчик событий для динамически созданного массива контролов

21.07.2014, 09:59. Показов 9735. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
Dim WithEvents Button As CommandButton
 
Private Sub Command1_Click()
    MsgBox "Hi"
End Sub
 
Private Sub Form_Load()
    Set Button = Controls.Add("vb.CommandButton", "Command1")
    Button.Visible = 1
End Sub
Вопрос - почему при нажатии на созданную на форме кнопку не происходит событие Click ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2014, 09:59
Ответы с готовыми решениями:

Создать обработчик события для динамически созданного NumericUpDown
Приветствую. Имеется несколько динамически созданных numericupdown-оф, и пользователю нужно распределить среди них 10 очков. Подскажите...

Обработчик событий для динамически созданных контроллов
Всем привет, я столкнулся с этой проблемой, два дня назад, и до сих пор никак не могу решить эту проблему. Суть в том, что я создать...

Обработчик событий для динамически связанного запроса в подформе
Добрый день, форумчане! Суть проблемы: Есть главная форма. На ней добавлена область для подчиненной формы. При загрузке формы я...

32
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
21.07.2014, 10:08
dimas5552, определитесь, кнопка называется Button или Command1?
Вся проблема в этом, кажется...
0
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
21.07.2014, 10:32  [ТС]
Кнопка называется Command1, это можно даже проверить вызвав
Visual Basic
1
MsgBox Controls(0).Name 'Так как это единственный элемент на форме
А Button это переменная, которая создает эту кнопку.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
21.07.2014, 10:36
dimas5552, всё работает, если с головой подходить -
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
Dim WithEvents Button As CommandButton
 
Private Sub Button_Click()
    MsgBox "Hi"
End Sub
 
Private Sub Form_Load()
    Set Button = Controls.Add("vb.CommandButton", "Button")
    Button.Visible = 1
End Sub
1
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
21.07.2014, 10:58  [ТС]
В Вашем примере вы эту самую переменную и вызываете, а если эту переменную использовать для создания нескольких кнопок то получится что переменная одна а кнопок много, т.е. для каждой кнопки нужно как то событие Клик выклянчить...

Например если так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Form_Load()
    Set Button = Controls.Add("vb.CommandButton", "Command1")
    Button.Visible = 1
    
    Set Button = Controls.Add("vb.CommandButton", "Command2")
    Button.Visible = 1
    
    Set Button = Controls.Add("vb.CommandButton", "Command3")
    Button.Visible = 1
End Sub
на форме три кнопки и как у каждой тогда клик узнать?
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 11:07
Цитата Сообщение от dimas5552 Посмотреть сообщение
на форме три кнопки и как у каждой тогда клик узнать?
Или массив контролов, но первый должен быть на форме по-любому. Либо для каждой кнопки свой обработчик, либо динамически менять обработчик при смене текущей кнопки (т.к. один контрол может быть активным в данный момент) смотри.
1
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
21.07.2014, 11:09
Цитата Сообщение от Nikz
я делал так:
класс Class1 содержащий 1 кнопку
Visual Basic
1
2
3
4
5
6
7
Option Explicit
 
Public WithEvents command1 As VB.CommandButton
 
Private Sub command1_Click()
    MsgBox "qwe"
End Sub
и в форме
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
Dim c(9) As Class1
 
Private Sub Form_Load()
Dim i As Integer
For i = 0 To 9
    Set c(i) = New Class1
    Set c(i).command1 = Controls.Add("VB.CommandButton", "Commands" & i, Me)
    c(i).command1.Top = i * c(i).command1.Height + 50
    c(i).command1.Visible = True
Next i
End Sub
...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 11:14
Апострофф, а что это дает?
dimas5552, можно сделать имитацию массива контролов через класс обертку (возможно это хотел показать уважаемый Апострофф)
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.07.2014, 11:44
dimas5552, вам нужно пройти по тому-же эволюционному маршруту что и я,
сначало воспользоваться таймером для передачи фокуса, а затем
если все заработает, попробовать переключать фокус через события
но хотелось бы обратить внимание, что в других байсиках события LostFocus-не существует
после чего эволюцианировать лучше в другую ветку, например в VBA

Добавлено через 1 минуту
Там я для вас лично отвечу на любые вопросы по кнопкам и помогу Вам, до связи !
0
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
21.07.2014, 11:47  [ТС]
Спасибо, принцип понял. Теперь еще такой вопрос: а команда "Set btn = ActiveControl" что дает и почему без нее не работают кнопки?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.07.2014, 11:50
Цитата Сообщение от dimas5552 Посмотреть сообщение
"Set btn = ActiveControl" что дает и почему без нее не работают кнопки?
выясняет активность, и передает ссылку на эту активную кнопку
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 11:52
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Антихакер32, перестань нести чушь!
Какие таймеры? Зачем?
dimas5552, воспользуйся доп классом-оберткой.
Смысл в чем, у тебя много кнопок и один объект, обрабатывающий события этих кнопок. Делаешь интерфейс для объекта приемника и из класса вызываешь метод интерфейса, передавая в него источник события.
К примеру, создаем класс обертку clsEventWrapper:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
 
Dim WithEvents btn As CommandButton
Dim frm As frmmain
 
Public Sub SetHandler(Control As frmmain)
    Set frm = Control
End Sub
Public Sub SetButton(Control As CommandButton)
    Set btn = Control
End Sub
Private Sub btn_Click()
    frm.MyEvent btn
End Sub
Обрабатываем только кнопки, но можно легко расширить на любой контрол, даже внешний ActiveX контрол.
Создаем форму в которой делаем публичный метод MyEvent и добавляем контролы:
Visual Basic
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
Option Explicit
 
Dim Col As Collection
 
Public Sub MyEvent(Control As CommandButton)
    MsgBox Control.Name
End Sub
 
Private Sub Form_Load()
    Dim i   As Long
    Dim btn As CommandButton
    Dim wrp As clsEventWrapper
    
    Set Col = New Collection
    
    For i = 0 To 10
        Set wrp = New clsEventWrapper
        wrp.SetHandler Me
        Set btn = Me.Controls.Add("VB.CommandButton", "btn" & CStr(i))
        btn.Move 5, i * (btn.Height + 100)
        btn.Visible = True
        wrp.SetButton btn
        Col.Add wrp
    Next
End Sub
Все.

По-хорошему нужно MyEvent сделать отдельными интерфейсом и реализовывать его через Implements, тогда будет возможность в разных объектах (не только формах, но вообще любых объектов) обрабатывать события динамически созданных контролов.
2
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
21.07.2014, 11:52
Цитата Сообщение от Антихакер32 Посмотреть сообщение
других байсиках события LostFocus-не существует
Но есть _Exit _Enter), если имелся ввиду VBA.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 11:54
Цитата Сообщение от dimas5552 Посмотреть сообщение
Спасибо, принцип понял. Теперь еще такой вопрос: а команда "Set btn = ActiveControl" что дает и почему без нее не работают кнопки?
Только это работает когда у тебя на форме только кнопки, для каждого типа контрола нужно передавать так фокус.
0
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
21.07.2014, 12:00  [ТС]
Так, кнопка (точнее кнопки) на форме у нас есть, у каждой свое имя но все они находятся в пределе одно массива btn. Зачем ей нужно передавать фокус если при клике по ней она автоматически считается в фокусе?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.07.2014, 12:04
если у тебя WithEvents btn то и события будут ловиться от этой ссылки
не важно кто еще там активен

вот и необходимо эти ссылки передовать, если активность меняется
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 12:10
Цитата Сообщение от dimas5552 Посмотреть сообщение
Так, кнопка (точнее кнопки) на форме у нас есть, у каждой свое имя но все они находятся в пределе одно массива btn. Зачем ей нужно передавать фокус если при клике по ней она автоматически считается в фокусе?
Смотри, у тебя одна объектная переменная генерирующая события, а контролов, которые могут генерировать события - много. Нужно как-то обработать клики по всем кнопкам. Вот ты и "подключаешь" эту переменную к активной кнопке, на которой может быть потенциальный клик.
Но если кнопка будет не в фокусе, то клик не пройдет. Например если пустить неактивной кнопке такое cmd.Value = True, ничего не произойдет.
0
7 / 7 / 0
Регистрация: 27.01.2014
Сообщений: 28
21.07.2014, 12:17  [ТС]
А если будут два массива с кнопками WithEvents btn и WithEvents btn2 то одновременно обоим фокус кудать?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.07.2014, 12:19
Цитата Сообщение от dimas5552 Посмотреть сообщение
А если будут два массива с кнопками WithEvents btn и WithEvents btn2 то одновременно обоим фокус кудать?
Один будет избыточен и не нужен. И это не массив.
Объявляя таким образом кнопку одна переменная отвечает за все кнопки.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
21.07.2014, 12:34
Можеш в Controls.add имя менять для btn2

Пример:
Visual Basic
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
Private Sub Form_Load()
    Dim o
    Const sL = 100, sz = 500, sT = sz + sL * 2
    Dim j$(), s$, i&, h&
    s = s & "7 8 9 = CE Sqr "
    s = s & "4 5 6 ( ) x^y "
    s = s & "1 2 3 + - Fix "
    s = s & "0 , % * / Mod "
    Set Script = CreateObject("MSScriptControl.ScriptControl"): Script.Language = "VBScript"
    Set col = New Collection: j = Split(s)
    For Y = 0 To nY - 1: For X = 0 To nX - 1
            Set Matrix32(X, Y) = Controls.Add("vb.CommandButton", "cmm_" & X & Y)
            With Matrix32(X, Y)
                Select Case X
                Case 3, 4: .Move sL * 2 + X * sz, sT + Y * sz, sz, sz: .Visible = 1
                Case 5: .Move sL * 3 + X * sz, sT + Y * sz, sz * 1.5, sz: .Visible = 1
                Case Else: .Move sL + X * sz, sT + Y * sz, sz, sz
                End Select:  .FontSize = 10: .FontBold = 1: .Caption = j(i): i = i + 1: .Visible = 1
            End With
    Next: Next
    Set cmb = Controls.Add("vb.ComboBox", "cmb")
    With cmb
        .FontSize = 10: h = .Height
        .Move sL, Matrix32(0, 0).Top - h - sL, (Matrix32(nX - 1, 0).Left + Matrix32(nX - 1, 0).Width) - sL: .Visible = 1: .Text = 0
        Me.Width = .Width + sL * 2 + (Me.Width - ScaleWidth)
    End With
    Set o = Controls("cmm_" & X - 1 & Y - 1)
    Me.Height = o.Top + o.Height + sz + sL
    Me.Caption = "Калькулятор VB ... © Антихакер32™"
End Sub
 
Private Sub cmm_LostFocus()
    If ActiveControl.Name Like "cmm_##" Then Set cmm = ActiveControl
End Sub
Добавлено через 2 минуты
тоесть определенное имя активного контрола но с цифрой
Set o = Controls("cmm_" & X - 1 & Y - 1)
If ActiveControl.Name Like "cmm_##"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2014, 12:34
Помогаю со студенческими работами здесь

Обработчик событий нескольких контролов?
Вообще-то я программирую на Delphi, а тут понадобилось сделать проект на VBA в Excel и обнаружилось, что я не представляю, как назначить...

Обработчик события динамически созданного контрола
Есть событие контрола panel_MouseMove, panel динамически создан и поэтому при создании он ссылается на это событие. В этом событие можно...

Обработчик нажатия динамически созданного класса
Допустим есть список в котором есть класс one,при нажатии на который в консоль выводится его имя и происходит смена класса на two. В...

Обработчик события для массива динамических контролов
Как создать сразу для всего массива динамически созданных контролов один одинаковый обработчик события? //В цикле picbox.Click += new...

Обработчик событий динамически созданных кнопок
Уважаемые форумчане, помогите студентам! У нас есть функция, которая создает количество кнопок, равное количеству файлов в папке ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru