ArticleDirectory
- Input parameters
- Output
- Interface Processing
For the original article, see day 04: mileage tracker.
Requirement
Chris Reeder, a good friend of the author, hopes to use SQL ce database for fuel-efficient mileage computing.Program.
Implementation
As the author was very busy that day, he simplified the requirements, removed the sqlce storage, the support of international organizations, the status chart, and the multi-time mileage comparison. As the requirement is simplified, the function becomes simple. You only need to enter several parameters and then calculate the result.
Input parameters
1. distance: the author uses miles as the unit. I remember my colleague asked me if I used an international unit in China. I said that China had unified the Unit during Qin Dynasty, the international organization was used at the time of liberation. From the author's article, many people prefer non-international organizations, such as Miles and gallon.
2. fuel volume. The author uses gallon ).
3. Price.
4. cylinder volume.
Output
1. miles per gallon: How many miles can a Galen walk, that is, the Distance divided by the amount of oil. Since the program does not perform unit conversion, we can assume that the input distance is kilometers, and the input amount of oil is increased, the result is "every kilometer.
2. gallons per 100 miles, how much galun oil is consumed per 100 miles.
3. Cost per 100 miles, how much is spent every 100 miles.
4. Maximum range: How long can an entire cylinder of oil go.
During implementation, the author encapsulates all parameters and computing into a class called mileage for processing.
Public Void Calculate ()
{
Milespergallon = 0 ;
Gallonsper100miles = 0 ;
If (fuel ! = 0 )
milespergallon = distance / fuel;
If(Milespergallon! = 0)
Gallonsper100miles= 100/Milespergallon;
Costper100miles=Gallonsper100miles*Price;
Maximumrange=Tank*Milespergallon;
}
The calculation method is a simple arithmetic operation. Note that all numeric variables use decimal instead of float and double. People who have worked on accounting software will know that float and double often encounter errors when performing multiplication and division. In reality, use. tostring ("0.00") for formatting, and use stringbuilder to merge strings to improve efficiency.
Stringbuilder = New Stringbuilder ();
Stringbuilder. appendformat ( " Miles per gallon: {0} MPG " , Mileage. milespergallon. tostring ( " 0.00 " ). Appendline (). appendline ();
Stringbuilder. appendformat ( " {0} gallons per 100 miles " , Mileage. gallonsper100miles. tostring ( " 0.00 " ). Appendline (). appendline ();
Stringbuilder. appendformat ( " $ {0} per 100 miles " , Mileage. costper100miles. tostring ( " 0.00 " ). Appendline (). appendline ();
Stringbuilder. appendformat ( " Maximum range: {0} miles " , Mileage. maximumrange. tostring ( " 0.00 " ));
Textboxresults. Text=Stringbuilder. tostring ();
Interface Processing
Since Compact framework does not directly support transparent controls, the author uses the transparent label controls of Alex yakhnin-transparent labels.
To use this transparent label control, you need to use a picturebox to save a graphic object. The label is placed in this picturebox and set to invisible, which is displayed by the drawlabel method, the call of the drawlabel method is triggered by the paint event of picturebox.
The digital input control. The author uses the MS nuerictextbox. For details, refer to how to: create a numeric text box. This article describes how to generate Custom User Controls by inheriting textbox.
// Restricts the entry of characters to digits (including HEX), the negative sign,
// The decimal point, and editing keystrokes (backspace ).
Protected Override Void Onkeypress (keypresseventargs E)
{
Base . Onkeypress (E );
numberformatinfo = system. globalization. cultureinfo. currentculture. numberformat;
string decimalseparator = numberformatinfo. numberdecimalseparator;
string groupseparator = numberformatinfo. numbergroupseparator;
string negativesign = numberformatinfo. negativesign;
StringKeyinput=E. keychar. tostring ();
If (Char. isdigit (E. keychar ))
{
// Digits are OK
}
Else If (Keyinput. Equals (decimalseparator) | Keyinput. Equals (groupseparator) |
Keyinput. Equals (negativesign ))
{
// Decimal separator is OK
}
Else If (E. keychar = ' \ B ' )
{
// Backspace key is OK
}
// Else if (modifierkeys & (Keys. control | keys. alt ))! = 0)
// {
// // Let the Edit Control handle control and ALT key combinations
// }
Else If ( This . Allowspace && E. keychar = ' ' )
{
}
Else
{
//Consume this invalid key and beep
E. Handled= True;
//Messagebeep ();
}
}
The key to this class is to overload the onkeypress event and control the input to be numerical only.
Installer:Mileagetracker. Cab
Source code:Milesagetracker.zip
. NET Compact framework, WinCE, Windows Mobile Development Series
Jake's blog in blog Park --Simplified development and wireless life