Массив с withevents

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Массив с withevents

Сообщение GM » 27.03.2004 (Сб) 17:20

У меня есть класс Socket, мне нужно сделать массив Socketов ,но чтобы одновременно работали события.Вообщем:
Код: Выделить всё

Dim WithEvents sckClient(0 to 10) as Socket

не работает.[/code]

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.03.2004 (Вс) 6:52

И не будет работать.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Массив с withevents

Сообщение codemaster » 28.03.2004 (Вс) 14:46

[quote="GM"]У меня есть класс Socket, мне нужно сделать массив Socketов ,но чтобы одновременно работали события[quote]

Collection устроит?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 29.03.2004 (Пн) 11:25

Collection тоже не будет работать. Ничего не будет работать, кроме control array, созданного в design time на форме.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 29.03.2004 (Пн) 15:11

Ennor писал(а):Collection тоже не будет работать. Ничего не будет работать, кроме control array, созданного в design time на форме.


Уверен ? Напрямую конечно нет , но можно написать обертку

sanches
El compañero
El compañero
 
Сообщения: 823
Зарегистрирован: 09.01.2003 (Чт) 3:58
Откуда: Р_О_С_С_И_Я ! (Питер)

Сообщение sanches » 29.03.2004 (Пн) 16:33

Единственный способ - сделать массив объектов и объявить одну переменную WithEvents
Dim myArray as Collection
Dim WithEvents objSocket as Socket

Присваивая objSocket'у элементы массива можно отловить их события, правда не знаю, как тебе это может помоч, ведь жтот способ применим в основном в таких случаях:

Set objMyObj = MyArray(2)
objMyObj.Name = "Name"
....
Private Sub objMyObj_MyEvent(...)
End sub

то есть присваиваем, изменяем св-во и ловим событие. А как постоянно следить за каждым не знаю. Можно попробовать по таймеру присваивать переменной objSocket элементы...
Изображение

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 29.03.2004 (Пн) 18:30

Народ, да вы чего? Конечно, надо обертку писать. Codemaster абсолютно прав. Этот вопрос (по поводу отлова событий от элементов коллекции) жуть какой популярный и решение давно придумано.

1) Пишем класс (SocketWrapper), который содержит сокет и ссылку на некий объект-посредник, у которого будем ловить события
Код: Выделить всё
Private m_Mediator As Mediator
Private WithEvents m_Socket as Socket
Private m_ID as Long

'устанавливаем ссылку на посредника и записываем ID
Public Sub Init(objMediator as Mediator, nID as Long, objSocket as Socket)
   Set m_Mediator = objMediator
   m_ID = nID
   Set m_Socket = objSocket
end sub

'ловим событие
Public Sub m_Socket_Event(...)
    m_Mediator.GenerateEvent nID
end Sub


2) Класс-посредник (Mediator), который содержит единственный метод, который вызывают "оберточные сокеты" и умеет кидать событие. Его единственное назначение - это сгенерить событие.
Код: Выделить всё
Public Event SocketEvent(Socket_ID as Long)

Public GenerateEvent(nID as Long)
   RaiseEvent SocketEvent(nID)
end sub


3) там, где нужна эта коллекция, будет лежать коллекция сокетов и объявленный WithEvents посредник. Ловить события будем от посредника - он передаст всю необходимую информацию.
Private WithEvents m_Mediator as Mediator
Private m_ccSockets as Collection

'добавляем i-й элемент (objSocket) в коллекцию
Код: Выделить всё
Set elem = New SocketWrapper
elem.Init m_Mediator, i, objSocket
m_ccSockets.Add elem


'ловим событие от посредника
Код: Выделить всё
Public Sub m_Mediator_SocketEvent(nID as Long)
   MsgBox "Словили событие от сокета с номером " & nID
end sub


Пожалуй, все.
Зачем нужен посредник - почему нельзя передать в обертку сразу ссылку на основной класс? Дело в том, что тогда образуются циклические ссылки - родитель содержит коллекцию из объектов, которые имеют ссылку на родителя. Это грозит тем, что эти объекты при выходе из программы не разрушатся. При реализации с посредником такой проблемы нет - разрушится сначала коллекция, потом все ее элементы уничтожат ссылки на посредника, потом уничтожится посредник.

В принципе, в событии можно передавать сам объект (сокет).


vbskb_event vbskb_control vbskb_controlarray
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 30.03.2004 (Вт) 11:46

мои 10 копеек :wink:


http://www.mvps.org/emorcillo/vb6/com/index.shtml

EventCollection Class v2.0 - Add event support to Collections

простенько и со вкусом

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.03.2004 (Вт) 13:06

Ну, с классами по-другому и не сделать, согласен. А вот с визуальными контролами, боюсь, не прокатит.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 30.03.2004 (Вт) 13:11

Ennor писал(а):Ну, с классами по-другому и не сделать, согласен. А вот с визуальными контролами, боюсь, не прокатит.



Ты не бойся
Лучше подумай что представлят собой визуальный контрол и чем он отличается от vb класса

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.03.2004 (Вт) 13:15

Хе. Ну попробуй как-нить написать что-нить вроде:
Код: Выделить всё
Private WithEvents X as New CheckBox

Сам и увидишь :shock:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.03.2004 (Вт) 14:53

А для визуальных контролов есть массив, в дизайнтайм создаваемый и через параметр index доступный, а потому негоже иные методы применять окромя встроенных...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.03.2004 (Вт) 17:51

GSerg писал(а):А для визуальных контролов есть массив, в дизайнтайм создаваемый и через параметр index доступный, а потому негоже иные методы применять окромя встроенных...

Совершенно верно. Только вот когда возникает необходимость в иерархии типа "массив в массиве", вот тогда начинаются проблемы... :evil:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 01.04.2004 (Чт) 15:39

Спасибо всем , а то никак выкрутится не мог.


Вернуться в Visual Basic 1–6

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

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

    TopList