Create new instance uses much memory - c#

I use Nevron Chart in my program. following code is in a click button event:
this.nChartControl1 = new NChartControl();
// add data to chart ...
after each click program allocates a lot of memory and even GC.Collect() doesn't clean the memory, and if I use one instance of Nevron Chart and every time clean the data and then add new data every thing is OK.
what's the problem?
Update 1: here is the function
private void button_Click(object sender, RoutedEventArgs e)
{
//if (nChartControl1 == null)
{
this.nChartControl1 = new NChartControl();
}
// clear data
nChartControl1.Charts.Clear();
nChartControl1.Panels.Clear();
GC.Collect();
// empty the grid then add NevronChart
this.grid.Children.Clear();
this.grid.Children.Add(nChartControl1);
nChartControl1.BackgroundStyle.FrameStyle.Visible = false;
// set a chart title
NLabel title = nChartControl1.Labels.AddHeader("2D Line Chart");
// setup chart
NCartesianChart chart = new NCartesianChart();
nChartControl1.Panels.Add(chart);
chart.DockMode = PanelDockMode.Fill;
chart.Margins = new NMarginsL(2, 0, 2, 2);
chart.Projection.SetPredefinedProjection(PredefinedProjection.Orthogonal);
chart.LightModel.EnableLighting = false;
chart.Axis(StandardAxis.Depth).Visible = false;
chart.Wall(ChartWallType.Floor).Visible = false;
chart.Wall(ChartWallType.Left).Visible = false;
chart.BoundsMode = BoundsMode.Stretch;
chart.Height = 40;
chart.RangeSelections.Add(new NRangeSelection());
chart.Axis(StandardAxis.PrimaryX).ScrollBar.Visible = true;
chart.Axis(StandardAxis.PrimaryY).ScrollBar.Visible = true;
// setup the line series
NLineSeries line = (NLineSeries)chart.Series.Add(SeriesType.Line);
//line.Values.FillRandom(new Random(), 10);
SetRandomData(line);
line.DataLabelStyle.Visible = false;
line.Legend.Mode = SeriesLegendMode.DataPoints;
line.ShadowStyle.Type = ShadowType.GaussianBlur;
line.ShadowStyle.Offset = new NPointL(new NLength(3, NGraphicsUnit.Pixel), new NLength(3, NGraphicsUnit.Pixel));
line.ShadowStyle.FadeLength = new NLength(5, NGraphicsUnit.Pixel);
line.ShadowStyle.Color = System.Drawing.Color.FromArgb(55, 0, 0, 0);
line.LineSegmentShape = LineSegmentShape.Line;
nChartControl1.Controller.Tools.Add(new NSelectorTool());
nChartControl1.Controller.Tools.Add(new NAxisScrollTool());
nChartControl1.Controller.Tools.Add(new NDataZoomTool());
NDataPanTool dpt = new NDataPanTool();
nChartControl1.Controller.Tools.Add(dpt);
nChartControl1.Legends.Clear();
nChartControl1.Refresh();
}

I just tested the control using the following code:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100000; i++)
{
using (NChartControl chartControl = new NChartControl())
{
// set a chart title
NLabel title = chartControl.Labels.AddHeader("2D Line Chart");
// setup chart
NCartesianChart chart = new NCartesianChart();
chartControl.Panels.Add(chart);
chart.DockMode = PanelDockMode.Fill;
chart.Margins = new NMarginsL(2, 0, 2, 2);
chart.Projection.SetPredefinedProjection(PredefinedProjection.Orthogonal);
chart.LightModel.EnableLighting = false;
chart.Axis(StandardAxis.Depth).Visible = false;
chart.Wall(ChartWallType.Floor).Visible = false;
chart.Wall(ChartWallType.Left).Visible = false;
chart.BoundsMode = BoundsMode.Stretch;
chart.Height = 40;
chart.RangeSelections.Add(new NRangeSelection());
chart.Axis(StandardAxis.PrimaryX).ScrollBar.Visible = true;
chart.Axis(StandardAxis.PrimaryY).ScrollBar.Visible = true;
// setup the line series
NLineSeries line = (NLineSeries)chart.Series.Add(SeriesType.Line);
//line.Values.FillRandom(new Random(), 10);
line.DataLabelStyle.Visible = false;
line.Legend.Mode = SeriesLegendMode.DataPoints;
line.ShadowStyle.Type = ShadowType.GaussianBlur;
line.ShadowStyle.Offset = new NPointL(new NLength(3, NGraphicsUnit.Pixel), new NLength(3, NGraphicsUnit.Pixel));
line.ShadowStyle.FadeLength = new NLength(5, NGraphicsUnit.Pixel);
line.ShadowStyle.Color = System.Drawing.Color.FromArgb(55, 0, 0, 0);
line.LineSegmentShape = LineSegmentShape.Line;
chartControl.Controller.Tools.Add(new NSelectorTool());
chartControl.Controller.Tools.Add(new NAxisScrollTool());
chartControl.Controller.Tools.Add(new NDataZoomTool());
NDataPanTool dpt = new NDataPanTool();
chartControl.Controller.Tools.Add(dpt);
chartControl.Legends.Clear();
chartControl.Refresh();
}
}
}
And there was no memory leak in the control. So the answer is that you need to call dispose or use a using statement.

Related

Windows forms - The name "dataGridView2" doesn't exist in this context

The problem is "The name "dataGridView2" doesn't exist in this context.". It only appears at the final parts of the code. Placing the object creation outside of public void menuItem1_Click fixes the problem, but then it only creates one object, I need it to create an object every time a button is pressed.
Here is the code from Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Kalkulator_Matrica
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int brojMatrice = 1;
public int dataGridCreator = 0;
public void menuItem1_Click(object sender, EventArgs e)
{
// opens form2 with new matrix
Form2 novaMatrica = new Form2();
using (var form = new Form2())
{
var result = form.ShowDialog();
if (result == DialogResult.OK)
{
int column = form.ReturnValue1;
int row = form.ReturnValue2;
//Create tab
TabPage tpage = new TabPage("Matrica " + brojMatrice);
tabControl1.TabPages.Add(tpage);
//Create data grid
DataGridView dataGridView2 = new DataGridView();
dataGridView2.ClientSize = new Size(553, 350);
dataGridView2.AllowUserToAddRows = false;
dataGridView2.AllowUserToResizeColumns = false;
dataGridView2.AllowUserToResizeRows = false;
dataGridView2.ColumnHeadersVisible = false;
dataGridView2.RowHeadersVisible = false;
dataGridView2.ColumnCount = column;
dataGridView2.RowCount = row;
this.AutoSize = true;
tpage.Controls.Add(dataGridView2); //Add grid to tab
//Create matrix name label
Label imeMatrice = new Label();
imeMatrice.Location = new Point(620, 10);
imeMatrice.Size = new Size(100, 20);
imeMatrice.Font = new Font("Microsoft Sans Serif", 15);
imeMatrice.Text = "Matrica " + brojMatrice;
tpage.Controls.Add(imeMatrice);
//Create matrix data label
Label dataMatrice = new Label();
dataMatrice.Location = new Point(637, 35);
dataMatrice.Size = new Size(100, 20);
dataMatrice.Font = new Font("Microsoft Sans Serif", 15);
dataMatrice.Text = dataGridView2.RowCount + " x " + dataGridView2.ColumnCount;
tpage.Controls.Add(dataMatrice);
//Povecamo counter za imena matrica
brojMatrice += 1;
//Create button ADD ROW
Button addRow = new Button();
addRow.Location = new Point(557, 70);
addRow.Size = new Size(107, 40);
addRow.Text = "Dodaj redak";
addRow.Click += new EventHandler(addRowClick);
tpage.Controls.Add(addRow);
//Create button REMOVE ROW
Button removeRow = new Button();
removeRow.Location = new Point(663, 70);
removeRow.Size = new Size(107, 40);
removeRow.Text = "Izbrisi redak";
removeRow.Click += new EventHandler(removeRowClick);
tpage.Controls.Add(removeRow);
//Create button ADD COLUMN
Button addColumn = new Button();
addColumn.Location = new Point(557, 110);
addColumn.Size = new Size(107, 40);
addColumn.Text = "Dodaj stupac";
addColumn.Click += new EventHandler(addColumnClick);
tpage.Controls.Add(addColumn);
//Create button REMOVE COLUMN
Button removeColumn = new Button();
removeColumn.Location = new Point(663, 110);
removeColumn.Size = new Size(107, 40);
removeColumn.Text = "Izbrisi stupac";
removeColumn.Click += new EventHandler(removeColumnClick);
tpage.Controls.Add(removeColumn);
//Sets widght of all columns
for (int i = 0; i < column; i = i + 1)
{
dataGridView2.Columns[i].Width = 25;
}
dataGridCreator = dataGridCreator + 1;
}
}
}
private void addRowClick(object sender, EventArgs e)
{
dataGridView2.RowCount = dataGridView2.RowCount + 1;
}
private void removeRowClick(object sender, EventArgs e)
{
if (dataGridView2.RowCount > 1) {
dataGridView2.RowCount = dataGridView2.RowCount - 1;
}
}
private void addColumnClick(object sender, EventArgs e)
{
dataGridView2.ColumnCount = dataGridView2.ColumnCount + 1;
for (int i = 0; i < dataGridView2.ColumnCount; i = i + 1)
{
dataGridView2.Columns[i].Width = 25;
}
}
private void removeColumnClick(object sender, EventArgs e)
{
if (dataGridView2.ColumnCount > 1)
{
dataGridView2.ColumnCount = dataGridView2.ColumnCount - 1;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Use like below, it will create new object every time but name of the variable will be same through out the code and it accessible in the context as well.
int brojMatrice = 1;
public int dataGridCreator = 0;
DataGridView dataGridView2;
public void menuItem1_Click(object sender, EventArgs e)
{
//Create data grid
dataGridView2 = new DataGridView();
}

Message Box unable to call local variable

I'm going to preface this by saying I'm sure the question has already been asked but I've tried all the suggestions and nothing seems to work for me. It just keeps returning a blank message box. If the answer were just a nice snippet of code I can add to my answer that would be fantastic.
private string Text1;
public void Button_Click(object sender, RoutedEventArgs e)
{
TextBox txtbx = new TextBox();
txtbx.Height = 50;
txtbx.Width = 200;
txtbx.Margin = new Thickness(771, 282, 0, 0);
txtbx.Background = new SolidColorBrush(Colors.White);
txtbx.Foreground = new SolidColorBrush(Colors.Black);
Text1 = txtbx.Text;
if (EditChecked == true)
{
LayoutRoot.Children.Add(txtbx);
Button Save = new Button();
Save.Height = 25;
Save.Width = 50;
Save.Content = "Save";
Save.Margin = new Thickness(771, 382, 0, 0);
LayoutRoot.Children.Add(Save);
txtbx.Text = Text1;
Save.Click += delegate
{
txtbx.Visibility = Visibility.Collapsed;
Save.Visibility = Visibility.Collapsed;
};
}
else if (ViewChecked == true)
{
MessageBox.Show(Text1);
}
}
Edit: Thanks to mjwills I moved the "Text1 = txtbx.Text;" line so this is what ended up working fyi:
private string Text1;
public void Button_Click(object sender, RoutedEventArgs e)
{
TextBox txtbx = new TextBox();
txtbx.Height = 50;
txtbx.Width = 200;
txtbx.Margin = new Thickness(771, 282, 0, 0);
txtbx.Background = new SolidColorBrush(Colors.White);
txtbx.Foreground = new SolidColorBrush(Colors.Black);
if (EditChecked == true)
{
LayoutRoot.Children.Add(txtbx);
Button Save = new Button();
Save.Height = 25;
Save.Width = 50;
Save.Content = "Save";
Save.Margin = new Thickness(771, 382, 0, 0);
LayoutRoot.Children.Add(Save);
txtbx.Text = Text1;
Save.Click += delegate
{
txtbx.Visibility = Visibility.Collapsed;
Save.Visibility = Visibility.Collapsed;
Text1 = txtbx.Text;
};
}
You declare:
private string Text1;
However you only assign it on the chance:
EditChecked = True
And you only display the message if
EditChecked = False
So, you need to assign Text1 on if the EditChecked = False. Perhaps on the declaration:
private string Text1 = "My default message";

How can i create buttons in C# [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question appears to be off-topic because it lacks sufficient information to diagnose the problem. Describe your problem in more detail or include a minimal example in the question itself.
Closed 9 years ago.
Improve this question
Please, can you help me with create buttons. I have problem that when i run application so i dont see any buttons from my code. Somewhere in my code is bug.
Step 1) (Class for button properities)
class GraphicClassStructure : GraphicPosition
{
public Button menu = new Button();
public Button classBackround = new Button();
public Button resetTree = new Button();
public void CreateClassButtons()
{
switch (UniqueValue.character)
{
case "sorcerer":
this.menu.Name = "sorcererText";
this.menu.BackgroundImage = BuildResource.sorcerer;
this.classBackround.BackgroundImage = BuildResource.sorcerer_skill_tree;
break;
case "dragonknight":
this.menu.Name = "dragonKnightText";
this.menu.BackgroundImage = BuildResource.dragonknight;
this.classBackround.BackgroundImage = BuildResource.dragonknight_skill_tree;
break;
case "templar":
this.menu.Name = "templarText";
this.menu.BackgroundImage = BuildResource.templar;
this.classBackround.BackgroundImage = BuildResource.templar_skill_tree;
break;
case "nightblade":
this.menu.Name = "nightbladeText";
this.menu.BackgroundImage = BuildResource.nightblade;
this.classBackround.BackgroundImage = BuildResource.nightblade_skill_tree;
break;
}
// Menu
this.menu.BackColor = System.Drawing.Color.Transparent;
this.menu.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.menu.FlatAppearance.BorderSize = 0;
this.menu.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.menu.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.menu.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.menu.Location = new System.Drawing.Point(Location[0][0][0], Location[0][1][0]);
this.menu.Size = new System.Drawing.Size(Size[0][0][0], Size[0][1][0]);
this.menu.TabIndex = 3;
this.menu.UseVisualStyleBackColor = false;
// Class Backround
this.classBackround.BackColor = System.Drawing.Color.Transparent;
this.classBackround.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.classBackround.FlatAppearance.BorderSize = 0;
this.classBackround.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.classBackround.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.classBackround.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.classBackround.Location = new System.Drawing.Point(Location[0][0][1], Location[0][1][1]);
this.classBackround.Name = "classBackround";
this.classBackround.Size = new System.Drawing.Size(Size[0][0][1], Size[0][1][1]);
this.classBackround.TabIndex = 17;
this.classBackround.UseVisualStyleBackColor = false;
// Reset tree
this.resetTree.BackColor = System.Drawing.Color.Transparent;
this.resetTree.BackgroundImage = BuildResource.reset;
this.resetTree.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.resetTree.FlatAppearance.BorderSize = 0;
this.resetTree.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent;
this.resetTree.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
this.resetTree.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.resetTree.Name = "resetTree";
this.resetTree.Size = new System.Drawing.Size(Size[0][0][2], Size[0][1][2]);
//this.resetTree.TabIndex = 18;
this.resetTree.UseVisualStyleBackColor = false;
}
}
Step 2) (Class for button position and size)
class GraphicPosition
{
// new int[type][x,y][value]
// Location
public int[][][] Location;
// Size
public int[][][] Size;
public GraphicPosition()
{
Location = new int[][][]
{
new int[][]
{
// Menu
new int[89],
// Class
new int[325],
// Reset Tree
new int[410],
new int[615],
new int[823]
},
new int[][]
{
// Menu
new int[223],
// Class
new int[200],
// Reset Tree
new int[169],
new int[169],
new int[169]
}
};
Size = new int[][][]
{
new int[][]
{
// Menu
new int[133],
// Class
new int[619],
// Reset Tree
new int[28]
},
new int[][]
{
// Menu
new int[26],
// Class
new int[484],
// Reset Tree
new int[25]
}
};
}
}
Step 3) (Script in form initialization component)
Collection collection = new Collection();
GraphicClassStructure classStructure = new GraphicClassStructure();
public buildEditor()
{
InitializeComponent();
this.Cursor = NativeMethods.LoadCustomCursor(Path.Combine(collection.source, collection.cursor));
maxSkillPoint.Text = collection.maxSkill.ToString();
classStructure.CreateClassButtons();
this.Controls.Add(classStructure.classBackround);
for (int i = 0; i < 3; i++)
{
switch (i)
{
case 0:
classStructure.resetTree.Location = new System.Drawing.Point(classStructure.Location[0][0][2], classStructure.Location[0][1][2]);
break;
case 1:
classStructure.resetTree.Location = new System.Drawing.Point(classStructure.Location[0][0][3], classStructure.Location[0][1][3]);
break;
case 2:
classStructure.resetTree.Location = new System.Drawing.Point(classStructure.Location[0][0][4], classStructure.Location[0][1][4]);
break;
}
classStructure.resetTree.Click += new EventHandler(resetTreekOneEvent_Click);
classStructure.resetTree.Tag = i;
this.Controls.Add(classStructure.resetTree);
}
switch (UniqueValue.character)
{
case "sorcerer":
MessageBox.Show("sorcerer");
classStructure.menu.Click += new System.EventHandler(sorcerer_Click);
classStructure.menu.MouseEnter += new System.EventHandler(sorcerer_MouseEnter);
classStructure.menu.MouseLeave += new System.EventHandler(sorcerer_MouseLeave);
break;
case "dragonknight":
MessageBox.Show("dragonknight");
classStructure.menu.Click += new System.EventHandler(dragonKnightText_Click);
classStructure.menu.MouseEnter += new System.EventHandler(dragonKnightText_MouseEnter);
classStructure.menu.MouseLeave += new System.EventHandler(dragonKnightText_MouseLeave);
break;
case "templar":
MessageBox.Show("templar");
classStructure.menu.Click += new System.EventHandler(templar_Click);
classStructure.menu.MouseEnter += new System.EventHandler(templar_MouseEnter);
classStructure.menu.MouseLeave += new System.EventHandler(templar_MouseLeave);
break;
case "nightblade":
MessageBox.Show("nightblade");
classStructure.menu.Click += new System.EventHandler(nightblade_Click);
classStructure.menu.MouseEnter += new System.EventHandler(nightblade_MouseEnter);
classStructure.menu.MouseLeave += new System.EventHandler(nightblade_MouseLeave);
break;
}
this.Controls.Add(this.classStructure.menu);
}
Any buttons is not displayed. Please, help me.
All your buttons have size (0, 0) and location (0, 0).
You use arrays incorrectly. E.g. the code new int[89] creates an array of 89 elements and all the elements are zero. But it looks like you wanted to store a single int value 89.
You need to change your code in such a way:
Declaration:
// 2 pairs of square brackets instead of 3
public int[][] Location;
public int[][] Size;
Initialization:
Location = new int[][]
{
new int[]
{
// Menu
89,
// Class
325,
// Reset Tree
410,
615,
823
},
...
Use:
this.menu.Location = new System.Drawing.Point(Location[0][0], Location[1][0]);
But better way is to redesign your Location and Size data structures in such a way:
Point[] Location; // instead of int[][] Location
Size[] Size; // instead of int[][] Size

how to increase speed of tchart refresh()?

I have 16 graphs[maximum ] with 4 fastlines in each graph. In each graph 3 fastlines represent min , max and ideal value. 4th fastline is actual values from the hardware. I have to run the test for 18,000 samples. So , first 3 fastlines are already drawn and when the switch is on and data comes in , 4th fastline is drawn. In order to draw the 4th line, I use the method Series4.Add(actualvalue, "" , color.red) .
here is the problem. each time the sample is drawn on 4th line. chart has to be refreshed in order to view the plotting of that sample. that also redraws the other 3 fastlines with 18,000 samples in each . so it redraws that many samples without use again and again. I need to draw only 4th fastline.
I can not use an array to fill the values up and then assign it as a source of fastline because I dont have any values beforehand. I tried series4.repaint() method and series4.refreshseries() method, but that doesnt repaint 4th series actually. we have to refresh the whole chart.
and therefore, it slows down the performance because of high number of samples in each fastline [18,000] and one graph with 4 fastlines and total 16 graphs like this.
I ve already done
Series4.AutoRepaint = false, Series4.DrawAllPoints = false;
Series4.XValues.Order = ValueListOrder.None , Series4.YValues.Order = ValueListOrder.None
Is there any way I can increase the performance ?
Thank you.
I have made a simple code, where I have added 4 charts with 4 FastLines with 18000 points for each fastline using a table to add a initialize values and after I update only the values of Series4. The performance is good for the number of values I am drawing:
public Form1()
{
InitializeComponent();
InitializeChart();
}
// Steema.TeeChart.Styles.FastLine Series1;
Timer timer1, timer2,timer3, timer4;
Random r;
DateTime dt;
DateTime[] Xvalues1;
double[] Yvalues1;
Steema.TeeChart.TChart tChart1, tChart2, tChart3,tChart4;
private void InitializeChart()
{
tChart1 = new TChart();
tChart2 = new TChart();
tChart3 = new TChart();
tChart4 = new TChart();
this.Controls.Add(tChart1);
this.Controls.Add(tChart2);
this.Controls.Add(tChart3);
this.Controls.Add(tChart4);
//Initialize Locations and size
this.Width = 908;
this.Height = 600;
//Location
tChart1.Left = 12;
tChart1.Top = 53;
tChart2.Left = 468;
tChart2.Top = 53;
tChart3.Left = 12;
tChart3.Top = 318;
tChart4.Left = 468;
tChart4.Top = 318;
//Size
tChart1.Width = 373;
tChart1.Height = 236;
tChart2.Width = 373;
tChart2.Height = 236;
tChart3.Width = 373;
tChart3.Height = 236;
tChart4.Width = 373;
tChart4.Height = 236;
tChart1.Aspect.View3D = false;
tChart2.Aspect.View3D = false;
tChart3.Aspect.View3D = false;
tChart4.Aspect.View3D = false;
tChart1.Legend.Visible = false;
tChart2.Legend.Visible = false;
tChart3.Legend.Visible = false;
tChart4.Legend.Visible = false;
tChart1.Panel.Gradient.Visible = false;
tChart2.Panel.Gradient.Visible = false;
tChart3.Panel.Gradient.Visible = false;
tChart4.Panel.Gradient.Visible = false;
tChart1.Axes.Bottom.AxisPen.Visible = false;
tChart2.Axes.Bottom.AxisPen.Visible = false;
tChart3.Axes.Bottom.AxisPen.Visible = false;
tChart4.Axes.Bottom.AxisPen.Visible = false;
tChart1.Axes.Left.AxisPen.Visible = false;
tChart2.Axes.Left.AxisPen.Visible = false;
tChart3.Axes.Left.AxisPen.Visible = false;
tChart4.Axes.Left.AxisPen.Visible = false;
//Series
tChart1.AutoRepaint = false;
tChart2.AutoRepaint = false;
tChart3.AutoRepaint = false;
tChart4.AutoRepaint = false;
for (int i = 0; i < 4; i++)
{
new Steema.TeeChart.Styles.FastLine(tChart1.Chart);
new Steema.TeeChart.Styles.FastLine(tChart2.Chart);
new Steema.TeeChart.Styles.FastLine(tChart3.Chart);
new Steema.TeeChart.Styles.FastLine(tChart4.Chart);
tChart1[i].XValues.DateTime=true;
tChart2[i].XValues.DateTime = true;
tChart3[i].XValues.DateTime = true;
tChart4[i].XValues.DateTime = true;
InitialDataSeries(tChart1[i]);
InitialDataSeries(tChart2[i]);
InitialDataSeries(tChart3[i]);
InitialDataSeries(tChart4[i]);
}
//Axes labels
tChart1.Axes.Bottom.Labels.DateTimeFormat = "dd/MM";
tChart1.Axes.Bottom.Labels.Angle = 90;
tChart2.Axes.Bottom.Labels.DateTimeFormat = "dd/MM";
tChart2.Axes.Bottom.Labels.Angle = 90;
tChart3.Axes.Bottom.Labels.DateTimeFormat = "dd/MM";
tChart3.Axes.Bottom.Labels.Angle = 90;
tChart4.Axes.Bottom.Labels.DateTimeFormat = "dd/MM";
tChart4.Axes.Bottom.Labels.Angle = 90;
tChart1.AutoRepaint = true;
tChart2.AutoRepaint = true;
tChart3.AutoRepaint = true;
tChart4.AutoRepaint = true;
tChart1.Refresh();
tChart2.Refresh();
tChart3.Refresh();
tChart4.Refresh();
//Timer
timer1 = new Timer();
timer1.Start();
timer1.Interval = 100;
timer1.Tick += new EventHandler(timer1_Tick);
}
void timer1_Tick(object sender, EventArgs e)
{
//See the chart data updated.
tChart1[0].Visible = false;
tChart1[1].Visible = false;
tChart1[2].Visible = false;
PopulateSeries(tChart1[3]);
PopulateSeries(tChart2[3]);
PopulateSeries(tChart3[3]);
PopulateSeries(tChart4[3]);
}
private void PopulateSeries(Steema.TeeChart.Styles.Series Series1)
{
r = new Random();
dt = DateTime.Now;
tChart1.AutoRepaint = false;
tChart2.AutoRepaint = false;
tChart3.AutoRepaint = false;
tChart4.AutoRepaint = false;
// show only 50 points - delete the rest
while (Series1.Count > 10000)
{
Series1.Delete(0);
}
if (Series1.Count > 10000)
{
Series1.Delete(0);
}
else
{
for (int t = 0; t < 100; t++)
{
Series1.Add(dt, r.Next(1000));
dt = dt.AddSeconds(15);
}
}
tChart1.AutoRepaint = true;
tChart2.AutoRepaint = true;
tChart3.AutoRepaint = true;
tChart4.AutoRepaint = true;
tChart1.Refresh();
tChart2.Refresh();
tChart3.Refresh();
tChart4.Refresh();
}
private void InitialDataSeries(Steema.TeeChart.Styles.Series Series1)
{
//Arrays
dt = DateTime.Now;
r = new Random();
Xvalues1 = new DateTime[18000];
Yvalues1 = new double[18000];
(Series1 as Steema.TeeChart.Styles.FastLine).DrawAllPoints = false;
for (int j = 0; j < 18000; j++)
{
Xvalues1[j] = dt;
dt = dt.AddSeconds(15);
Yvalues1[j] = r.Next(1000);
}
Series1.Add(Xvalues1, Yvalues1);
}
Could you tell us if it help you? On the other hand, if my code doesn't help you I recommend you use TeeChartDirect2D, this is ideal for the high speed data throughput required by DSP realtime applications. See the White paper, Boosting graphics-rendering performance in Windows Forms, for a closer look.
Thanks,

Head First C# Lab1 A Day at the Races called method not executing

I have a problem with the greyhound application that I have created. when I use the radio button to select who is placing a bet (Say Bob) and put his bet amount to 10 on dog number 4, (see image #1) when I click Bets, to update the 'Bob hasnt placed any bets' label with the description() method I get an error (see image #2)
What should happen is where it says "bob hasnt placed any bets" it should now read "bob bets 10 bucks on dog # 4. I have established this is failing due to the bettor returning NULL, but I cannot work out why this is when Bettor is referencing the Guy class which contains the bettor's name.
On a side notem when the race finishes and if Bob wins, he is note getting paid so either the PayOut() or Collect() methods are not working either.
Below are my 3 classes and my Form1.cs
Greyhound.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Drawing;
using System.Windows.Forms;
namespace A_Day_at_the_Races
{
public class Greyhound
{
public int StartingPosition; //Where my PictureBox starts
public int RacetrackLength; // How long the racetrack is
public PictureBox MyPictureBox = null; //My PictureBox object
public int Location = 0; // My Location on the racetrack
public Random Randomizer; // An instance of Random
public bool Run()
{
//1. Move forward either 1,2,3 or 4 spaces at random
int moveforward = Randomizer.Next(1, 4); // declare an int called 'moveforward' will move forward 1,2,3 or 4 spaces at random
//2. Update the position of my PictureBox on the form
Point p = MyPictureBox.Location; // current location of the picture of the greyhound
p.X += moveforward;
MyPictureBox.Location = p;
//3. Return true if I won the race
if (p.X >= RacetrackLength)
return true;
else
return false;
}
public void TakeStartingPosition()
{
//Reset my location to the start line
//MyPictureBox.Location.X = StartingPosition;
StartingPosition = 0;
}
}
}
Guy.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace A_Day_at_the_Races
{
public class Guy
{
public string Name; // The guy's name
public Bet MyBet = null; // An instance of bet() that has how much he's betting
public int Cash; // How much cash he has
// these last two fields are the guy's GUI controls on the form
public RadioButton MyRadioButton; // My RadioButton
public Label MyLabel; // My Label
public void UpdateLabels()
{
//1.Set my label to my bet's description,
if (MyBet == null)
MyLabel.Text = Name + " hasnt placed any bets";
else
MyLabel.Text = MyBet.GetDescription();
//2.Set the label on my radio button to show my cash ("Joe has 43 dollars")
MyRadioButton.Text = Name + " has " + Cash + " bucks";
}
public void ClearBet()
{
//1.Reset my bet so it's zero
MyBet = null;
}
//1.Place a new bet and store it in my bet field
//2.Return true if the guy had enough money to bet
public bool PlaceBet(int Amount, int Dog)
{
this.MyBet = new Bet();
if (Cash >= Amount)
{
Cash = Cash - Amount;
MyLabel = new Label();
MyBet.Amount = Amount;
MyBet.Dog = Dog;
UpdateLabels();
return true;
}
else
{
return false;
}
}
public void Collect(int Winner)
{
if (MyBet != null)
//1.Ask my bet to pay out (hint use the bet object to do the work)
Cash += MyBet.PayOut(Winner);
}
}
}
Bet.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace A_Day_at_the_Races
{
public class Bet
{
public int Amount; // The amount of cash that was bet
public int Dog; // The number of the dog the bet is on
public Guy Bettor; // The guy who placed the bet
public string GetDescription()
{
if (Amount > 0)
return Bettor.Name + " bets " + Amount + " bucks on dog #" + Dog;
else
return Bettor.Name + " hasnt placed a bet";
}
public int PayOut(int Winner)
{
if (Winner == Dog)
return Amount;
else
return -1 * Amount;
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace A_Day_at_the_Races
{
public partial class Form1 : Form
{
Guy[] Bettors;
Greyhound[] Dogs;
Guy CurrentBettor;
public Form1()
{
InitializeComponent();
Random Randomizer = new Random();
//initialise all my guys and dogs
Bettors = new Guy[3];
Dogs = new Greyhound[4];
//guys
Bettors[0] = new Guy();
Bettors[0].Name = "Joe";
Bettors[0].MyRadioButton = joeRadioButton;
Bettors[0].MyLabel = joeBetLabel;
Bettors[0].Cash = 50;
Bettors[0].UpdateLabels();
Bettors[1] = new Guy();
Bettors[1].Name = "Bob";
Bettors[1].MyRadioButton = bobRadioButton;
Bettors[1].MyLabel = bobBetLabel;
Bettors[1].Cash = 75;
Bettors[1].UpdateLabels();
Bettors[2] = new Guy();
Bettors[2].Name = "Al";
Bettors[2].MyRadioButton = alRadioButton;
Bettors[2].MyLabel = alBetLabel;
Bettors[2].Cash = 45;
Bettors[2].UpdateLabels();
int StartPosition = pictureBoxDog1.Location.X;
int distance = pictureBox1.Width;
for (int i = 0; i < 4; i++)
{
Dogs[i] = new Greyhound();
Dogs[i].Randomizer = Randomizer;
Dogs[i].RacetrackLength = distance;
Dogs[i].Location = Dogs[i].StartingPosition = StartPosition;
}
Dogs[0].MyPictureBox = pictureBoxDog1;
Dogs[1].MyPictureBox = pictureBoxDog2;
Dogs[2].MyPictureBox = pictureBoxDog3;
Dogs[3].MyPictureBox = pictureBoxDog4;
CurrentBettor = Bettors[0];
}
private void RaceButton_Click(object sender, EventArgs e)
{
int winner = 0;
int num_winners = 0;
while (num_winners == 0)
{
for (int i = 0; i < Dogs.Length; i++)
{
if (Dogs[i].Run())
{
num_winners++;
winner = i + 1;
}
}
Application.DoEvents();
System.Threading.Thread.Sleep(3);
}
if (num_winners > 1)
MessageBox.Show("We have " + num_winners + " winners");
else
MessageBox.Show(" Dog #" + winner + "wins!");
for (int i = 0; i < Dogs.Length; i++)
{
Dogs[i].TakeStartingPosition();
}
for (int i = 0; i < Bettors.Length; i ++)
{
Bettors[i].Collect(winner);
Bettors[i].ClearBet();
Bettors[i].UpdateLabels();
}
numericUpDownBet.Value = numericUpDownBet.Minimum;
numericUpDownDog.Value = numericUpDownDog.Minimum;
}
private void joeRadioButton_CheckedChanged(object sender, EventArgs e)
{
SetBettor(0);
}
private void bobRadioButton_CheckedChanged_1(object sender, EventArgs e)
{
SetBettor(1);
}
private void alRadioButton_CheckedChanged_1(object sender, EventArgs e)
{
SetBettor(2);
}
private void BetsButton_Click(object sender, EventArgs e)
{
CurrentBettor.PlaceBet((int)numericUpDownBet.Value, (int)numericUpDownDog.Value);
CurrentBettor.UpdateLabels();
}
private void SetBettor(int index)
{
CurrentBettor = Bettors[index];
NameLabel.Text = CurrentBettor.Name;
if (CurrentBettor.MyBet != null)
{
numericUpDownBet.Value = CurrentBettor.MyBet.Amount;
numericUpDownDog.Value = CurrentBettor.MyBet.Dog;
}
else
{
numericUpDownBet.Value = numericUpDownBet.Minimum;
numericUpDownDog.Value = 1;
}
}
private void Form1_Load(object sender, EventArgs e)
{
minimumBetLabel.Text = "Minimum Bet $5.00";
}
private void ResetButton_Click(object sender, EventArgs e)
{
pictureBoxDog1.Location = new Point(61,32);
pictureBoxDog2.Location = new Point(61,84);
pictureBoxDog3.Location = new Point(61,131);
pictureBoxDog4.Location = new Point(61,181);
}
}
}
Form1.Designer.cs
namespace A_Day_at_the_Races
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.pictureBoxDog1 = new System.Windows.Forms.PictureBox();
this.pictureBoxDog2 = new System.Windows.Forms.PictureBox();
this.pictureBoxDog3 = new System.Windows.Forms.PictureBox();
this.pictureBoxDog4 = new System.Windows.Forms.PictureBox();
this.RaceButton = new System.Windows.Forms.Button();
this.minimumBetLabel = new System.Windows.Forms.Label();
this.joeRadioButton = new System.Windows.Forms.RadioButton();
this.bobRadioButton = new System.Windows.Forms.RadioButton();
this.alRadioButton = new System.Windows.Forms.RadioButton();
this.BetsLabel = new System.Windows.Forms.Label();
this.joeBetLabel = new System.Windows.Forms.Label();
this.bobBetLabel = new System.Windows.Forms.Label();
this.alBetLabel = new System.Windows.Forms.Label();
this.NameLabel = new System.Windows.Forms.Label();
this.BetsButton = new System.Windows.Forms.Button();
this.numericUpDownBet = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.numericUpDownDog = new System.Windows.Forms.NumericUpDown();
this.ResetButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownBet)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownDog)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(12, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(602, 201);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// pictureBoxDog1
//
this.pictureBoxDog1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog1.Image")));
this.pictureBoxDog1.Location = new System.Drawing.Point(22, 21);
this.pictureBoxDog1.Name = "pictureBoxDog1";
this.pictureBoxDog1.Size = new System.Drawing.Size(75, 21);
this.pictureBoxDog1.TabIndex = 1;
this.pictureBoxDog1.TabStop = false;
//
// pictureBoxDog2
//
this.pictureBoxDog2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog2.Image")));
this.pictureBoxDog2.Location = new System.Drawing.Point(22, 70);
this.pictureBoxDog2.Name = "pictureBoxDog2";
this.pictureBoxDog2.Size = new System.Drawing.Size(75, 22);
this.pictureBoxDog2.TabIndex = 2;
this.pictureBoxDog2.TabStop = false;
//
// pictureBoxDog3
//
this.pictureBoxDog3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog3.Image")));
this.pictureBoxDog3.Location = new System.Drawing.Point(22, 120);
this.pictureBoxDog3.Name = "pictureBoxDog3";
this.pictureBoxDog3.Size = new System.Drawing.Size(75, 24);
this.pictureBoxDog3.TabIndex = 3;
this.pictureBoxDog3.TabStop = false;
//
// pictureBoxDog4
//
this.pictureBoxDog4.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog4.Image")));
this.pictureBoxDog4.Location = new System.Drawing.Point(22, 170);
this.pictureBoxDog4.Name = "pictureBoxDog4";
this.pictureBoxDog4.Size = new System.Drawing.Size(75, 24);
this.pictureBoxDog4.TabIndex = 4;
this.pictureBoxDog4.TabStop = false;
//
// RaceButton
//
this.RaceButton.Location = new System.Drawing.Point(468, 269);
this.RaceButton.Name = "RaceButton";
this.RaceButton.Size = new System.Drawing.Size(146, 73);
this.RaceButton.TabIndex = 5;
this.RaceButton.Text = "Race!";
this.RaceButton.UseVisualStyleBackColor = true;
this.RaceButton.Click += new System.EventHandler(this.RaceButton_Click);
//
// minimumBetLabel
//
this.minimumBetLabel.AutoSize = true;
this.minimumBetLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.minimumBetLabel.Location = new System.Drawing.Point(9, 241);
this.minimumBetLabel.Name = "minimumBetLabel";
this.minimumBetLabel.Size = new System.Drawing.Size(0, 13);
this.minimumBetLabel.TabIndex = 6;
//
// joeRadioButton
//
this.joeRadioButton.AutoSize = true;
this.joeRadioButton.Location = new System.Drawing.Point(12, 269);
this.joeRadioButton.Name = "joeRadioButton";
this.joeRadioButton.Size = new System.Drawing.Size(85, 17);
this.joeRadioButton.TabIndex = 7;
this.joeRadioButton.TabStop = true;
this.joeRadioButton.Text = "radioButton1";
this.joeRadioButton.UseVisualStyleBackColor = true;
this.joeRadioButton.CheckedChanged += new System.EventHandler(this.joeRadioButton_CheckedChanged);
//
// bobRadioButton
//
this.bobRadioButton.AutoSize = true;
this.bobRadioButton.Location = new System.Drawing.Point(12, 293);
this.bobRadioButton.Name = "bobRadioButton";
this.bobRadioButton.Size = new System.Drawing.Size(85, 17);
this.bobRadioButton.TabIndex = 8;
this.bobRadioButton.TabStop = true;
this.bobRadioButton.Text = "radioButton1";
this.bobRadioButton.UseVisualStyleBackColor = true;
this.bobRadioButton.CheckedChanged += new System.EventHandler(this.bobRadioButton_CheckedChanged_1);
//
// alRadioButton
//
this.alRadioButton.AutoSize = true;
this.alRadioButton.Location = new System.Drawing.Point(12, 317);
this.alRadioButton.Name = "alRadioButton";
this.alRadioButton.Size = new System.Drawing.Size(85, 17);
this.alRadioButton.TabIndex = 9;
this.alRadioButton.TabStop = true;
this.alRadioButton.Text = "radioButton2";
this.alRadioButton.UseVisualStyleBackColor = true;
this.alRadioButton.CheckedChanged += new System.EventHandler(this.alRadioButton_CheckedChanged_1);
//
// BetsLabel
//
this.BetsLabel.AutoSize = true;
this.BetsLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.BetsLabel.Location = new System.Drawing.Point(164, 241);
this.BetsLabel.Name = "BetsLabel";
this.BetsLabel.Size = new System.Drawing.Size(32, 13);
this.BetsLabel.TabIndex = 10;
this.BetsLabel.Text = "Bets";
//
// joeBetLabel
//
this.joeBetLabel.AutoSize = true;
this.joeBetLabel.Location = new System.Drawing.Point(164, 269);
this.joeBetLabel.Name = "joeBetLabel";
this.joeBetLabel.Size = new System.Drawing.Size(35, 13);
this.joeBetLabel.TabIndex = 11;
this.joeBetLabel.Text = "label1";
//
// bobBetLabel
//
this.bobBetLabel.AutoSize = true;
this.bobBetLabel.Location = new System.Drawing.Point(164, 293);
this.bobBetLabel.Name = "bobBetLabel";
this.bobBetLabel.Size = new System.Drawing.Size(35, 13);
this.bobBetLabel.TabIndex = 12;
this.bobBetLabel.Text = "label1";
//
// alBetLabel
//
this.alBetLabel.AutoSize = true;
this.alBetLabel.Location = new System.Drawing.Point(164, 317);
this.alBetLabel.Name = "alBetLabel";
this.alBetLabel.Size = new System.Drawing.Size(35, 13);
this.alBetLabel.TabIndex = 13;
this.alBetLabel.Text = "label1";
//
// NameLabel
//
this.NameLabel.AutoSize = true;
this.NameLabel.Location = new System.Drawing.Point(9, 359);
this.NameLabel.Name = "NameLabel";
this.NameLabel.Size = new System.Drawing.Size(0, 13);
this.NameLabel.TabIndex = 14;
//
// BetsButton
//
this.BetsButton.Location = new System.Drawing.Point(54, 354);
this.BetsButton.Name = "BetsButton";
this.BetsButton.Size = new System.Drawing.Size(75, 23);
this.BetsButton.TabIndex = 15;
this.BetsButton.Text = "Bets";
this.BetsButton.UseVisualStyleBackColor = true;
this.BetsButton.Click += new System.EventHandler(this.BetsButton_Click);
//
// numericUpDownBet
//
this.numericUpDownBet.Location = new System.Drawing.Point(135, 357);
this.numericUpDownBet.Minimum = new decimal(new int[] {
5,
0,
0,
0});
this.numericUpDownBet.Name = "numericUpDownBet";
this.numericUpDownBet.Size = new System.Drawing.Size(72, 20);
this.numericUpDownBet.TabIndex = 16;
this.numericUpDownBet.Value = new decimal(new int[] {
5,
0,
0,
0});
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(214, 359);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(113, 13);
this.label1.TabIndex = 17;
this.label1.Text = "bucks on dog number ";
//
// numericUpDownDog
//
this.numericUpDownDog.Location = new System.Drawing.Point(334, 356);
this.numericUpDownDog.Maximum = new decimal(new int[] {
4,
0,
0,
0});
this.numericUpDownDog.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownDog.Name = "numericUpDownDog";
this.numericUpDownDog.Size = new System.Drawing.Size(79, 20);
this.numericUpDownDog.TabIndex = 18;
this.numericUpDownDog.Value = new decimal(new int[] {
1,
0,
0,
0});
//
// ResetButton
//
this.ResetButton.Location = new System.Drawing.Point(468, 349);
this.ResetButton.Name = "ResetButton";
this.ResetButton.Size = new System.Drawing.Size(146, 41);
this.ResetButton.TabIndex = 19;
this.ResetButton.Text = "Reset";
this.ResetButton.UseVisualStyleBackColor = true;
this.ResetButton.Click += new System.EventHandler(this.ResetButton_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(626, 410);
this.Controls.Add(this.ResetButton);
this.Controls.Add(this.numericUpDownDog);
this.Controls.Add(this.label1);
this.Controls.Add(this.numericUpDownBet);
this.Controls.Add(this.BetsButton);
this.Controls.Add(this.NameLabel);
this.Controls.Add(this.alBetLabel);
this.Controls.Add(this.bobBetLabel);
this.Controls.Add(this.joeBetLabel);
this.Controls.Add(this.BetsLabel);
this.Controls.Add(this.alRadioButton);
this.Controls.Add(this.bobRadioButton);
this.Controls.Add(this.joeRadioButton);
this.Controls.Add(this.minimumBetLabel);
this.Controls.Add(this.RaceButton);
this.Controls.Add(this.pictureBoxDog4);
this.Controls.Add(this.pictureBoxDog3);
this.Controls.Add(this.pictureBoxDog2);
this.Controls.Add(this.pictureBoxDog1);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownBet)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownDog)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.PictureBox pictureBoxDog1;
private System.Windows.Forms.PictureBox pictureBoxDog2;
private System.Windows.Forms.PictureBox pictureBoxDog3;
private System.Windows.Forms.PictureBox pictureBoxDog4;
private System.Windows.Forms.Button RaceButton;
private System.Windows.Forms.Label minimumBetLabel;
private System.Windows.Forms.RadioButton joeRadioButton;
private System.Windows.Forms.RadioButton bobRadioButton;
private System.Windows.Forms.RadioButton alRadioButton;
private System.Windows.Forms.Label BetsLabel;
private System.Windows.Forms.Label joeBetLabel;
private System.Windows.Forms.Label bobBetLabel;
private System.Windows.Forms.Label alBetLabel;
private System.Windows.Forms.Label NameLabel;
private System.Windows.Forms.Button BetsButton;
private System.Windows.Forms.NumericUpDown numericUpDownBet;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.NumericUpDown numericUpDownDog;
private System.Windows.Forms.Button ResetButton;
}
}
in PlaceBet method you have forgotten to set the Bettor property:
if (Cash >= Amount)
{
Cash = Cash - Amount;
MyLabel = new Label();
MyBet.Amount = Amount; // HERE
MyBet.Dog = Dog; // HERE
UpdateLabels();
return true;
just add there also a line:
MyBet.Bettor = this;
Explanation/rationale: The point is that without it, when a "Guy" creates a "Bet", the Bet does not get to know who has created it. Nowhere in your code you set the Bettor field, so it never has a chance to be set to something meaningful. The bet will simply retain the default NULL value in this field. As I do not actually read/trace all the code, I think the simpliest way would be to make the Bet know his owner straight from the very beginning.
In Guy.cs when you call PlaceBet(...) and create instantiate the bet, you need to set:
this.MyBet.Bettor = this;
Within this function, this refers to the instance of Guy that is placing the bet.
The second problem you have is with the creation of a new instance of Label, without actually replacing the Label on your form with the new one. In summary fix the PlaceBet(...) method like so:
public bool PlaceBet(int Amount, int Dog)
{
this.MyBet = new Bet();
if (Cash >= Amount)
{
Cash = Cash - Amount;
// remove the following line
// MyLabel = new Label();
MyBet.Amount = Amount;
MyBet.Dog = Dog;
// insert this line...
MyBet.Bettor = this;
UpdateLabels();
return true;
}
else
{
return false;
}
}
I just performed this exercise myself in the book... been running through it. I looked over your code to see how you took care of this problem and I found a pretty big bug in how you handled paying out the betters - In form1.cs when you allow your loop to capture multiple winners you are not continuing to distribute winnings with the Collect method to anyone who bet on anything besides the last winning dog
while (num_winners == 0)
{
for (int i = 0; i < Dogs.Length; i++)
{
if (Dogs[i].Run())
{
num_winners++;
winner = i + 1;
}
}
Application.DoEvents();
System.Threading.Thread.Sleep(3);
}
if (num_winners > 1)
// you say that you have multiple winners right here but you never eval on
//it - winner is still set to one value above
MessageBox.Show("We have " + num_winners + " winners");
else
MessageBox.Show(" Dog #" + winner + "wins!");
for (int i = 0; i < Dogs.Length; i++)
{
Dogs[i].TakeStartingPosition();
}
for (int i = 0; i < Bettors.Length; i ++)
{
Bettors[i].Collect(winner);
Bettors[i].ClearBet();
Bettors[i].UpdateLabels();
}
What will need to be changed to correct this and disperse bets appropriately:
1) Make the betting scheme more realistic - when the bet is placed - subtract the money. You need to allow for a Re-Bet to take place just in case someone wants to redo one of the users on the front page
in guy.cs
public bool PlaceBet(int amount, int dog)
{
// place a new bet and store it in the bet field, return true if there is enough money
if (amount > Cash)
{
MessageBox.Show("I don't have enough money for that bet!", Name + " says...");
return false;
}
else
{
if (this.MyBet == null)
{
this.MyBet = new Bet() { Amount = amount, Bettor = this, Dog = dog };
this.Cash -= amount;
this.UpdateLabels();
return true;
}
else
{
this.Cash += this.MyBet.Amount;
this.MyBet = null;
this.MyBet = new Bet() { Amount = amount, Bettor = this, Dog = dog };
this.Cash -= amount;
this.UpdateLabels();
return true;
}
}
}
2) Now that the betters already lost/submitted their money and we don't have to worry about sending negative monies to them if their dog doesn't win, the Bet.cs Payout method can be updated to only provide a positive return if the winning dog matches their bet dog. if it doesn't, it returns nothing.
public int PayOut(int Winner)
{
// the parameter is the winner of the race. If the dog won, return the amount bet.
// otherwise return nothing
if (Winner == Dog)
{
int payout = Amount*2;
return payout;
}
else
{
int payout = 0;
return payout;
}
}
3) and now we can adjust our scheme in form1.cs to take care of paying multiples (even though this never really happens)
private void formButtonRace_Click(object sender, EventArgs e)
{
int winner = 0;
int windog = 0;
int count = 0;
for (int i = 0; i < Bettors.Length; i++)
{
if (Bettors[1].MyBet != null)
{
count++;
}
}
if (count == Bettors.Length)
{
while (winner == 0)
{
for (int i = 0; i < Dogs.Length; i++)
{
if (Dogs[i].Run())
{
winner++;
windog = i + 1;
for (int i2 = 0; i2 < Bettors.Length; i2++)
{
Bettors[i2].Collect(i + 1);
}
}
Application.DoEvents();
System.Threading.Thread.Sleep(3);
}
}
if (winner > 1)
{
MessageBox.Show("Multiple winners!", "WOW");
}
else
{
MessageBox.Show("The winner was dog #" + windog);
}
for (int i = 0; i < Bettors.Length; i++)
{
Bettors[i].ClearBet(true);
}
for (int i = 0; i < Dogs.Length; i++)
{
Dogs[i].TakeStartingPosition();
}
}
else
{
MessageBox.Show("Not all players have placed their bets!", "Wait wait!");
}
}
The reason why my ClearBet is passing in a bool is because I had to restore the money bet to each individual Guy if the reset button was pressed. However, if the race was completed I wanted to reset them without returning their bets.
This is that section for me in my code:
public void ClearBet(bool isRaceOver)
{
if (isRaceOver)
// reset bet when race is over
{
MyBet = null;
}
else
{
if (this.MyBet != null)
{
Cash += this.MyBet.Amount;
this.MyBet = null;
}
else
{
this.MyBet = null;
}
}
UpdateLabels();
}
In the PlaceBet() method, you are overwriting MyLabel with a new Label() therefore the original context of the label on the form is lost.
Although you are actually updating a Label, it's not the Label on the form.
public bool PlaceBet(int Amount, int Dog)
{
this.MyBet = new Bet();
if (Cash >= Amount)
{
Cash = Cash - Amount;
MyLabel = new Label(); // remove this
MyBet.Amount = Amount;
MyBet.Dog = Dog;
UpdateLabels();
return true;
}
else
{
return false;
}
}

Categories