Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Неразрешимая проблема? (WithEvents) Добавлено: 03.11.04 22:16  

Автор вопроса:  Yxine H.W. | Web-сайт: www.gsmmix.ru | ICQ: 479471 
Пишу интересную программу, и столкнулся со следующей проблемой:

Как известно можно добавить контрол на форму в 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


hWnd окна


Да ну. Все контролы публикуют его?
Сабклассить имеет смысл только виндовые контролы.

Ответить

Номер ответа: 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-сайт: www.gsmmix.ru
 Профиль | | #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-сайт: www.gsmmix.ru
 Профиль | | #15
Добавлено: 04.11.04 22:25
Речь идёт о любом стандартном контроле. Хотя usercontrol также можно добавить, это не сложно. Неоконные контролы тоже надо взять в рассчёт (Label, например)!

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам