|
I don't want to compare a string!
I want to compare a class..
ok as said above it worked without an interface but
See the above post ...
PLEASE..
I know you can help.
_____________________________________________________
Believe! Every thing has a purpose
|
|
|
|
|
You don't get it - that was an example.
If you want to see if an object is an instance of class, then you use the is keyword. This is conceptually the same as doing:
if (obj.GetType().Equals(typeof(SomeClass)))
{
} ...but is much shorter and compiles to few instructions. Try reading the documentation for the is keyword in your VS.NET documentation.
In the sample, obj is an instance of something, and you replace SomeClass with the class name. My sample using the string did just that.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok fine.. the code worked.. thanx..
but another problem.. this doesn't work if I have that function defined in a class implementing an interface, & instead of somclass I put the interface name? It doesn't work..
to my understanding, an instance of the class implementing the interface should be
if (obj.GetType().Equals(typeof(SomeInterface)))<br />
... true
right?
_____________________________________________________
Believe! Every thing has a purpose
|
|
|
|
|
Use is , not obj.GetType.Equals when you want to determine if an object is a type of something. So instead of using instanceOf in Java, you use is in C#. The statement I gave similar to above is only similar in concept. This results in many more instructions than the two to three instructions required to use is . What's so hard about understanding this?
if (obj is SomeClass)
{
} I mean, it's practically the same as using instanceOf in Java!
If you want to determine if an object implements an interface, you must get the Type by calling GetType on the object, then search for the interfaces. A class can never be an instance of an interface, since an interface is abstract and cannot be instantiated, so is or Type.Equals cannot be used.
Type t = obj.GetType();
if (t.GetInterface("ISomeInterface"))
{
} There's a couple other ways of doing this as well, such as calling Type.GetInterfaces and enumerating the Type array, which is actually better because then you compare actual types instead of strings, since a class could implement two interfaces named "ISomeInterface" but that are different types (different namespaces and/or different assemblies).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Wo! thats too much to think it might take a while...
_____________________________________________________
Believe! Every thing has a purpose
|
|
|
|
|
I am trying the second part you told me, but its not happening..
_____________________________________________________
Believe! Every thing has a purpose
|
|
|
|
|
Hi all,
I have developed a application which retreive html from different sites in order to save the content in my HD.
Problems appers using the event DWebBrowserEvents2_DocumentCompleteEvent because sometimes the pages are formed by variuos subpages in remote sites and must be loaded, so the application receives a lot of DWebBrowserEvents2_DocumentCompleteEvent events and it is impossible to know when is really finish.
Does anybody know a solution for this ?
Thanks a lot !!!
|
|
|
|
|
If you only want to know when the first page is loaded (the frameset), the use a simple state variable and handle the BeforeNavigate2 event. Set the state variable in the handler for that event. In your DocumentComplete event, check the state of the variable. If it's set, do what you need and reset the variable. If the variable isn't set, ignore further requests.
If you're saving content, however, wouldn't you want to be notified with each documented that is loaded when it finishes? If you just save the first document, all you get is the frameset (or any other document hosting other concent that fires this event). Without the "embedded" content, such a top-level document is useless (a framset without the frame content isn't much now, is it? ).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
In my case the application must wait for a compete load operation before call a click() method in order to navigate to the next page, so that's why it must know when all the frames/subpages have been loaded, a solution could be create a counter variable, but the number of subpages/frames to load in each page (document) is variable.
Any idea ?
|
|
|
|
|
DWebBrowserEvents2::DocumentComplete fires only after all lower-level frames have been loaded (in the case of a frameset). So using a state variable is still the way to go, but you'll actually want to store the URL being requested initially and compare that with the URL passed through the event arguments. If they are the same, your frameset is loaded.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi gurus,
it's me again.
My question is simple.
How can I create a thread in C#?
I would like to call DirectPlay functions in a thread.
The thread would manage all connections: Hosting/Connecting/enumerating/disconnecting sessions etc.
Because when I use the Peer's methods like Host, Connect etc. the interface do not answer anymore. The application look frozen.
I could do this in MFC but C# is different...
Thanks for the help.
best regards.
There is no spoon.
|
|
|
|
|
bouli wrote:
How can I create a thread in C#?
A thread in C# needs a delegate for a void method without any parameters:
<br />
Thread thread = new Thread(new ThreadStart(doSomething));<br />
thread.Start();<br />
In this example doSomething runs in the new thread. If the thread needs parameters, you have to use instance variables.
|
|
|
|
|
Hi,
I'd like to monitor the sites a user visits, so i'd like to log all the url's visited by a particular user!
Would it be possible to copy the url as soon as the user hits enter after typing in the url or am i going to have to copy the url from the browser cache or history!
Can some please help me out with the source code to do this , no matter what way you choose to do it!
Thanx 4 the help ..!
|
|
|
|
|
This is best done by using a Browser Helper Object (BHO). An old article on MSDN describing BHOs uses just the example you're looking for, except that instead of logging the URL it displays the content of the page when the document is done download. Read Browser Helper Objects: The Browser the Way You Want It[^]. If you need further help on this, please visit the VC++ forum here on CodeProject.
You can write a BHO using C#, but you need to declare a lot of interop'd interfaces and perform a lot of marshaling. Sorry to say, based on how you phrased your question you may have more problems with this. Besides, when you're hooking a majority of the events on DWebBrowserEvents2 , you need to be quick. Managed code can be faster than native code, but when a lot of marshaling is involved, you'll find that performance is quite a bit slower.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi gurus,
How can I create my own event and fire it in C#?
example code:
this following is taken from DirectX SDK DirectPlay tutorii
this event is fired by the Peer.FindHosts method
<br />
public void FindHostResponseHandler(object sender, FindHostResponseEventArgs args)<br />
{<br />
HostInfo Node = new HostInfo();<br />
Node.GuidInstance = args.Message.ApplicationDescription.GuidInstance;<br />
Node.HostAddress = (Address) args.Message.AddressSender.Clone();<br />
Node.SessionName = args.Message.ApplicationDescription.SessionName;<br />
<br />
if (!FoundSessions.Contains(Node))<br />
{<br />
FoundSessions.Add(Node);<br />
}<br />
}<br />
Thanks for the help.
best regards.
There is no spoon.
|
|
|
|
|
The correct way is to define a delegate that extends EventHandler , or use an existing one (depending on whether or not a particular delegate declares a param with an EventArgs -derivative that suits your needs).
Raising Events[^] in the .NET Framework SDK explains the recommended way of firing events, which includes declaring a delegate and EventArgs derivative (like I said, if necessary), declaring the event on your class, and making a protected virtual member named OnEventName that actually fires the event (so that derivative classes can either override it to handle events without a delegate (faster, with more control) or raise the event themselves).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
You've been faster again! This is the second time today that I write an answer to a new question, and when it is posted your answer is already there.
BTW: It's not necessary to derive from EventArgs . FxCop wants me to do so, but where is the real benefit?
|
|
|
|
|
It's just common for events. You're right, though, it's not necessary. Commonality, though, fosters better programming for those (few these days, it seems) that recognize the pattern.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I've got it... thanks
I start to understand the way it works.
it's even more simple than MFC... :P
There is no spoon.
|
|
|
|
|
Hi Heath,
I was looking that way... Delegates. it seems they look like callbacks.
I can declare my delegate, but I don't understand yet how to use it in my class.
I have done the following:
<br />
class PeerPlayer<br />
{<br />
...<br />
public delegate void HostFound(HostInfo node);<br />
<br />
public void FindHostResponseHandler(object sender, FindHostResponseEventArgs args)<br />
{<br />
HostInfo node=new HostInfo();<br />
<br />
node.GuidInstance=args.Message.ApplicationDescription.GuidInstance;<br />
node.HostAddress=(Address) args.Message.AddressSender.Clone();<br />
node.SessionName=args.Message.ApplicationDescription.SessionName;<br />
<br />
if (!m_sessions.Contains(node))<br />
{<br />
m_sessions.Add(node);<br />
}<br />
}<br />
...<br />
}:((<br />
There is no spoon.
|
|
|
|
|
Did you read the article I linked? It's really quite clear.
A delegate is a managed function pointer. By declaring an event on your class, you in effect declare a MulticastDelegate that maintains a list of delegates. When you invoke your event delegate, any handlers are called in any given order.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I can fire my event now
but I don't understand how I can use it outside of the class...
PeerPlayer pp=new PeerPlayer();
pp.HostFound+=new??? // new what???
I have implemented a HostFound handler in the form class.
There is no spoon.
|
|
|
|
|
bouli wrote:
// new what???
Use whatever delegate declared by the event. So if you declared public event EventHandler HostFound , then use new EventHandler(myhandler) .
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
ok, I've got it
the delegate was inside the PeerPlayer class.
I have done the following now:
pp.HostFound+=new HostFoundHandler(OnHostFound);
and it works
I'm now working on how to write the calls of the DirectPlay connections in a thread.
I would like to execute the following code in a thread:
<br />
public bool Enumerate(String hostName)<br />
{<br />
m_sessions.RemoveRange(0, m_sessions.Count);<br />
<br />
Address hostAddress=new Address();<br />
<br />
hostAddress.ServiceProvider=Address.ServiceProviderTcpIp;<br />
<br />
if (hostName.Length > 0)<br />
hostAddress.AddComponent(Address.KeyHostname, hostName);<br />
<br />
hostAddress.AddComponent(Address.KeyPort, m_port);<br />
<br />
ApplicationDescription appDesc=new ApplicationDescription();<br />
<br />
appDesc.GuidApplication=m_appGuid;<br />
<br />
try<br />
{<br />
m_peer.FindHosts(appDesc, hostAddress, m_localAddress, null, 0, 0, 0, FindHostsFlags.Sync);<br />
}<br />
catch(Exception ex)<br />
{<br />
Debug.WriteLine(ex.Message);<br />
return false;<br />
}<br />
<br />
return true;<br />
}<br />
There is no spoon.
|
|
|
|
|
If the event needs parameters, you can define your own delegate:
<br />
public delegate void MyEventHandler (object sender, HostInfo details);<br />
public event MyEventHandler MyEvent;<br />
To fire your event, just call it as if it was a method:
<br />
if(MyEvent != null){<br />
MyEvent(this, Node);<br />
}<br />
|
|
|
|