|
RS2003 wrote:
I found the error by implementing a try, catch block. I caught the error and displayed the details in a messagebox. The details pointed me directly to the problem.
I'm guessing that I should change Object to IndividualCustomer in all the above method signatures, does this sound correct?
Andrew,
glad to hear you found the problem !
As far as using try and catches, my personal experience is that they are a *great tool*, especially during development. While coding (especially in .NET since I rely upon so many .NET classes), I found that my instinct is now to "first of all wrap everything that might throw an exception in a try/catch", and moreover, I try to have a different catch for every different thing that might throw an exception (so that I can quickly find out where the problem is). This might sound an overkill, but a) the VisualStudio documentation (with the Dynamic help) helps a lot in checking what exception (if any) might be thrown by the various .NET classes, and b) I admit I am not that throughfull... There are cases where I know I will never hit a specific error condition because of the way my code is structured, so in some cases I skip the try/catch...
In any case,
as far as changing Object to IndividualCustomer, it sounds like a good idea, especially if this collection should and will always contain only IndividualCustomer objects.
Hope you'll solve this out now,
Frank
|
|
|
|
|
OK, I've got it now. The method below validates the new object by getting its type and making sure its of type IndividualCustomer. The runtime error I was seeing in the beginning (the cause of this whole thread) was the error message contained in the exception arguments (throw new ArgumentException("value must be of type IndividualCustomer.", "value");". According to Microsoft this method is used to:
"OnValidate can be used to impose restrictions on the type of objects that are accepted into the collection. The default implementation prevents a null reference (Nothing) from being added to or removed from the underlying System.Collections.ArrayList."
The question is why is the value null after I perform the IndividualCustomerCollection.Add function?? When I remove the code, the IndividualCustomer is added to the constructor without any problems. According to Microsoft :
"The On* methods are invoked only on the instance returned by the List property, but not on the instance returned by the InnerList property."
**Definition**
The CollectionBase.List Property - Gets an IList containing the list of elements (objects) in the CollectionBase instance.
By this definition, the onValidate method should execute after the the List property returns the list of objects in my instance of the IndividualCustomerCollection. I don't recall overriding the CollectionBase.List property in my IndividualCustomerCollection class. I'll have to check this when I get home and make the appropriate changes.
/*Implementation of CollectionBase Property
*Performs additional custom processes when
*validating a value.*/
protected override void OnValidate(Object value)
{
if (value.GetType() != Type.GetType("IndividualCustomer"))
{
throw new ArgumentException("value must be of type IndividualCustomer.", "value");
}
}
You'll have to excuse me, I'm knew to creating data binding collections and I want to make sure I understand this inside and out. It's nice to use examples from MSDN, but if you don't take the time to understand everything your implementing you'll run into these kinds of problems. I have definitely learned my lesson Does anyone have any suggestions as to why my value is null?
Thanks,
Andrew
|
|
|
|
|
I have an interesting behavior:
[DllImport("user32.dll")]
static public extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
static public extern IntPtr GetDesktopWindow();
When I get the Graphics object through
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
any drawing on the desktop do not result in anything.
When I get the Graphics object through
Graphics g = Graphics.FromHdc(GetDC(IntPtr.Zero));
I can draw on the desktop.
Any explanation?
Juergen
|
|
|
|
|
i did it by accident a few weeks ago and im not sure if this is the code i used but i think you could give it a shot
//
okay i remeber how i did it..i originally posted a message here that was long..but i found the solution. you can do it using a class that was already wrote..and ill show you how... first off download the clas here : Link[^]
second....adapt this code segment i just wrote into your needs...and it should work....remeber to add the namespaces that the class you downloaded uses... also the class you downloaded uses unsafe code so you will have to turn on the unsafe option in vs.net you can do it by selecting the properties of your project
<br />
<br />
[DllImport("user32.dll")]<br />
private static extern IntPtr GetWindowDC(int Pointer);<br />
Win32Window ww = Win32Util.Win32Window.DesktopWindow;<br />
IntPtr DC = GetWindowDC(ww.Window.ToInt32());<br />
Graphics jm = Graphics.FromHdc(DC);<br />
jm.DrawLine(Pens.Yellow,130,30,30,130);<br />
jm.DrawRectangle(Pens.Red,100,100,300,300);<br />
|
|
|
|
|
Thanks for your reply,
in my post there already was a working solution.
But the question was why the first solution don't work
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
while the second solution works fine.
Graphics g = Graphics.FromHdc(GetDC(IntPtr.Zero));
In my understanding both should work.
I like to know the reason for this behaviour.
Juergen
|
|
|
|
|
GetDesktopWindow() only returns the handle to the Device Context (DC) so passing that handle into the graphics object is incorrect.
when you call GetDC you are grapping the device context its self from the handle. The device is what you work with to do your drawing function in this case.
hope this helps.
Jesse
The Code Project Is Your Friend...
|
|
|
|
|
The GetDesktopWindow function returns a handle to the desktop window (MSDN).
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
creates the Graphics object.
In the debugger it looks like g is created properly,
(exactly the same values as when created with
Graphics.FromHdc(GetDC(IntPtr.Zero));)
but any Drawing on it, is at least invisible.
Juergen
|
|
|
|
|
it returns the handle to the window its self...but that doesnt necessarily
mean the graphics object. the window propertie in the api is kinda like a form in .net it has many methods/properties to it but you need the Graphics object to draw to the form. Simular to that you need the device context of the 'Window' to draw to it. g would be created properly because it is a handle and it can be drawn to..its just not creating the handle on the correct drawing object.
there are 2 handles....a Form.Handle and Graphics().GetHdc() (i think thats it) GetDesktopWindow() returns the Form.Handle essentially. from that handle u get the GraphicsHandle from GetDC
jesse
The Code Project Is Your Friend...
|
|
|
|
|
I'm trying to serialize a complex data structure, and I have some questions.
- How do I serialize an array? In the GetObjectData that I have to implement, I use the AddInfo function. But it takes two parameters : a "key" in a value.
If I want to save a float[8], how can I do this?
Do something like :
for(int i = 0; i <8; i++)
{
string key = "Array" + i.ToString();
SerializeInfo.AddValue(key, array[i]);
}
- How to I serialize complex object?
Suppose I have a class CDrawing, that cointains an array of CShape. A CShape can be derived into a CCircle or a CRectangle
Somewhere in my code I do
shapeArray[0] = new CCircle;
shapeArray[1] = new CRectangle;
Serializing is not a pb, because I will make the GetObjectData function virtual, so it will use the correct one to write CCircle parameters for the first shape, and CRectangle paramters for the second shape.
But how can I deserialize? How do I know if I must do a new CCircle, or a new CRectanle?
- How can I serialize to a text file? I've found only a binary and a SOAP formatter.
|
|
|
|
|
Stephane David wrote:
How can I serialize to a text file?
If you want to serialize to a text file, you will have to come up with your own format (well, that is assuming you want to be able to read it with your own eyes).
But if you are willing to just save an object or array out to disk and only have the computer read it, you must mark each of your classes with the Serializable attribute. If all the objects (Shapes for you) are serializable, then the array that contains them is automatically serializable.
Serializing is not a particularly difficult thing, I would just need a bit more info on your classes...
-Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
The real classes are a bit to complexes to explain in details.
But here is I think an exemple which illustrates the system well (warning : minimum syntax!)
class CPoint
{
int X;
int Y;
}
class CShape
{
string name;
virtual void Draw();
}
class CCircle : CShape
{
int Radius;
CPoint center;
override void Draw();
}
class CPolygon : CShape
{
CPoint[] geometry;
override void Draw();
}
class CDrawing
{
public CShape[] shapes;
}
And now, I do this
CDrawing drawing = new CDrawing();
drawing.shapes[0] = new CCircle();
// Initialize the circle
//...
drawing.shapes[1] = new CPolygon();
// Initialize the polygon
//...
Now, I want to save my drawing to a binary or text or XML file, and then load it.
|
|
|
|
|
Stephane David wrote:
class CPoint<br />
{<br />
int X;<br />
int Y;<br />
}
First: This little class is unneeded; check out System.Drawing.Point .
Second: You then need to mark your classes with Serializable attributes.
[Serializable(true)]
class CShape
{
string name;
virtual void Draw();
}
[Serializable(true)]
class CCircle : CShape
{
int Radius;
CPoint center;
override void Draw();
}
[Serializable(true)]
class CPolygon : CShape
{
CPoint[] geometry;
override void Draw();
}
[Serializable(true)]
class CDrawing
{
public CShape[] shapes;
}
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
void SaveToFile(string path,CDrawing drawing)
{
using(FileStream fs = File.OpenWrite(path))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,drawing);
}
}
CDrawing LoadFromFile(string path)
{
using(FileStream fs = File.OpenRead(path))
{
BinaryFormatter bf = new BinaryFormatter();
return (CDrawing)bf.Deserialize(fs);
}
}
Hope this gets you on your way...
-Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
The actual name of classes were just illustration, ht class architecture is muh more complex. I'll try what you say. It was what I read in the documentation, but I was doubtfull it would actually save an array of derived classes as the shapes member in my CDrawing class.
|
|
|
|
|
Does anyone know if it is possible to store an a class in Message queue body as an object? If so, is there a special type of formatter I need to use? Thanks for all the help.
|
|
|
|
|
hi all, I'm newbies please help me solve this problem with C#
My project windowForm like Chat Program, but when I append text into Richtextbox (ScrollBars: ForcedVertical), it don't autoscroll to see last text I was append
someone help me, please. Thanks
Nho'c ti`
|
|
|
|
|
Do this every time you append text:
rtb.SelectionStart=rtb.TextLength;
rtb.ScrollToCaret();
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
but It doesn't run, and here is mycode (RichTextBox rtbMessage, TextBox tbInput)
private void tbInput_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode==System.Windows.Forms.Keys.Enter)
{
if (tbInput.Text.Length>0)
{
rtbMessage.AppendText("myID : "+tbInput.Text+"\n");
rtbMessage.SelectionStart = rtbMessage.TextLength;
rtbMessage.ScrollToCaret();
this.tbInput.Text = "";
}
}
}
some one can write somecode
thanks
Nho'c ti`
|
|
|
|
|
What's the error that makes it not run?
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
"it not run" like that richtextbox doesn't autoscroll when I appendtext to it (with your code) )
Nho'c ti`
|
|
|
|
|
you need to set HideSelection to "FALSE"
in .net / C# the richtextbox doesnt move down to show the most recent text unless you set it's hideselection property to false .
Vb:
<font color="blue">Public Function</font> TwinsOnWay(<font color="blue">ByVal</font> twins <font color="blue">As String</font>) <font color="blue">As String <br> Select Case</font> twins<br> <font color="blue">Case</font> "Gender" <br> <font color="blue">Return</font> "Two Girls" <br> <font color="blue">End Select <br> End Function</font> <br>
|
|
|
|
|
Now I remember. Thanks for pointing this out. I remember a while back I was stumped by this, and when I found out, I was a bit irritated that they did it that way.
Thanks.
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
np i've been making irc clients for longer than i can remember and it was the first problem i came across in .net
Vb:
<font color="blue">Public Function</font> TwinsOnWay(<font color="blue">ByVal</font> twins <font color="blue">As String</font>) <font color="blue">As String <br> Select Case</font> twins<br> <font color="blue">Case</font> "Gender" <br> <font color="blue">Return</font> "Two Girls" <br> <font color="blue">End Select <br> End Function</font> <br>
|
|
|
|
|
Thank you very much !!!
Nho'c ti`
|
|
|
|
|
Does anybody know how I could get a current property value from a loaded process? What I am trying to do is to have a user log-in in a main application, which would initialize a user object containing all the neccessary information about a user, and then every other application openned afterword, while the main application is still open, would use the same user object that was initialized in the main application. This would save the user from having to log-in again, it would save having to make unneeded trips to a remote database, plus it would save having a database connection for every application that is openned. Any suggestions or comments would be greatly appreciated. Thanks
|
|
|
|
|
What happens if you put it into a class library module and then reference that module in your different programs / segements?
I have a program that maintains a form of program state in via an external (seperate project) class (with static members and properties). It is referenced and initialized in the main program which keeps a hold in it while all the other modules reference the DLL and have access to the data.
The only data I think you would have to worry about is process or thread specific data. Other than that it seems to work fine.
Rocky Moore <><
|
|
|
|