Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 333
  • Last Modified:

Event handler for objects array

I have a class module called ClientClass that receive data from winsock control and has a DataReceived event. Another class - AppClass uses the ClientClass this way:

private WithEvents Clients() as ClientClass

private sub Class_Initializate()

     redim Clients (ValueFromDatabase)

End Sub



How do I implement one event handler function in the AppClass for all the Clients?


0
EyalL
Asked:
EyalL
  • 3
  • 2
  • 2
  • +2
1 Solution
 
crazymanCommented:
Create an interface class IClient
- Add your methods EG

public sub DataArrival(NewData as string,objClient as ClientClass)
'Place no code here
end sub


Implement this interface where you want to get the events ie maybe in your main form.

Implements IClient

you will get this event now

sub IClient_DataArrival(NewData as string,objClient as ClientClass)
'place your code here
'objClient is the clss where the event came from
end sub

Now add this Variable/Property to clientclass
public OwnerInterface as IClient

now when create your objects do the following, and hold them in a collection eg MyCollection

dim objClient as ClientClass
set ObjClient = new ClientClass
set objClient.OwnerInterface = me
MyCollection.add objClient


Now instead of doing Raiseevent in your clientclass do
OwnerInterface.DataArrival(TheData,me)

You will now get events from all classes throught the one IClient_DataArrival with the instance of the class as the objClient parameter...
0
 
EyalLAuthor Commented:
thanks crazyman,

I'll try that.

Is there any other simpler way (except of moving to VB.NET)?
0
 
crazymanCommented:
There is another way, without using the interface but it is a similar method.
Create a class module that has the events in, create methods that simply raise the events, have one instance declared withevents and hold a ref to that instance from each class, then call the methods from each class passing through the instance, it is pretty much the same just using a instance of a class instead of an interface...
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
Mike TomlinsonMiddle School Assistant TeacherCommented:
VB.Net will elegantly solve your event handling problem via the AddHandler() function but it has no equivalent of the Winsock Control so you would have to rebuild ALL of your communication code from scratch using a lower level methodology.

Idle_Mind
0
 
_agj_Commented:
private WithEvents Clients() as ClientClass

create an Event MyEvent in your ClientClass.
on DataReceived event of the winsock, raise ur MyEvent.

in ur AppClass u shud get this event with its index in the array.

so u can just code a:

sub Clients_MyEvent(indx as integer)
'the data has arrived for clients(indx)
clients(indx).dourstuff

end sub
0
 
_agj_Commented:
i cant see whats limiting here...???
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
The limiting factor is that you didn't try your own code out!  From the help file:

You should be aware of the following limitations on the use of WithEvents variables:
     A WithEvents variable cannot be a generic object variable. That is, you cannot declare it As Object — you must specify the class name when you declare the variable.
     You cannot declare a WithEvents variable As New. The event source object must be explicitly created and assigned to the WithEvents variable.
     You cannot declare WithEvents variables in a standard module. You can declare them only in class modules, form modules, and other modules that define classes.
     You cannot create arrays of WithEvents variables.

VB immediately flags the line with a compile error in the IDE.

Regards,

Idle_Mind
0
 
_agj_Commented:
...idle_mind u are right...
i was assuming the array of withevents would work(though i havent seen it wrk..except for arrays of controls)...

looks more interesting now ;)
0
 
SRigneyCommented:
Not any better, but I have used an array of my own UserControls, and each user control had one instance of my class.
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 3
  • 2
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now