691 lines
25 KiB
C#
691 lines
25 KiB
C#
/*
|
|
===========================================================================
|
|
|
|
Created by Kevin Becker on 19.04.2018
|
|
|
|
===========================================================================
|
|
*/
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.DataVisualization.Charting;
|
|
|
|
namespace NMLS_Graphisch
|
|
{
|
|
public partial class Form1 : Form
|
|
{
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
|
|
static int NumberOfSamples = 20000;
|
|
const int tracking = 40;
|
|
static Stack<double> x = new Stack<double>();
|
|
static Random rnd = new Random();
|
|
static int windowSize = 6;
|
|
static double[,] w = new double[windowSize, NumberOfSamples];
|
|
static double[] _x = new double[NumberOfSamples];
|
|
static double learnrate = 0.2;
|
|
static double[] pixel_array;
|
|
|
|
/*---------------------------------------------------
|
|
* GO_btn_click()
|
|
*
|
|
* starts the predefined algorithem with the specified parameters
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
private void Start_btn_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
/* Initializing NumberOfSamples with the choosen pixelcount */
|
|
NumberOfSamples = Int32.Parse(comboBox_pixel.SelectedItem.ToString());
|
|
|
|
/* Initializing the weights */
|
|
|
|
w = new double[windowSize, NumberOfSamples];
|
|
for (int i = 0; i < NumberOfSamples; i++)
|
|
{
|
|
for (int k = 0; k < windowSize; k++)
|
|
{
|
|
w[k, i] = rnd.NextDouble();
|
|
}
|
|
}
|
|
|
|
/* Initializing the learnrate with the choosen one */
|
|
txtBox_learnrate.Text = txtBox_learnrate.Text.Replace(".", ",");
|
|
try
|
|
{
|
|
learnrate = Double.Parse(txtBox_learnrate.Text);
|
|
}
|
|
catch (Exception exep)
|
|
{
|
|
MessageBox.Show("Please choose a learnrate between >0.0 and <=1.0");
|
|
return;
|
|
}
|
|
|
|
while (learnrate <= 0.0 || learnrate > 1.0)
|
|
{
|
|
MessageBox.Show("Please choose a learnrate between >0.0 and <=1.0");
|
|
var myValue = Microsoft.VisualBasic.Interaction.InputBox("Choose a learnrate between >0.0 and <=1.0", "Learnrate", "0,8");
|
|
if (myValue == "")
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
learnrate = Double.Parse(myValue);
|
|
}
|
|
}
|
|
|
|
/* Initializing the windowsize with the choosen one*/
|
|
|
|
/* Initializing the chart to display all values */
|
|
chart_main.ChartAreas[0].AxisX.Maximum = NumberOfSamples;
|
|
chart_main.ChartAreas[0].AxisY.Maximum = 300;
|
|
chart_main.ChartAreas[0].AxisY.Minimum = -100;
|
|
|
|
/* If output is checked weights befor and after the algorithem are printed to a file.*/
|
|
if (checkBox_output.Checked)
|
|
{
|
|
for (int i = 0; i < tracking; i++)
|
|
{
|
|
for (int k = 0; k < windowSize; k++)
|
|
{
|
|
File.AppendAllText(String.Format("weights_{0}.txt", comboBox_algorithem.SelectedItem.ToString().Replace(" ", "")),
|
|
String.Format("[{0}][{1}] {2}\n", k, i, Math.Round(w[k, i], 2).ToString()),
|
|
Encoding.UTF8);
|
|
}
|
|
}
|
|
}
|
|
|
|
Series[] series = new Series[2];
|
|
|
|
/* Deciding which algorithem is going to be calculated */
|
|
switch (comboBox_algorithem.SelectedItem.ToString())
|
|
{
|
|
|
|
case "local mean":
|
|
series = localMean();
|
|
break;
|
|
|
|
case "direct predecessor":
|
|
series = directPredecessor();
|
|
break;
|
|
|
|
case "differential predecessor":
|
|
series = diffPredecessor();
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
|
|
}
|
|
|
|
/* Adding the series from the algorithems to the chart */
|
|
foreach (Series s in series)
|
|
{
|
|
if (chart_main.Series.IndexOf(s.Name) < 0)
|
|
{
|
|
chart_main.Series.Add(s);
|
|
}
|
|
else
|
|
{
|
|
chart_main.Series.RemoveAt(chart_main.Series.IndexOf(s.Name));
|
|
chart_main.Series.Add(s);
|
|
}
|
|
}
|
|
|
|
/* Output weights after algorithem */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
for (int i = 0; i < tracking; i++)
|
|
{
|
|
for (int k = 0; k < windowSize; k++)
|
|
{
|
|
File.AppendAllText(String.Format("weights_after_{0}.txt", comboBox_algorithem.SelectedItem.ToString().Replace(" ", "")),
|
|
String.Format("[{0}][{1}] {2}\n", k, i, Math.Round(w[k, i], 2).ToString()),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* localMean()
|
|
*
|
|
* the algorithem for the local Mean
|
|
*
|
|
* returns a array of Series with the error and prediction for
|
|
* displaying in a chart
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
Series[] localMean()
|
|
{
|
|
|
|
int x_count = 0;
|
|
double[] x_error = new double[NumberOfSamples];
|
|
x_error[0] = 0;
|
|
|
|
/* Inizilazing series for the main chart */
|
|
Series localMeanError = new Series("Local Mean Error");
|
|
Series localMeanPredict = new Series("Local Mean Prediction");
|
|
localMeanError.ChartType = SeriesChartType.Spline;
|
|
localMeanPredict.ChartType = SeriesChartType.Spline;
|
|
|
|
/* Main while loop for the prediction and learing */
|
|
|
|
while (x_count < NumberOfSamples - 1)
|
|
{
|
|
|
|
/* Initializing a part array of the actual array to capture the last WINDOWSIZE pixels
|
|
* for predicting and getting the average of the array*/
|
|
|
|
double[] x_part_Array = new double[x_count];
|
|
int _sourceIndex = (x_count > windowSize) ? x_count - windowSize : 0;
|
|
int _arrayLength = (x_count > windowSize) ? windowSize : x_count;
|
|
Array.Copy(_x, _sourceIndex, x_part_Array, 0, _arrayLength);
|
|
double x_middle = (x_count > 0) ? (x_part_Array.Sum() / _arrayLength) : 0;
|
|
|
|
double x_pred = 0.0;
|
|
|
|
double[] x_array = _x;
|
|
double x_actual = _x[x_count];
|
|
|
|
/* Prediction algorithem */
|
|
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_pred += (w[i, x_count] * (x_array[x_count - i] - x_middle));
|
|
}
|
|
x_pred += x_middle;
|
|
|
|
/* If output is checked a file is produced with prediction, actual and the error */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("localMean.txt",
|
|
String.Format("{0}. X_pred {1}\n", x_count, x_pred),
|
|
Encoding.UTF8);
|
|
|
|
File.AppendAllText("localMean.txt",
|
|
String.Format("{0}. X_actual {1}\n", x_count, x_actual),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
/* Calculating the error */
|
|
x_error[x_count] = x_actual - x_pred;
|
|
|
|
|
|
double x_square = 0;
|
|
|
|
/* Output */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("localMean.txt",
|
|
String.Format("{0}. X_error {1}\n\n", x_count, x_error[x_count]),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
/* Calulating the LMS value */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_square += Math.Pow(x_array[x_count - i] - x_middle, 2);
|
|
}
|
|
|
|
/* x_square == 0.0, drives to undefined weights therefor we set it to 1 */
|
|
|
|
if (x_square == 0.0)
|
|
x_square = 1.0;
|
|
|
|
/* Learning algorithem */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
w[i, x_count + 1] = w[i, x_count] + learnrate * x_error[x_count] * ((x_array[x_count - i] - x_middle) / x_square);
|
|
}
|
|
|
|
/* Printing error and prediction on the series */
|
|
|
|
localMeanError.Points.AddXY(x_count, x_error[x_count]);
|
|
localMeanPredict.Points.AddXY(x_count, x_pred);
|
|
|
|
x_count += 1;
|
|
}
|
|
|
|
/* Calculating the avearage of the error and the variance of the error */
|
|
double mittel = x_error.Where(d => !double.IsNaN(d)).Skip(windowSize).Sum() / x_error.Length;
|
|
double varianz = 0.0;
|
|
foreach (double x_e in x_error.Skip(windowSize))
|
|
{
|
|
if (!double.IsNaN(x_e))
|
|
varianz += Math.Pow(x_e - mittel, 2);
|
|
}
|
|
varianz /= x_error.Length;
|
|
|
|
/* Displayes both on labels */
|
|
label3.Text = mittel.ToString();
|
|
label5.Text = varianz.ToString();
|
|
|
|
/* Output the result */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("results_localMean.txt",
|
|
String.Format("Squared variance(x_error): {0}\n Average(x_error): {1}\n\n", varianz, mittel),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
return new Series[] { localMeanPredict, localMeanError };
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* directPredecessor()
|
|
*
|
|
* the algorithem for the direct predecessor
|
|
*
|
|
* returns a array of Series with the error and prediction for
|
|
* displaying in a chart
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
Series[] directPredecessor()
|
|
{
|
|
double[] x_error = new double[NumberOfSamples];
|
|
x_error[0] = 0;
|
|
int x_count = 0;
|
|
|
|
/* Inizilazing series for the main chart */
|
|
Series directPredecessorError = new Series("Direct predecessor Error");
|
|
Series directPredecessorPrediction = new Series("Direct predecessor Prediction");
|
|
directPredecessorError.ChartType = SeriesChartType.Spline;
|
|
directPredecessorPrediction.ChartType = SeriesChartType.Spline;
|
|
|
|
/* Main while loop for the prediction and learing */
|
|
while (x_count < NumberOfSamples - 1)
|
|
{
|
|
double x_pred = 0.0;
|
|
double x_actual = _x[x_count];
|
|
|
|
if (x_count > 0)
|
|
{
|
|
/* Initializing the windowsize */
|
|
int _arrayLength = (x_count > windowSize) ? windowSize : x_count;
|
|
|
|
/* Prediction algorithem */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_pred += (w[i, x_count] * (_x[x_count - 1] - _x[x_count - i - 1]));
|
|
}
|
|
x_pred += _x[x_count - 1];
|
|
|
|
/* If output is checked a file is produced with prediction, actual and the error */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("directpredecessor.txt",
|
|
String.Format("{0}. X_pred {1}\n", x_count, x_pred),
|
|
Encoding.UTF8);
|
|
|
|
File.AppendAllText("directpredecessor.txt",
|
|
String.Format("{0}. X_actual {1}\n", x_count, x_actual),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
/* Calculating the error */
|
|
x_error[x_count] = x_actual - x_pred;
|
|
|
|
/* Output */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("directpredecessor.txt",
|
|
String.Format("{0}. X_error {1}\n\n", x_count, x_error[x_count]),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
double x_square = 0;
|
|
|
|
/* Calulating the LMS value */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_square += Math.Pow(_x[x_count - 1] - _x[x_count - i - 1], 2);
|
|
}
|
|
|
|
/* x_square == 0.0, drives to undefined weights therefor we set it to 1 */
|
|
if (x_square == 0.0)
|
|
{
|
|
x_square = 1;
|
|
}
|
|
|
|
/* Learning algorithem */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
w[i, x_count + 1] = w[i, x_count] + learnrate * x_error[x_count] * ((_x[x_count - 1] - _x[x_count - i - 1]) / x_square);
|
|
}
|
|
}
|
|
|
|
/* Printing error and prediction on the series */
|
|
directPredecessorError.Points.AddXY(x_count, x_error[x_count]);
|
|
directPredecessorPrediction.Points.AddXY(x_count, x_pred);
|
|
|
|
x_count += 1;
|
|
}
|
|
|
|
/* Calculating the avearage of the error and the variance of the error */
|
|
double mittel = x_error.Where(d => !double.IsNaN(d)).Skip(windowSize).Sum() / x_error.Length;
|
|
double varianz = 0.0;
|
|
foreach (double x_e in x_error.Skip(windowSize))
|
|
{
|
|
if (!double.IsNaN(x_e))
|
|
varianz += Math.Pow(x_e - mittel, 2);
|
|
}
|
|
varianz /= x_error.Length;
|
|
|
|
/* Displayes both on labels */
|
|
label3.Text = mittel.ToString();
|
|
label5.Text = varianz.ToString();
|
|
|
|
/* Output the result */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("results_directpredecessor.txt",
|
|
String.Format("Squared variance(x_error): {0}\n Average(x_error): {1}\n\n", varianz, mittel),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
return new Series[] { directPredecessorError, directPredecessorPrediction };
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* diffPredecessor()
|
|
*
|
|
* the algorithem for the differential predecessor
|
|
*
|
|
* returns a array of Series with the error and prediction for
|
|
* displaying in a chart
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
Series[] diffPredecessor()
|
|
{
|
|
double[] x_error = new double[NumberOfSamples];
|
|
x_error[0] = 0;
|
|
int x_count = 0;
|
|
|
|
/* Inizilazing series for the main chart */
|
|
Series diffPredecessorError = new Series("Differential predecessor Error");
|
|
Series diffPredecessorPrediction = new Series("Differential predecessor Prediction");
|
|
diffPredecessorError.ChartType = SeriesChartType.Spline;
|
|
diffPredecessorPrediction.ChartType = SeriesChartType.Spline;
|
|
|
|
/* Main while loop for the prediction and learing */
|
|
while (x_count < NumberOfSamples - 1)
|
|
{
|
|
double x_pred = 0.0;
|
|
double x_actual = _x[x_count];
|
|
if (x_count > 0)
|
|
{
|
|
|
|
/* Initializing the windowsize */
|
|
int _arrayLength = (x_count > windowSize) ? windowSize : x_count;
|
|
|
|
/* Prediction algorithem */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_pred += (w[i, x_count] * (_x[x_count - i] - _x[x_count - i - 1]));
|
|
}
|
|
x_pred += _x[x_count - 1];
|
|
|
|
/* If output is checked a file is produced with prediction, actual and the error */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("differentialpredecessor .txt",
|
|
String.Format("{0}. X_pred {1}\n", x_count, x_pred),
|
|
Encoding.UTF8);
|
|
|
|
File.AppendAllText("differentialpredecessor.txt",
|
|
String.Format("{0}. X_actual {1}\n", x_count, x_actual),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
/* Calculating the error */
|
|
x_error[x_count] = x_actual - x_pred;
|
|
|
|
/* Output */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("differentialpredecessor.txt",
|
|
String.Format("{0}. X_error {1}\n\n", x_count, x_error[x_count]),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
|
|
double x_square = 0;
|
|
|
|
/* Calulating the LMS value */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
x_square += Math.Pow(_x[x_count - i] - _x[x_count - i - 1], 2);
|
|
}
|
|
|
|
/* x_square == 0.0, drives to undefined weights therefor we set it to 1 */
|
|
if (x_square == 0.0)
|
|
{
|
|
x_square = 1;
|
|
}
|
|
|
|
/* Learning algorithem */
|
|
for (int i = 1; i < _arrayLength; i++)
|
|
{
|
|
w[i, x_count + 1] = w[i, x_count] + learnrate * x_error[x_count] * ((_x[x_count - i] - _x[x_count - i - 1]) / x_square);
|
|
}
|
|
|
|
}
|
|
|
|
/* Printing error and prediction on the series */
|
|
diffPredecessorError.Points.AddXY(x_count, x_error[x_count]);
|
|
diffPredecessorPrediction.Points.AddXY(x_count, x_pred);
|
|
|
|
x_count += 1;
|
|
}
|
|
|
|
/* Calculating the avearage of the error and the variance of the error */
|
|
double mittel = x_error.Where(d => !double.IsNaN(d)).Skip(windowSize).Sum() / x_error.Length;
|
|
double varianz = 0.0;
|
|
foreach (double x_e in x_error.Skip(windowSize))
|
|
{
|
|
if (!double.IsNaN(x_e))
|
|
varianz += Math.Pow(x_e - mittel, 2);
|
|
}
|
|
varianz /= x_error.Length;
|
|
|
|
/* Displayes both on labels */
|
|
label3.Text = mittel.ToString();
|
|
label5.Text = varianz.ToString();
|
|
|
|
/* Output the result */
|
|
if (checkBox_output.Checked)
|
|
{
|
|
File.AppendAllText("results_differentialpredecessor.txt",
|
|
String.Format("Squared variance(x_error): {0}\n Average(x_error): {1}\n\n", varianz, mittel),
|
|
Encoding.UTF8);
|
|
}
|
|
|
|
return new Series[] { diffPredecessorError, diffPredecessorPrediction };
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* Form1_Load()
|
|
*
|
|
* loads the form and initializes some variables
|
|
*
|
|
*---------------------------------------------------*/
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
{
|
|
/* Initializing some diffrent combo-/textboxes and the main chart */
|
|
comboBox_algorithem.SelectedIndex = 0;
|
|
comboBox_pixel.SelectedIndex = 0;
|
|
// sets an eventhandler on the gotFocus event
|
|
txtBox_learnrate.GotFocus += new EventHandler(txtBox_learnrate_gotFocus);
|
|
txtBox_learnrate.Text = ">0.0 & <=1.0";
|
|
// sets an eventhandler on the gotFocus event
|
|
txtBox_windowSize.GotFocus += new EventHandler(txtBox_windowSize_gotFocus);
|
|
chart_main.Series.Clear();
|
|
Series x_actual = new Series("Actual x Value");
|
|
x_actual.ChartType = SeriesChartType.Spline;
|
|
|
|
// sets the accept button to Start_btn
|
|
this.AcceptButton = Start_btn;
|
|
|
|
/* Initializing weights and actual values
|
|
In case no picture is loaded, actual values are generated
|
|
Then printing them on a chart */
|
|
for (int i = 0; i < NumberOfSamples / 2; i++)
|
|
{
|
|
_x[i] += ((255.0 / NumberOfSamples / 2) * i);
|
|
for (int k = 0; k < windowSize; k++)
|
|
{
|
|
w[k, i] = rnd.NextDouble();
|
|
}
|
|
x_actual.Points.AddXY(i, _x[i]);
|
|
}
|
|
chart_main.Series.Add(x_actual);
|
|
}
|
|
|
|
/*--------------------------------------------------
|
|
* txtBox_learnrate_gotFocus()
|
|
*
|
|
* sets the default text to "" if gotFocus is raised
|
|
*
|
|
* -------------------------------------------------*/
|
|
|
|
protected void txtBox_learnrate_gotFocus(Object sender, EventArgs e)
|
|
{
|
|
txtBox_learnrate.Text = "";
|
|
}
|
|
|
|
/*--------------------------------------------------
|
|
* txtBox_windowSize_gotFocus()
|
|
*
|
|
* sets the default text to "" if gotFocus is raised
|
|
*
|
|
* -------------------------------------------------*/
|
|
|
|
protected void txtBox_windowSize_gotFocus(Object sender, EventArgs e)
|
|
{
|
|
txtBox_windowSize.Text = "";
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* Clear_btn_Click()
|
|
*
|
|
* clears the chart and reprints the actual values
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
private void Clear_btn_Click(object sender, EventArgs e)
|
|
{
|
|
chart_main.Series.Clear();
|
|
Series x_actual = new Series("Actual x Value");
|
|
x_actual.ChartType = SeriesChartType.Spline;
|
|
for (int i = 0; i < Int32.Parse(comboBox_pixel.SelectedItem.ToString()); i++)
|
|
{
|
|
x_actual.Points.AddXY(i, _x[i]);
|
|
}
|
|
chart_main.Series.Add(x_actual);
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* Load_btn_Click()
|
|
*
|
|
* loads a image from a file and stores all pixels in an array
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
private void Load_btn_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
|
|
OpenFileDialog openFileDialog = new OpenFileDialog();
|
|
|
|
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
/* Catch a exception if any is raised */
|
|
try
|
|
{
|
|
/* Loads file into a bitmap */
|
|
Bitmap img = new Bitmap(openFileDialog.FileName);
|
|
pixel_array = new double[img.Width * img.Height];
|
|
|
|
for (int i = 1; i < img.Width; i++)
|
|
{
|
|
for (int j = 1; j < img.Height; j++)
|
|
{
|
|
|
|
Color pixel = img.GetPixel(i, j);
|
|
pixel_array[j * i] = pixel.R;
|
|
|
|
}
|
|
}
|
|
|
|
_x = pixel_array;
|
|
|
|
/* Recreating the weights with the new size of NumberOfSamples */
|
|
|
|
w = new double[windowSize, NumberOfSamples];
|
|
for (int i = 0; i < NumberOfSamples; i++)
|
|
{
|
|
for (int k = 0; k < windowSize; k++)
|
|
{
|
|
w[k, i] = rnd.NextDouble();
|
|
}
|
|
}
|
|
|
|
/* Clearing the screen after loading the pixels to make the new graph occure */
|
|
Clear_btn_Click(new object(), new EventArgs());
|
|
|
|
}
|
|
catch (Exception exep)
|
|
{
|
|
MessageBox.Show("Konnte Bild nicht laden.");
|
|
MessageBox.Show(String.Format("{0}", exep.ToString()));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------
|
|
* txtBox_windowSize_TextChanged()
|
|
*
|
|
* proofs if window size textbox is a valid number
|
|
*
|
|
*---------------------------------------------------*/
|
|
|
|
private void txtBox_windowSize_TextChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (txtBox_windowSize.Text.Length > 0)
|
|
{
|
|
windowSize = Int32.Parse(txtBox_windowSize.Text);
|
|
}
|
|
}
|
|
catch (Exception excep)
|
|
{
|
|
MessageBox.Show("Not a valid window size");
|
|
txtBox_windowSize.Text = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|