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

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

21.07.2014, 09:59. Показов 9788. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru