|
The nice thing about it is you are using a params.
I did not know Control.Invoke took params, it is not in the documentation, but it does show in intellisense.
[ADDED]
However, your example does not need real data (such as a string in my SetText example), so using EventHandler seems not a general solution. Or do you see a way to generalize without much expense?
[/ADDED]
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
modified on Wednesday, May 19, 2010 12:05 PM
|
|
|
|
|
Well, then we both learned something.
(Not about the return ; I know the language doesn't require it, but it should, just as C used to require parameters parentheses around the value. "Every method should have exactly one return statement." It at least provides a convenient place for a breakpoint.)
modified on Wednesday, May 19, 2010 12:57 PM
|
|
|
|
|
PIEBALDconsult wrote: I know the language doesn't require it, but it should
I could live with that, similar to breaks in switch cases.
PIEBALDconsult wrote: just as C used to require parameters around the value
you mean parentheses? Did it really? I can't recall; I do recall I used to always put them, and then, some ten years ago, I stopped doing that.
K&R, in appendix A on syntax said:
return ;
return expression ;
but they also did put parentheses on their examples.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Luc Pattyn wrote: similar to breaks in switch cases
switches shouldn't use break at all. Stopping (not falling through) should be the normal flow without using a break statement.
Luc Pattyn wrote: you mean parentheses?
Yes...
A while (years) back, the subject came up and I found that Dennis Ritchie had put some of his old (circa 1974) C compiler code online and I looked through it and found that they appeared to be required, and his 1974 document says:
"
9.10 Return statement
A function returns to its caller by means of the return statement, which has one of the forms
return ;
return ( expression ) ;
In the first case no value is returned. In the second case, the value of the expression is returned to the caller of the
function. If required, the expression is converted, as if by assignment, to the type of the function in which it appears.
Flowing off the end of a function is equivalent to a return with no returned value.
"
That got relaxed some time later, but the habit got passed on to me in the '80s.
|
|
|
|
|
cases not falling through without a change-of-flow statement such as break would be rather confusing for programmers with a C-family heritage.
especially so when several cases get grouped, as in the empty case C# supports:
switch(myInt) {
case 0:
case 1:
...
break;
case 2:
case 5:
case 6:
case 7:
...
break;
}
I then certainly would want case lists (and case ranges): case 2, 5-6:
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
But had it been that way from the start...
And if braces (as I use them) were required instead it would be clearer.
switch ( myInt )
{
case 0:
case 1:
{
...
}
case 2:
case 5:
case 6:
case 7:
{
...
}
}
|
|
|
|
|
FWIW: in C the normal curly brackets allow local variable declarations, which sometimes comes in handy:
switch ( myInt ) {
int x, y;
case 1:
x=...;
y=...;
return x*y;
case 7:
x=...;
y=...;
return x/y;
}
C# does not like the idea. It does accept
switch ( myInt ) {
case 1:
int x=2;
int y=3;
return x*y;
case 7:
x=3;
y=4;
return x/y;
}
which is quite ugly IMO.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I would have loved (in an evil and twisted way) to do this:
switch (myInt)
{
case 1:
int x = 2;
int y = 3;
return x * y;
case 7:
return x / y;
}
But sadly it complains about the unassigned x and y ..
|
|
|
|
|
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I just pulled out my VAX C 3.0 book (circa 1989) to see what it says on the matter.
It says that you can declare, but not initialize variables defined "in the compound statement within a switch statement".
switch ( x )
{
int i = 42 ; // Will be uninitialized (no warning?)
case 1 :
{
int j = 42 ; // This, of course, is limited to this scope
}
}
The C99 spec I have seems to agree with this, but it's hard to understand.
|
|
|
|
|
Luc Pattyn wrote: do you see a way to generalize without much expense
I'm hoping there is a way, but at the moment I have no need of one (which doesn't usually prevent me from trying anyway ).
When I whipped that up, I had the idea that it might serve as a general template for other such handlers that might require data from a derived EventArgs. At least it uses the pre-existing delegate.
I was just trying to make a generic version, but it's not as straight-forward as I would hope and probably not very useful. I would expect an anonymous method could be passed in that would do the actual work.
My feeling is that checking InvokeRequired and Invoking as necessary should be built into the classes and the application shouldn't need to worry about it. So what if slows down the code a little when it isn't required.
|
|
|
|
|
Okay, guys it seems that right now a "thank you" is all I have to say in this thread.
Thank you for the help guys! I checked multi threading, and I'm using the backgroundworker. Just as you've said, it produced the cross thread errors, but I got rid of them relatively easily. So I'm on my way, thank you again!
|
|
|
|
|
you're welcome.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Luc Pattyn wrote: generalize without much expense
Code is cheap.
I defined an abstract class EventArgsWrapper which derives from EventArgs then derived EnabledEventArgs (to hold a bool) and TextEventArgs (to hold a string). My DoSomething method can then use the provided EventArgs to decide what task is requested.
private void
DoSomething
(
object sender
,
System.EventArgs e
)
{
System.Windows.Forms.Control c = sender as System.Windows.Forms.Control ;
if ( c == null )
{
throw ( new System.InvalidCastException ( "sender must be a System.Windows.Forms.Control" ) ) ;
}
if ( c.InvokeRequired )
{
c.Invoke ( new System.EventHandler ( DoSomething ) , sender , e ) ;
}
else
{
EventArgsWrapper w = e as EventArgsWrapper ;
if ( w == null )
{
throw ( new System.InvalidCastException ( "e must be an EventArgsWrapper" ) ) ;
}
if ( w is EnabledEventArgs )
{
c.Enabled = ((EnabledEventArgs) w).Enabled ;
}
else if ( w is TextEventArgs )
{
c.Text = ((TextEventArgs) w).Text ;
}
}
return ;
}
// sender is already known to be a Control in this case
string temp = sender.Text ;
this.DoSomething ( sender , new EnabledEventArgs ( false , e ) ) ;
this.DoSomething ( sender , new TextEventArgs ( "Wait..." , e ) ) ;
/* Long-running process */
System.Threading.Thread.Sleep ( 5000 ) ;
this.DoSomething ( sender , new TextEventArgs ( temp , e ) ) ;
this.DoSomething ( sender , new EnabledEventArgs ( true , e ) ) ;
I suppose I could use Reflection to enumerate the public properties of the EventArgs and use them to set the sender's properties that match by name (and type?)... nah, far too much work. Maybe a Dictionary...
|
|
|
|
|
Yes, that looks OK.
I'm not sure I would have a EventArgsWrapper class, TextEventArgs could derive from EventArgs; a simple null test would filter the real nulls, the sequence of if(e is ...) would take care of the rest anyway.
Your example is still limited to properties that exist for all Controls; it becomes tedious when a property exists only for some, such as SelectionStart (TextBox, ComboBox, MonthCalendar, ...). Maybe use your style for the popular ones, and reflection for the others.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
The EventArgsWrapper holds the reference to the InnerEventArgs that is common to Enabled... and Text...
public abstract class EventArgsWrapper : System.EventArgs
{
public System.EventArgs InnerEventArgs { get ; private set ; }
public EventArgsWrapper
(
System.EventArgs InnerEventArgs
)
{
this.InnerEventArgs = InnerEventArgs ;
return ;
}
}
public sealed class TextEventArgs : EventArgsWrapper
{
public string Text { get ; private set ; }
public TextEventArgs
(
string Text
,
System.EventArgs InnerEventArgs
)
: base
(
InnerEventArgs
)
{
this.Text = Text ;
return ;
}
}
But if I rewote it so that it held a Dictionary of various things, I probably wouldn't need to have a hierarchy of classes, only the one. That would reduce the amount of Reflection needed considerably.
Luc Pattyn wrote: Maybe use your style for
I'm not saying I'd use it all; it's primarily an intellectual nerdy exercise.
Anyway, I need a nap. Perhaps I'll experiment more later.
|
|
|
|
|
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Look this codeproject article:
Multithreading, Delegates, and Custom Events[^]
It should help you quite a bit.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
Hi
I am not sure if I am posting this in the correct forum. If not then please advice me.
I need to recreate an application in C# that controls a device. The reason I am doing this is because the application provided with the device is incifitient.
What do I need to know about the driver in order to control it by the program? At the moment I have very little knowledge of device drivers, so any help is appreciated. I have found lots of tutorial on how to use PInvoke, but do I need to find out what methods the device driver will allow the software to connect to? and if so how do I go about it?
Once again any help is appreciated as I am a student who is still in the learning stage.
Oh the device is an LED matrix control unit that is connected by both usb (sends the device control) and component video (sends the images to be displayed on the LED matrix)
|
|
|
|
|
You might start by looking at this[^] article and follow the example of the author (contact the manufacturer).
I found this by a simple Google search. If you do the same you are likely to get more and better help than you will here.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
Why do programmers often confuse Halloween and Christmas?
Because 31 Oct = 25 Dec.
|
|
|
|
|
I would tackle the manufacturer of your peripheral and driver, and demand documentation. That is the way to learn what commands are available.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Might be worth looking at Sharb USB Lib[^]. You may be able to control the device directly by reading and writing to the USB port.
You would still need a lot of input from the manufacturer though.
|
|
|
|
|
How can I calculate muslim holiday in georgian calendar? Do you have any source code?
|
|
|
|
|
dataminers wrote: Do you have any source code?
I have plenty. Millions upon millions of lines of the stuff.
dataminers wrote: How can I calculate muslim holiday in georgian calendar?
Well - if I were you, I'd start by working out what the underlying algorithm is for calculating the holidays. With so many practicing muslims the world over, I'm guessing that they aren't just the whim of a random group of people.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
Pete O'Hanlon wrote: I have plenty. Millions upon millions of lines of the stuff.
Yeah, but does that contain anything related to Saint George?
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|