|
Like this:
public static string MyFunc(MyEnum parameters)
{
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
for (int v = 0; v < values.Length; v++)
{
if ((parameters & values[v]) == 0)
{
}
}
}
the if always evaluates to true, since the code inside it always executes... Is it right? Thanks!
Windows Calculator told me I will die at 28.
|
|
|
|
|
Dont worry, you will soon get a bug fix for your calculator...
Luc Pattyn
|
|
|
|
|
I sure hope so, if not I only have 11 years of life...
Windows Calculator told me I will die at 28.
|
|
|
|
|
You don't need to cast Enum to MyEnum, and your compare statement is not right.
I suggest the following:
public static string MyFunc(MyEnum parameters)
{
foreach(object v in Enum.GetValues(typeof(MyEnum))
{
if ((parameters & (MyEnum)values[v]) == true )
{
}
}
}
To explain the if statement, here is an example of a byte if true:
parameters: 0000 0100
Values[v]: 0000 0100 &
Result: 0000 0100 = true == parameters
and if false
parameters: 0001 0000
Values[v]: 0000 0100 &
Result: 0000 0000 == false != parameters
This will test if that parameter -and only that parameter- is chosen. If you need to test a parameter among others -i.e. more than one parameter can be chosen at a time and you want to test them-, this will need some modification.
-- modified at 23:20 Saturday 16th December, 2006
Regards
|
|
|
|
|
You mean... like this?
public static string Parameter(MyEnum parameters)
{
foreach(object v in Enum.GetValues(typeof(MyEnum)))
{
if ((parameters & (MyEnum)v) == true)
{
}
}
}
That gives me a compile error in the if line:
"Operator '==' cannot be applied to operands of type 'MyEnum' and 'bool'"
You write something wrong or something? :P Thanks!
Windows Calculator told me I will die at 28.
|
|
|
|
|
if ((parameters & (MyEnum)v) != 0)
will do the job
Luc Pattyn
|
|
|
|
|
In C++ anything not equal to zero is equal to true. It doesn't work in C# and I forgot about that -sorry!-.
I gave you an alternate in my solution is to compare it to your parameters . i.e.
if((parameters & (MyEnum)v) == parameters)
Regards
|
|
|
|
|
You have the data types mixed up.
The result of a binary operation between two enum values is an enum value, not a boolean. You can't compare an enum value to a boolean, you have to compare it to an enum or a number.
Just like the Lord did.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
Crap... Well, here's my current code:
public static string Parameter(ScreenParameter parameters)
{
foreach(object v in Enum.GetValues(typeof(ScreenParameter)))
{
if ((parameters & (ScreenParameter)v) == (ScreenParameter)v)
{
}
}
}
There's something wrong with MyEnum:
public enum MyEnum
{
AllOff = 0,
Bold = 1,
Blink = 5,
FgBlack = 30,
FgRed = 31,
FgGreen = 32,
FgYellow = 33,
FgBlue = 34,
FgMagenta = 35,
FgCyan = 36,
FgWhite = 37,
FgDefault = 39,
BgBlack = 40,
BgRed = 41,
BgGreen = 42,
BgYellow = 43,
BgBlue = 44,
BgMagenta = 45,
BgCyan = 46,
BgWhite = 47,
}
If I run this, the if body executes on the first 5 values (AllOff, Bold, Blink, FgBlack, FgRed) no matter what I pass to it... However, if I replace MyEnum with this:
public enum MyEnum
{
One = 1,
Two = 2,
Three = 4,
Four = 8,
Five = 16,
Six = 32,
Seven = 64
}
It works perfectly!
Can you figure out what's wrong? Maybe my laptop is mad at me because... not going into details, what's wrong? Thanks!
Windows Calculator told me I will die at 28.
|
|
|
|
|
Hi,
first of all you can avoid sime explicit casting:
public static string Parameter(ScreenParameter parameters) {
foreach(ScreenParameterv in Enum.GetValues(typeof(ScreenParameter))) {
if ((parameters & v) == v) {
}
}
}
Second the enumeration values have to be like in your second sample. Internally a enumeration value is just held as an integer. When combining several enum values those integers are simply added together. Only if the correpsonding integer values are on the 2^n line your code will work. .Net will do this internally for you if you just omit the values in the declaration.
Robert
|
|
|
|
|
To use an enumeration as flags, you have to make sure that the bit patterns of the values you plan to use together doesn't conflict.
With the values you have used, you can't for example tell the difference between (FgWhite), (FgWhite | Bold), (FgWhite | Bold | Blink), (FgGreen | Blink ) or (FgGreen | Blink | Bold), as they all result in the same value.
You can give each flag one bit each, like in yor second example.
You can also use a range of bits to represent exclusive values. I assume that you will only use one foreground and one background colour at a time, so all the colours wouldn't need a bit each to be represented. Something like:
public enum MyEnum {
AllOff = 0,
Bold = 256,
Blink = 512,
FgBlack = 1,
FgRed = 2,
FgGreen = 3,
FgYellow = 4,
FgBlue = 5,
FgMagenta = 6,
FgCyan = 7,
FgWhite = 8,
FgDefault = 9,
BgBlack = 16,
BgRed = 32,
BgGreen = 48,
BgYellow = 64,
BgBlue = 80,
BgMagenta = 96,
BgCyan = 112,
BgWhite = 128,
Fg_MASK = 15,
Bg_MASK = 240
}
This of course means that you can't just loop through the possible values, as for example (FgGreen) equals (FgBlack | FgRed). You have to extract the colour values using a mask (that I have also put in the enum).
(value & Fg_MASK) gets the foreground colour and (value & Bg_Mask) gets the background color.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
The enum also should have the [Flags] attribute applied to it so the compiler knows that it is being used in this manner. It's not mandatory, but it does generate some different code for the ToString method and lets FxCop run some additional validations.
You also might want to consider specifying the values as a hex value rather than decimal. I have found that it helps me make sure that I'm not missing a value.
-----------------------------
In just two days, tomorrow will be yesterday.
|
|
|
|
|
Ooops!!:-> Little C++ mistake where anything not zero is true...
Regards
|
|
|
|
|
|
Well, in your original post you said that the processing you do in your method is almost the same for several enum values. I assume that you can divide your enum into two main groups: foreground, and background. Foreground colors has the integer range of 30-39; While Background colors has the range of 40-47. You can check that range in only two if statements and apply the color to the fore/background accordingly.
Does that make things easier than the bitwise AND?
Lord Kixdemp wrote: when will be the day when someone invents THE programming language that will extinguish all others?
Perhaps when we invent the Matrix code?!! Don't expect that day to come soon. The best we can do is to put standards and ways of interop -e.g. COM-. If you did invent that all-in-one, be sure to let us know -seriously-.
Lord Kixdemp wrote: Windows Calculator told me I will die at 28
Did it tell you something about the rest of us?;)
Regards
|
|
|
|
|
Lord Kixdemp wrote: Well, as you can see, the values have to be as I had them:
http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
Then you can't combine them.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
Hello,
I have a class let us call it Rect.cs with an internal System.Drawing.Rectangle object called rect instantiated in the constructor of class Rect.
Rect.cs has also a
void Paint(Graphics g)
{
g.FillRectangle(Brushes.Red,rect);
}
In my Windows form called Form1 i have :
a button with the click event handler. It creates a myClass object. After creating the object i call this.Invalidate() for the form to redraw.
I also have the Paint method for the window form that calls the Paint() method for the Rect object
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
rectObj.Paint(e.Graphics);
}
But it doesn't happen anything?!
Something important i've missed regarding redrawing or so?
Explanations with additional pseudo would be great !
Thanks from a tired guy!
|
|
|
|
|
I suggest you add something (such as Console.WriteLine statements) to make sure
if and when your Form1_Paint and Rect.Paint methods get called.
Are you sure rect bounds are such that it is visible inside your form ?
Did you print them out ? Could it be covered by something else ?
When a program does not behave to expectations, dont trust any part unless you have
seen proof of it working properly (I prefer log lines such as Console.WriteLine!)
Luc Pattyn
|
|
|
|
|
Hi,
I had a MessageBox.Show() in my rect.Paint() and that was called
constantly due probably to redraws of the Form. Therefore i can say that g.FillRectangle(x,y,w,h) is called.
But if i set x,y,width,heigth to say 80,20,20,20 respectively it is 20px in x and 89 px in y direction from the left-upper corner of the form ?
Is it Z-order of the rectangle i must set?
I think there is something wrong with how it draws..
Thanks
|
|
|
|
|
Hi again,
I solved it. It had to do with the offset for which a created the rectangle.. I tried som other numbers and it worked..
So now i can go on
Thanks all!
|
|
|
|
|
Hello All,
I am looking for an Design Pattern or Architectural design for the following (common) situation.
A Program that displays various 'Architectural Materials'(Paints, Wallcoverings, Carpet)
Each material has a few common properties (name, manufacturer, price etc)
Each 'subtype' has specific props (Paint=coverage & finish, Carpet=fiber & size)
What is the best way to deal with this in Objects, Database & GUI?
For Objects I could use a Decorator Pattern to make Paintable(material) or Wallcoverable(material)
Is that the best way to look at this?
For the db should I have a main Materials table then various PaintProps Table, CarpetProps table etc. (Rather then a Paints, Carpet table separately )
For the GUI I probably need a separate display form for each type of material (Paint, Carpet, Wallcovering) Is there a trick I need to know.
All input is greatly appreciated.
Thanks in advance
CM
|
|
|
|
|
I don't know how to use the operators DIV and MOD.
Help.
Vasildb
|
|
|
|
|
6 div 4 = 6 / 4
6 mod 4 = 6 % 4
|
|
|
|
|
Taking ejuanpp's answer one step further:
6 div 4 = 6 / 4 = 1
6 mod 4 = 6 % 4 = 2
/ravi
|
|
|
|
|
How to correct the date writen in textBox.
Example: If in the textBox i write 0 or number >31 it will falls.
What i have to do, but in textBox no in other like comboBox.
Help.
Vasildb
|
|
|
|
|