|
Here are some tips I hope are useful to you.
1. One problem at the time. Read your assignment and write down what smaller problems you encounter. Then solve each problem at the time. eg. One problem could be that you need to go from input to calculating output. Divide that and you come to sub-problems: getting the input. Split the input. Do base calculations (+,-,/,*, ...). provide output. Here you can devise another issue. What to do with errors and exceptions, etc... The smallest problems "should" be solvable (and preferably reusable ).
This is an art were many, many, many developers fail ending with programs way too complex...
2.Find sample applications of other calculator applicatons, chances are, someone did something you can re-use.
3. Prototype
If you're not sure about something you want to implement.
hope this helps.
modified 27-Oct-13 15:46pm.
|
|
|
|
|
I am trying to make a serial port terminal and i have succesfully made it except for some problems that i am facing.
i have a button pressing which the terminal starts and the data from the serial port start to get displayed on the textbox.
when i press the button again the serial port closes.
Also i have put the code to read from the serial port in a timer with a time of 1 millisecond. So it automatically works like a loop and the data can be displayed continuously.
Case 1. when i try reading from the serial port using
_SerialPort.ReadLine ()
what happens is that the data is getting displayed perfectly, but i am not able to press the button again to close the serial port, also i cant even close the application. I would have to use the task manager to kill the process.
Case 2. when i try reading from the serial port using
_SerialPort.ReadExisting ()
what happens is that the earlier issue is resolved, but the data that is received is not continuous, that is some values are not recieved.
|
|
|
|
|
ReadLine() blocks until a new line character occurs so you can't expect it to do anything immediately based on a key press unless the key causes a end of line.
If your source for the characters are human input is human than it seems unlikely that ReadExisting() would lose anything. What would be more likely in that case is that your output code is not correctly handling what ReadExisting is returning.
|
|
|
|
|
jschell wrote: If your source for the characters are human input is human than it seems unlikely that ReadExisting() would lose anything.
the characters are not human input. its source is a micro controller ADC output. So it continuously sends data to the serial port.
Parity - Even
Databits - 8
Stopbits - 2
Baudrate - 4800
jschell wrote: ReadLine() blocks until a new line character occurs so you can't expect it to do anything immediately based on a key press unless the key causes a end of line.
The button press calls the
serialport.Close();
so then it shouldn't matter what the
ReadLine() function gets.
|
|
|
|
|
Don't use either of them like that.
Instead, handle the SerialPort.DataReceived[^] event, and get the data in that using ReadExisting - you can then add the data to the textbox in the event handler and you should never lose any data, nor should your UI freeze up.
Remember, Serial ports are very slow devices - data transfer is not instantaneous, nor is it packet based. if you are running your serial port as 9600 baud for example, it will receive one character about every millisecond (7 data bits, 1 parity, 1 start and one stop bit == 10 bits, 9600/10 = 960 characters per second.)
So if you just read once, you will get whatever characters are in teh buffer at that moment, and nevr get any more.
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
OriginalGriff wrote: Instead, handle the SerialPort.DataReceived[^] event, and get the data in that using ReadExisting - you can then add the data to the textbox in the event handler
Sorry forgot to mention, i had tried that too...
Same problem. losing data....
|
|
|
|
|
How did you use it? Do you still have the code?
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
private void Start_Click (object sender, EventArgs e)
{
if(Start.Text == "Start")
{
Start.Text = "Stop";
_SerialPort.DataReceived += new SerialDataReceivedEventHandler (Port_DataReceived);
}
else
{
Start.Text = "Start";
}
}
private void Port_DataReceived (object sender, SerialDataReceivedEventArgs e)
{
string data = _SerialPort.ReadExisting ();
rtbTerminal.AppendText (data);
rtbTerminal.ScrollToCaret ();
}
private void Start_Click (object sender, EventArgs e)
{
if(Start.Text == "Start")
{
Start.Text = "Stop";
_SerialPort.DataReceived += new SerialDataReceivedEventHandler (Port_DataReceived);
}
else
{
Start.Text = "Start";
}
}
private void Port_DataReceived (object sender, SerialDataReceivedEventArgs e)
{
string data = _SerialPort.ReadExisting ();
rtbTerminal.Invoke (new EventHandler (delegate
{
rtbTerminal.SelectedText = string.Empty;
rtbTerminal.AppendText (data);
rtbTerminal.ScrollToCaret ();
}));
}
I have tried both ways above.
|
|
|
|
|
Um.
You do realize that each time you click the "Start" button, you add another handler to the existing list? So when a character arrives, the same handler method will be called twice, then three times, then four, etc...
And that DataReceived is likely to be called each time a character arrives, since your PC runs rather faster than the serial port does, most of the time?
How I would start:
Add the handler once, when you first construct the SerialPort instance.
Add a bool to enable / disable receive.
When you press the Start button, clear the text from the RTB, then set the bool to enabled.
When you press the Stop button, set the bool to disabled.
In the DataReceived Handler, read the data available. Then, check the bool. If it is enabled, Append the data to the RTB and scroll to the caret. (You shouldn't need an invoke, I don't think). Do not clear the RTB.
If it is disabled, throw the data away!
Try that...
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
I have two forms, the first one is the main form and creates the serial port instance and then i pass the serial port object into the second form which is the terminal form.
The following code is the contents of the namespace of the second form
bool Receive_Enable = false;
public Terminal (SerialPort Serial_Port)
{
InitializeComponent ();
_SerialPort = Serial_Port;
_SerialPort.Close ();
_SerialPort.DataReceived += new SerialDataReceivedEventHandler (Port_DataReceived);
}
private void Start_Click (object sender, EventArgs e)
{
if(Start.Text == "Start")
{
Start.Text = "Stop";
_SerialPort.Open ();
Receive_Enable = true;
}
else
{
Receive_Enable = false;
_SerialPort.Close ();
Start.Text = "Start";
}
}
private void Port_DataReceived (object sender, SerialDataReceivedEventArgs e)
{
if(Receive_Enable)
{
rtbTerminal.AppendText (Convert.ToString (_SerialPort.ReadLine ()));
rtbTerminal.ScrollToCaret ();
}
}
Tried this....
Also tried with
_SerialPort.ReadExisting ()
The application freezes after few seconds....
What to do????
Am i doing this right???
modified 25-Oct-13 1:26am.
|
|
|
|
|
First off, stop opening and closing it - just leave it open. That ensures that nothing else can get at the port, since serial ports need exclusive locks.
ReadLine is also unhelpful - it will always block until a newline is received, so if whatever device is on the other end of the connection doesn't use the same newline as your PC, it will never return.
So, try this:
bool Receive_Enable = false;
public Terminal (SerialPort Serial_Port)
{
InitializeComponent ();
_SerialPort = Serial_Port;
_SerialPort.Open ();
_SerialPort.DataReceived += new SerialDataReceivedEventHandler (Port_DataReceived);
}
private void Start_Click (object sender, EventArgs e)
{
if(Start.Text == "Start")
{
Start.Text = "Stop";
Receive_Enable = true;
}
else
{
Receive_Enable = false;
Start.Text = "Start";
}
}
private void Port_DataReceived (object sender, SerialDataReceivedEventArgs e)
{
if(Receive_Enable)
{
int bytes = _SerialPort.BytesToRead;
byte[] data = new byte[bytes];
_SerialPort.Read(data, 0, bytes);
string s = System.Text.Encoding.ASCII.GetString(data);
Console.WriteLine(s);
rtbTerminal.AppendText(s);
rtbTerminal.ScrollToCaret();
}
} You may want to play with the Encoding later, but that should be pretty safe.
The Console output is just for debugging - it shows you what is received, in what chunks.
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
Did just that as you said now, Removed all the
SerialPort.Close()
No change, output is good, but the application freezes after a while.
When i try to make the terminal as earlier without event handler i am getting a perfect output with
ReadExisting() But using the eventhandler, it just doesn't work as expected
|
|
|
|
|
I use:
stream = port.BaseStream ;
...
byte[] buffer = new byte [ port.ReadBufferSize ] ;
...
stream.Read ( buffer , 0 , buffer.Length ) ;
And I run the reader in a thread that raises events.
|
|
|
|
|
I have a custom user control.
This user control is placed on a base form and now the form inherits this user control.
I have 5 other forms that inherit from this base form so they have all the properties of the base form and also the properties from the user control.
When I go to update my user control(change background color etc),
The control on the base form gets updated since of course it is directly inherited to the user control, but the control on the other forms that are linked to this base form do not update.
What could be the problem?
|
|
|
|
|
deebow wrote: This user control is placed on a base form and now the form inherits this user control.
Unlikely. A form inherits from the Form class (or it isn't a form...), and a UserControl inherits from Control.
You can't inherit from two classes in C#, so you would have to choose which to base the form on - and I'm guessing Form.
As a result, it may encapsulate the user control, but it doesn't inherit from it. If your derived form classes inherit from YourForm, then they will get the encapsulated UserControl, but unless it is Public (bad) of Protected they probably can't access it.
I suspect your problem needs looking at in a little more depth...
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
Hi Og, I think in this case the OP is using the word "inherit" loosely, to refer to an instance of a UserControl on a Form. As you'll see if you read my response (written evidently during the period you were posting yours), there are some "Halloween" surprises with UserControls; perhaps you can enlighten me on what I observe in VS 2012.
bill
Google CEO, Erich Schmidt: "I keep asking for a product called Serendipity. This product would have access to everything ever written or recorded, know everything the user ever worked on and saved to his or her personal hard drive, and know a whole lot about the user's tastes, friends and predilections." 2004, USA Today interview
|
|
|
|
|
I find what you describe pretty strange; what I would expect to see is:
1. once you have put an instance of the UserControl on the "base form:" changing the design-time appearance of the UserControl would not update the appearance of the instance of the UserControl on the base form. When you create an instance of a Form, or UserControl, you have broken the links between attributes.
However, if you go back and add an EventHandler to your UserControl for an Event like 'Click, I'd expect that Event to fire in the instance of the UserControl added to a Form.
Sorry to say that I can't explain this "dis-connect."
2. however, changing the appearance of the UserControl instance on the base form should change the appearance of the (now locked) UserControl instance that appears in the Forms that inherit from the base form ... as soon as you recompile.
It might help if you describe what Forms are launched when your application starts. Obviously you cannot launch a Form that inherits from a "base form" from within the "base form:" you'll get a StackOverflow error.
You are not the only one to find strange things happen when you have a UserControl on a Form and other Forms inherit from that Form. I use Visual Studio 2012, and compile against FrameWork 4.5: if I put an instance of a UserControl on a Form, and have two other Forms inherit from that Form: the UserControl instance on the first Form (seen at design time) disappears, and doesn't appear in the PropertyGrid Browser for that Form ! But, if instances of all three Forms are created and shown at run-time by a fourth Form: the UserControl appears on all of them.
It would seem logical that any change to any aspect of a UserControl, BackColor, or whatever, would propagate through all instances of the UserControl on various Forms the moment you re-compile.
Google CEO, Erich Schmidt: "I keep asking for a product called Serendipity. This product would have access to everything ever written or recorded, know everything the user ever worked on and saved to his or her personal hard drive, and know a whole lot about the user's tastes, friends and predilections." 2004, USA Today interview
|
|
|
|
|
BillWoodruff wrote: once you have put an instance of the UserControl on the "base form:" changing the design-time appearance of the UserControl would not update the appearance of the instance of the UserControl on the base form.
Not quite true - if you change the background colour of the control from Red to Blue for example, you are right - the Form instance will stay Red. And it's annoying.
But if you add a button, say...then the button will be added to the form instance of the control as soon as you rebuild. On a Red background...
Add a new control instance, and it's blue, of course!
There are times when I hate Microsoft...
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
Yes my understanding is that once I update the usercontrol it should propogate through all forms that have that control but it doesnt.
I have
A) User Control
Class SearchControl :UserControl
B) Form that contains an instance of Usercontrol A
Class FormWhatever : UserControl
C) Forms that inherit from B which also contains an instance of A
Class FormA : FormWhatever
If I update A, B is updated correctly but C remains in its original state that it was created even after compile and runtime.
2) The form that is loaded at program start is the usercontrol. The base control isn't loaded unless the user chooses to go into that form. The other forms arent loaded of course until the base is loaded since they are loaded by user button presses from the base form
|
|
|
|
|
I'd like to help you with this, but what you observe is different than what I observe in Visual Studio 2012 (and what I observe is also different from what OriginalGriff observes).
I don't understand this:
B) Form that contains an instance of Usercontrol A
Class FormWhatever : UserControl If you create a Form, and then set it to inherit from a UserControl, it is no longer a Form, but a UserControl ! Yes, you can put an instance of the same UserControl that a Class inherits from "in/on" the same UserControl, but, why would you ? You've created the equivalent of a person holding a tv-screen showing a picture of themselves
And, this:
2) The form that is loaded at program start is the usercontrol. You cannot start a WinForms .NET program with a UserControl: you'll get a compile-time error like this: "Error 2 Argument 1: cannot convert from '...UserControl.Form#' to 'System.Windows.Forms.Form"
And, this:
The base control isn't loaded unless the user chooses to go into that form. what do you mean by "go into that Form" ?
If your goal here is to provide all the secondary Forms in your Application with a common search facility, and you wish to use a "Main Form" as a kind of "master-controller" from which you show the secondary Forms:
1. create a new WinForms app: design your Main Form
2. create a new UserControl: design it. implement Public Properties, Methods, etc., ... or Events ... so that consumers of the UserControl can use/access information inside the UserControl
3. create a secondary Form template which will serve as a base for all secondary Forms: put an instance of the UserControl on it. Do not "show" this template Form. this Form should not inherit from anything.
4. at design-time, you can define new instances of the secondary Form template by setting them to inherit from the secondary Form template rather than "Form."
5. or, at run-time, you can create new instances of the secondary Form Template as needed in response to the end-user's actions, and display them on screen where you want them.
What you may need to do to "keep track" of any secondary Forms which have been created at run-time may vary depending on what your Application does.
Keep it simple, keep it clean, and prepare to be confused
bill
Google CEO, Erich Schmidt: "I keep asking for a product called Serendipity. This product would have access to everything ever written or recorded, know everything the user ever worked on and saved to his or her personal hard drive, and know a whole lot about the user's tastes, friends and predilections." 2004, USA Today interview
|
|
|
|
|
Exemple stetment
foreach (DataGridViewRow row in gridControl1.Rows)can't Rows
{
mailbody += "<tr>";
foreach (DataGridViewCell cell in row.Cells)
{
mailbody += "<td>" + cell.Value + "</td>";
|
|
|
|
|
And your question is?
Veni, vidi, abiit domum
|
|
|
|
|
Member 10270825 wrote: can't Rows
I'm not surprised.
The DevExpress GridControl doesn't have a Rows property: DevExpress GridControl Members[^] - and even if it did, it is very, very unlikely to return DataGridViewRow values - they are associated with the .NET DataGridView control...
The only instant messaging I do involves my middle finger.
English doesn't borrow from other languages.
English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar.
|
|
|
|
|
|
I want to use Roulette wheel selection for function minimization and want to select parents for reproduction from the fitness values. I want to ask is this necessary to sort the fitness (in ascending or descending order) values calculated from the population size or not?
|
|
|
|
|