Страница: 1 | 2 | 3 | 4 |
Вопрос: Неразрешимая проблема? (WithEvents)
Добавлено: 03.11.04 22:16
Автор вопроса: Yxine H.W. | Web-сайт:
Пишу интересную программу, и столкнулся со следующей проблемой:
Как известно можно добавить контрол на форму в run-time командой {form}.control.add. Чтобы перехватывать события этого контрола надо создать переменную-объект с препараметром WithEvents. А вот как таким же макаром создать массив контролов (т.е. с одним именем, но разным Index)???
Ответы
Всего ответов: 50
Номер ответа: 1
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #1
Добавлено: 04.11.04 09:32
никак
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 04.11.04 11:08
Создай один в Design-Time, а остальные подгружай через Load. Это простой вариант. Более сложный и гибкий - сабклассинг.
Номер ответа: 3
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #3
Добавлено: 04.11.04 13:30
Сабклассинг здесь не причем. Одно дело СОМ, а другое WinAPI.
Добавить контрол с индексами никак не получиться. А вот события ловить можно у произвольного количества произвольных контролов и объектов.
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 04.11.04 15:39
Добавить контрол с индексами никак не получиться.
В Design-Time лепишь на форму кнопку Command1, ставишь Index=0. Далее:
Sub Form_Load
Dim i As Long
For i = 1 To 20
Load Command1(i)
Command1(i).Move i * 200, i * 100
Command1(i).Visible = True
Next i
End Sub
Private Sub Command1_Click(Index As Integer)
MsgBox "Button " & Index
End Sub
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 04.11.04 15:45
Добавить контрол с индексами никак не получиться.
В Design-Time лепишь на форму кнопку Command1, ставишь Index=0. Далее:
Dim i As Long
For i = 1 To 20
Load Command1(i)
Command1(i).Move i * 200, i * 100
Command1(i).Visible = True
Next i
Номер ответа: 6
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #6
Добавлено: 04.11.04 15:46
Ну к чему этот код?
Есть возражения, что добавить run-time контрол с индексами никак не получиться ?
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 04.11.04 16:01
Мля, ну а Load Command1(i) - это что, Design-Time что ли??
Номер ответа: 8
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #8
Добавлено: 04.11.04 16:08
Вопрос прочитай.
Как известно можно добавить контрол на форму в run-time командой {form}.control.add. Чтобы перехватывать события этого контрола надо создать переменную-объект с препараметром WithEvents. А вот как таким же макаром создать массив контролов (т.е. с одним именем, но разным Index)???
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 04.11.04 16:17
Я прочитал внимательно. Не думаю что таким же макаром - это значит точно так. Через Dim этого не сделаешь. Я привел метод которым можно это сделать.
Второй вариант - сабклассинг. Просто указываешь для элементов, созданных через Controls.Add или CreateWindowEx, одну и ту же процедуру обработки. А "индекс" определяешь по hWnd окна. Чем тебе не вариант?
Номер ответа: 10
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #10
Добавлено: 04.11.04 16:28
А что же это может значить ?
Да ну. Поймай событие контрола с таким кодом.
Event НаИзмениласьПогода
Private Sub ИзмениласьПогода
RaiseEvent НаИзмениласьПогода
End Sub
Да ну. Все контролы публикуют его?
Сабклассить имеет смысл только виндовые контролы.
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 04.11.04 17:22
Разумеется я писал про оконные контролы. Думал это очевидно. С неоконными
нужен индивидуальный подход.
Ну если возьмешь в пример Winsock - куда уж неоконней, то там также
создаются массивы через Load.
Номер ответа: 12
Автор ответа:
Yxine H.W.
Разработчик Offline Client
ICQ: 479471
Вопросов: 3
Ответов: 29
Web-сайт:
Профиль | | #12
Добавлено: 04.11.04 17:24
Публикую часть кода чтобы проще было разобраться что вообще надо:
Код для формы Form1 (на ней лежит собственный конрол FormEx):
Option Explicit
Код контрола FormEx:
Option Explicit
Private WithEvents Button0 As CommandButton
Private WithEvents Button1 As CommandButton
Private WithEvents ParentFrm As Form
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
On Error Resume Next
Set ParentFrm = Parent
End Sub
Private Sub ParentFrm_load()
On Error Resume Next
Set Button0 = ParentFrm.Controls.Add("VB.CommandButton", "Button0", ParentFrm)
With Button0
.Left = 10
.Top = 10
.Caption="Номер 0"
.Visible = True
.ZOrder 0
End With
Set Button1 = ParentFrm.Controls.Add("VB.CommandButton", "Button1", ParentFrm)
With Button1
.Left = 100
.Top = 100
.Caption="Номер 1"
.Visible = True
.ZOrder 0
End With
End Sub
Private Button0_Click()
msgbox("Нажата 0"
End if
Private Button1_Click()
msgbox("Нажата 1"
End if
Что делает: при запуске Form1 на ней (через компонент FormEx) автоматически создаются две кнопки.
Так вот замечательно было бы объединить Button1 и Button2 в один элемент управления, скажем с именем Button и
индексами 0 и 1 соответственно. Тогда бы событие Click выглядело бы так:
Private Button_Click(index as integer)
msgbox("Надата " & index)
end sub
Что есть намного лучше чем первый вариант! Но как этот грёбаный Index вмутить inside неизвестно (и вообще можно
ли?).
2LamerOnLine: please, про Load {controlname(index)} не надо больше писать. Это всё даже начинающие знают.
А вот насчёт сабклассинга, то можно ли поподробнее? Хотя бы для приведённого выше примера, а то у меня уже голова
болит думать
Номер ответа: 13
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #13
Добавлено: 04.11.04 17:32
Речь идет только о кнопках или о произвольных контролах, которые заранее не известны или их количество очень большое и от них всех надо ловить события ?
Номер ответа: 14
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #14
Добавлено: 04.11.04 17:41
Оконный контрол это любой UserControl, который видим во время выполнения?
Ну я же написал код оконного контрола. Поймай от него событие через сабклассинг.
Сабклассить ничего не надо. Сабкласс ведет к построению сложной обертки вокруг контрола и не возможен в общем случае.
Если контролы заранее известны, то проще всего писать класс-обертку и создавать экземпляр на каждый контрол.
Номер ответа: 15
Автор ответа:
Yxine H.W.
Разработчик Offline Client
ICQ: 479471
Вопросов: 3
Ответов: 29
Web-сайт:
Профиль | | #15
Добавлено: 04.11.04 22:25
Речь идёт о любом стандартном контроле. Хотя usercontrol также можно добавить, это не сложно. Неоконные контролы тоже надо взять в рассчёт (Label, например)!