|
You know you have a low and crude sense of humour!
I feels sorry for the next bloke who does not lock his PC before dissappearing out the door
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi, I finally got something working with keyboard Hooks. However, now both unicode character and the key value of the pressed are being sent. For example, when I pressed Q, I expect to see Ɣ on word, notepad etc. However, I'm getting both i.e. QƔ at the moment. How should I remove the Q and display only the sent character?
private void Form1_Load(object sender, EventArgs e)
{
ghook = new GlobalKeyboardHook();
ghook.KeyDown +=new KeyEventHandler(ghook_KeyDown);
foreach (Keys key in Enum.GetValues(typeof(Keys)))
ghook.HookedKeys.Add(key);
ghook.hook();
}
private void ghook_KeyDown(object sender, KeyEventArgs e)
{
textBox1.Text += ((char)e.KeyValue).ToString();
processKeyPressed((char)(e.KeyCode));
if((char)(e.KeyCode)=='Q')
SendKeys.Send("Ɣ");
}
|
|
|
|
|
I thank you for your response, Original.
I wish we could get this working.
Still believe someone out there would help.
Thanks.
|
|
|
|
|
|
So I basically have a Complex Matrix class like so:
public struct ComplexMatrix
{
private int Rows;
private int Cols;
private Complex[,] matrix;
public ComplexMatrix(int Rows, int Cols)
{
this.Rows = Rows;
this.Cols = Cols;
Complex[,] temp = new Complex[Rows, Cols];
this.matrix = temp;
for (int i = 0; i <= Rows - 1; i++)
{
for (int j = 0; j <= Cols - 1; j++)
{
matrix[i, j] = new Complex(0, 0);
}
}
}
public Complex this[int Row, int Col]
{
get { return matrix[Row, Col]; }
set { matrix[Row, Col] = value;}
}
...
However, Im a bit lazy so I would really like to set matrix items as follows:
MyMatrix[1, 1] = new Complex(1, 0);
MyMatrix[0, 1] = 1;
MyMatrix[1, 0] = 5d;
But I found no easy way of doing this. I basically want the setter of the property to be able to take an object, but the get function will always return a Complex.
I could of curse do this:
public object this[int Row, int Col]
{
get { return matrix[Row, Col]; }
set
{
if (value is Complex)
{
matrix[Row, Col] = (Complex)value;
}
else if (value is double)
{
matrix[Row, Col] = new Complex((double)value, 0);
}
else if (value is int)
{
matrix[Row, Col] = new Complex((double)((int)value), 0);
}
else
{
throw new NotSupportedException("Not supported");
}
}
}
But that is really cumbersome when you want to get the value. Is there any tricks I could use to make this work properly?
|
|
|
|
|
I think I need some Coffee here. The complex class takes care of that for me
|
|
|
|
|
Just beat me. I was going to suggest looking at Complex constructors taking other numeric types and promoting.
Cheers,
Peter
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
I don't know if this type of structure (using a List of Lists instead of an Array) is relevant to your concerns, it's something I experimented with some time ago:
public class ComplexMatrix : List<List<Complex>>
{
public ComplexMatrix() { }
public ComplexMatrix(List<List<Complex>> list)
{
foreach(var lst in list) this.Add(lst);
}
public ComplexMatrix(IEnumerable<IEnumerable<Complex>> lstenum)
{
foreach (var lst in lstenum.ToList())
{
this.Add(lst.ToList());
}
}
public ComplexMatrix(int rows, int cols)
{
List<Complex> complexrow;
for (int i = 0; i < rows; i++)
{
complexrow = new List<Complex>(cols);
this.Add(complexrow);
for (int j = 0; j < cols; j++)
{
complexrow.Add(0.0d);
}
}
}
public Complex this[int row, int col]
{
set { this[row][col] = value; }
get { return this[row][col]; }
}
public void SetValue(int row, int col, double real, double imaginary)
{
this[row][col] = new Complex(real, imaginary);
}
} Sample use:
public void Test1()
{
var repeated1 = Enumerable.Repeat(Enumerable.Repeat(new Complex(1, 1), 5), 5);
var repeated2 = Enumerable.Repeat(Enumerable.Range(1, 6).Select(i => new Complex(i,i)), 6);
ComplexMatrix cmatrix0 = new ComplexMatrix(repeated1);
ComplexMatrix cmatrix1 = new ComplexMatrix(repeated2);
ComplexMatrix cmatrix2 = new ComplexMatrix(4,4);
cmatrix2.SetValue(0,0, 34.5, 666.4);
cmatrix2[2,2] = 4.0;
Complex c22 = cmatrix2[2,2];
ComplexMatrix cmatrix3 = new ComplexMatrix
{
{Enumerable.Repeat(new Complex(0.0,0.0), 2).ToList()},
{Enumerable.Repeat(new Complex(0.0,0.0), 2).ToList()}
};
cmatrix3[1, 1] = new Complex(3.4, 45.66);
Complex cmplx = cmatrix3[1, 1];
} Other than an interesting experiment in self-education re Enumerable.Repeat, Enumerable.Range, auto-initializers, and Indexers, etc.: meaning of-it-all is left up to you
«There is a spectrum, from "clearly desirable behaviour," to "possibly dodgy behavior that still makes some sense," to "clearly undesirable behavior." We try to make the latter into warnings or, better, errors. But stuff that is in the middle category you don’t want to restrict unless there is a clear way to work around it.» Eric Lippert, May 14, 2008
|
|
|
|
|
It's a nice solution, although I prefer the Matlab coding style more, but that seems a bit cumbersome to implement in C#, like so:
var MyMatrix = [1,0,0 ;
0,1,0 ;
0,0,1]
Although I could use my previus developed code to do so:
Evaluate Complex and Real Math Calculator[^]
|
|
|
|
|
I always end up questioning code I wrote (like the example shown here), wondering if it's "too clever by half," if it's just getting "fancy" for a relatively small gain in syntax clarity. And, how about "overhead:" memory use, relative speed ?
My reading of the discussions about Array vs. generic List in .NET re memory and speed from several years ago leaves me with a shaky conviction that using Arrays is a bit more efficient and faster, but, now that .NET has evolved, I'd need to refresh my knowledge of that.
Now, if I could only understand what Complex Numbers were: I mean I can relate in the sense that I often feel I have both an imaginary self as well as a "real" self
cheers, Bill
«There is a spectrum, from "clearly desirable behaviour," to "possibly dodgy behavior that still makes some sense," to "clearly undesirable behavior." We try to make the latter into warnings or, better, errors. But stuff that is in the middle category you don’t want to restrict unless there is a clear way to work around it.» Eric Lippert, May 14, 2008
|
|
|
|
|
Hello,
Why is it necessary to duplicate each string with Substring(0) string.clone when copying strings to cloned object? For int you do not need to copy with int.tryparse(x.tostring()) or similar silliness. Simple assignment operator works but somehow not with strings.
|
|
|
|
|
Can you give us an example of what doesn't work?
It's not clear from your question exactly what you are trying to do and what you expect to happen.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
If I clone object A to object B and use an assignment oprator for all the strings in the .Clone(), Changing the string in object B changes it in object A as well
|
|
|
|
|
Show us the code you are using.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I am working on converting server code from Java to C#.. Not really ASP but pure C# as this serves only text, the frontend server sends my app a request on port 8080 consisting of user's UserAgent and source IP, and my program decides to serve some text for every 1 in 20 or as defined. Its proprietary code
|
|
|
|
|
WorkOnlineClick2Wealth wrote: Changing the string in object B changes it in object A as well
How are you "changing" the string, given that strings in .NET are immutable?
class Foo
{
public string Bar { get; set; }
}
Foo a = new Foo { Bar = "Hello" };
Foo b = new Foo { Bar = a.Bar };
b.Bar = "Goodbye";
Console.WriteLine(a.Bar);
If you can't show us the code you're using, you need to create a small sample project to reproduce the problem and show us that code instead.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Because, if you look at the specification of String.Clone, it states;
"The return value is not an independent copy of this instance; it is simply another view of the same data. Use the Copy or CopyTo method to create a separate String object with the same value as this instance."
Read https://msdn.microsoft.com/en-us/library/system.string.clone(v=vs.110).aspx
If you also read the specification for; ICloneable Interface (System)[^] it states that ". It does not specify whether the cloning operation performs a deep copy, a shallow copy, or something in between. Nor does it require all property values of the original instance to be copied to the new instance."
Hope that helps..........
|
|
|
|
|
I was using .Substring(0) instead of Copy. And have been looking to know why clone and = do not copy the string. Thank you for the info
|
|
|
|
|
I'm looking for C# chart library that can draw interactive elements in chart. I'm doing a simple xy chart, but i need to draw multiple movable marks(red marks in the picture).
I need to be able to draw them by click, remove them by click, insert them by xy position in the chart, get their xy position. I need the chart with zoom working(mouse and click zoom/unzoom, hand tool). I also need to draw cursors for 4-point and 2-point manual measurement with different length and labels a,b,A,B. Labels are required for red marks for numbering too (1,2,3 ...). The cursors library must be very effective, I use aproximately 16000 data points in one chart.
I've tried MS Chart as a part of Win Forms, but it was very slow. I was able to create marks, but it was very slow under 16000 data points load. I'd rather use WPF instead of Win Forms. I've tried a few open source libraries and there was either no documentation or movable marks missing.
It is a part of my school project. It's OTDR optical trace. picture example how it should look like
Thanks!
|
|
|
|
|
Perhaps this[^] may help?
/ravi
|
|
|
|
|
WallaceCheshire wrote: I use approximately 16000 data points in one chart.
I think you will need to change your approach here. Normally large amounts of data are always filtered in some way since no human can possibly absorb 16000 data points.
You could unfilter them as you zoomed in on a relevant dataset, say 10 - 20 points.
|
|
|
|
|
May I remind you, gentle reader, that this forum was once a place for open-ended discussions of C# language issues ?
I'm working on something I intend to publish on CP. Wanting to make sure it works using FrameWork 4.0 I am:
1. using a Microsoft supplied weirdness that runs using the Microsoft.Win32 library: [^]. I've slightly modified this to set a global static flag if version 4.0 or greater of the FrameWork is available.
2. using an ingenious hack by Thomas Levesque that enables the various special Property Attributes, like 'CallerMemberName to work in 4.0: [^].
Wanting to make sure I can serialize data that includes Controls that may be inside any ContainerControl on any Form (and, which may have identical Names inside said different hosts), I am working around DataContract's (and all other serializers I know of except one) limitation of not being able to serialize WinForms Controls. So, I do a dance of transforming a bunch of static data into a Dictionary that represents a Control as List of strings of the form:
outmostcontainername ... container#n name ... controlname
And, after serialization I can resurrect these back into the appropriate object instances.
So yeah, I can serialize and de-serialize, paying a penalty to save Control references in this way, and then resurrect them back to instances at run-time.
And, now ... Rant Begin
1. what bs that MS no longer makes Environment.Version return different values for FrameWork 4.0 and 4.5 !
2. what a pain in the butt to have to use a work-around to get CallerMemberName usable in 4.0. Yeah, I know, I shouldn't complain about about that: after all, it was announced as new "feature" with 4.5, and the fact that T. Levesque got it working is ... well, our good fortune.
3. not being able to serialize Control instances without the kind of dance I do here is annoying. while, as I said, there is one serializer that seems to be able to do it (here on CodeProject), I feel I can't rely on it. Reference on request, and, no, it's not Mehdi Gholam's serializer.
4. using the DataContract/DataMember serializer is certainly so much easier, for me, than the previous critters from MS, and JSON, etc. however, it seems "sensitive" to unknown context issues, and will, at times, fail with no obvious reason.
The work-around I've found is to (any, or all, of these):
a. clear any saved file the serializer may point at before invoking the serializer
b. re-compile all the various pieces of the app, and then close, and restart, Visual Studio 2013.
5. I also encounter the problem of a compile somehow not synching non-UI Projects with the UI main project: yep, I've set the "DependsOn" setting in the UI main project to the non-ui Class Library. I usually discover this when I set a break-point somewhere in the Class Library, and it doesn't get hit ... which cues me I need to re-compile the Class Library.
... Rant End
Now that's off my chest: I can say, honestly, that these are great tools to work with that I could never have imagined even twenty years ago being available to a "mere mortal" like me These issues I rave about are, viewed in the larger frame, just pimples on paradise's angels.
However, lest I sound too fan-boiish, let me say that MSDN documentation, and its implementation in the Help system for Visual Studio, and on-line, is a fetter, a snare, a pustulous canker, a travesty, a daily water-boarding for those who use it, etc.
Your thoughts, reactions, comments, corrections ?
«There is a spectrum, from "clearly desirable behaviour," to "possibly dodgy behavior that still makes some sense," to "clearly undesirable behavior." We try to make the latter into warnings or, better, errors. But stuff that is in the middle category you don’t want to restrict unless there is a clear way to work around it.» Eric Lippert, May 14, 2008
|
|
|
|
|
Quote: is a fetter, a snare, a pustulous canker, a travesty, a daily water-boarding for those who use it, I couldn't possibly improve on that!
|
|
|
|
|
I got a little confused with the Bitmap.LockBits() function. Though I can see that my code achieves what I want it to do with good performance, I do not fully understand how it works...
public unsafe ushort[,] GetDataFromBitmap(Bitmap source, Rectangle rect)
{
ushort[,] result = new ushort[rect.Width, rect.Height];
BitmapData bmpData = source.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
byte* scan0 = (byte*)bmpData.Scan0.ToPointer();
int bytesPerPixel = 3;
int stride = bmpData.Stride;
for (int y = 0; y < rect.Height; y++)
{
for (int x = 0; x < rect.Width; x++)
{
byte* bluePointer = scan0 + y*stride + x*bytesPerPixel;
byte blue = *bluePointer;
source is a bitmap of 2736x3648 pixels of 24bit RGB, and rect has a size of 240x320, positioned somewhere within the source image.
The value of stride is 10944 - that is 4 *2736. That is source.Width , not rect.Width . Also ...bluePointer = scan0 + y*stride... somehow indicates that the locked bytes do not represent the "new" image defined by the rectangle, but that scan0 just points to a position in the original image corresponding to the top left corner of the rectangle. Why do I need a Rectangle , when a Point could do so also?
bytesPerPixel is 3 (corresponding to 1 byte RGB each), while stride/source.Width is 4 (i.e. alignment to 32=2^5 bits), but it is ...bluePointer = x*bytesPerPixel + ... .
Now I am confused. Can someone explain those strange parameters and values?
|
|
|
|
|
Ok...
LockBits effectively prevents the Garbage Collector from moving the data in memory - so pointers and so forth can be used directly instead of having to de-reference every time you wanted to use it. Because the GC is outside your direct control, if you don't use LockBits then the data you are pointing at can be "moved" in memory at will, rendering your pointers invalid. But it doesn't copy the memory - it just locks it in place.
Your data may be 3 bytes per pixel (i.e. has no Alpha channel) but that's inefficient to access: 32 bit quantities are a lot faster to throw around than 24 bit values, so your image is "padded" to 32bits with a default "solid" alpha channel.
stride is 4*2736 because it's a bytes count, rather than a pixel count - and a pixel is a 32 bit quantity (ARGB, with each "part" occupying a byte). So each row in your image of 2736 pixels takes stride bytes - i.e. to advance from one row in your rectangle to the same relative position in the next row means advancing by the width of your image, not the width of your rectangle:
-------------------
|C ------ |
|D |A |E |
| |B | |
| ------ |
| |
------------------- If C is (0,0) on your image, and D is (0,1); A is (0,0) in your rect, and B is (0,1) in your rect (A is (5,1) in your image, B is (5,2)) then to move from the memory byte starting the rect A to the memory byte starting rect B, means adding the number of bytes in a whole row of the image - adding the bytes in the rect width would move you to E instead.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|