Commit e51ba930 authored by M1888's avatar M1888

päiväkoodailut

parent da72682e
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<StackPanel> <StackPanel>
<DockPanel Margin="5"> <DockPanel Margin="5">
<Label>Rivihinta</Label> <Label>Rivihinta</Label>
<TextBox Style="{StaticResource Asetusboksi}" x:Name="txbHinta" Text="{Binding Rivihinta, Mode=TwoWay}" /> <TextBox Style="{StaticResource Asetusboksi}" x:Name="txbHinta" Text="{Binding Rivihinta, Mode=TwoWay}" TextChanged="txbChanged" />
</DockPanel> </DockPanel>
<TextBlock Margin="25,-5,0,0">Paljonko yksi lottorivi maksaa?</TextBlock> <TextBlock Margin="25,-5,0,0">Paljonko yksi lottorivi maksaa?</TextBlock>
</StackPanel> </StackPanel>
......
...@@ -34,22 +34,54 @@ namespace Lottokone ...@@ -34,22 +34,54 @@ namespace Lottokone
private void BtnRivit_Click(object sender, RoutedEventArgs e) private void BtnRivit_Click(object sender, RoutedEventArgs e)
{ {
var ikkuna = new Lottorivit(); new Lottorivit().ShowDialog();
ikkuna.ShowDialog();
} }
public void txbChanged(object sender, TextChangedEventArgs e) public void txbChanged(object sender, TextChangedEventArgs e)
{ {
// Yleismaallinen validaattori luvuille.
// Voisi tehdä tarkemminkin, voi olla että ei toimi ihan kuin suunniteltua
// jos lyö yhden lottorivin hinnaksi vaikka tuon 6 miljoonaa.
// En kuitenkaan nyt jaksa naputella ihan joka boksille omaa validaatiota.
TextBox tb = sender as TextBox; TextBox tb = sender as TextBox;
if (tb != null) if (tb != null)
{ {
bool ok = false; bool ok = false;
// Säädellään jotain järkeviä maksimiarvoja eri laatikoille
int maksimi;
switch(tb.Name)
{
case "txbPelaajia":
// max 25 miljoonaa pelaajaa
maksimi = 25_000_000;
break;
case "txbRiveja":
// max 100 000 riviä per pelaaja
maksimi = 100_000;
break;
case "txbHinta":
// 20e per rivi kuulostaa jo aika kalliilta
maksimi = 20;
break;
case "txbArparivit":
// Liikaa jos on omia rivejä, niin menee voittohistoria tukkoon pikkuvoitoista.
// 100 000 alkaa olla jo aika rajoilla.
maksimi = 100_000;
break;
default:
// muille ihan sama, melkeinpä.
maksimi = Int32.MaxValue;
break;
}
if (int.TryParse(tb.Text, out int result)) if (int.TryParse(tb.Text, out int result))
if (result >= 0 && result < 6_000_000) if (result >= 0 && result <= maksimi)
ok = true; ok = true;
if (!ok) if (!ok)
{ {
lblInfo.Content = "Asetathan luvuille tarkoitettuihin laatikoihin vain numeroita."; lblInfo.Content = $"{tb.Name}: sallitut luvut väliltä 0 - {maksimi:N0}";
btnSave.IsEnabled = false; btnSave.IsEnabled = false;
} }
else else
...@@ -74,12 +106,14 @@ namespace Lottokone ...@@ -74,12 +106,14 @@ namespace Lottokone
if(!ok) if(!ok)
{ {
lblInfo.Content = "Vakiorivejä voi olla 0-15 kpl"; lblInfo.Content = "Vakiorivejä voi olla 0-15 kpl";
btnSave.IsEnabled = false;
btnRivit.IsEnabled = false; btnRivit.IsEnabled = false;
} }
else else
{ {
lblInfo.Content = ""; lblInfo.Content = "";
btnRivit.IsEnabled = true; btnRivit.IsEnabled = true;
btnSave.IsEnabled = true;
} }
} }
......
...@@ -38,50 +38,71 @@ namespace Lottokone ...@@ -38,50 +38,71 @@ namespace Lottokone
NaytaKontrollit(); NaytaKontrollit();
} }
// Koodi on valitettavasti vähän spagettia. Minulla oli ongelmia saada tämän ikkunan layout
// toimimaan millään tapaa. Päädyin luomaan kaikki kontrollit täällä koodissa ja asettamaan ne gridille.
private void NaytaKontrollit() private void NaytaKontrollit()
{ {
this.Height = 80 + Properties.Settings.Default.Vakiorivit * 40;
numerot = new List<List<TextBox>>(); numerot = new List<List<TextBox>>();
grdRivit.RowDefinitions.Add(new RowDefinition());
// Dynaaminen korkeus tarpeen mukaan
this.Height = 80 + Properties.Settings.Default.Vakiorivit * 40;
// Gridiin tarvitan 8 saraketta. 1 labelille ja 7 numeroille.
for (int i = 0; i < 8; i++)
grdRivit.ColumnDefinitions.Add(new ColumnDefinition());
// Tallenna-nappi
btnSave = new Button(); btnSave = new Button();
btnSave.Content = "Tallenna"; btnSave.Content = "Tallenna";
btnSave.Margin = new Thickness(5); btnSave.Margin = new Thickness(5);
btnSave.Click += btnSave_Click; btnSave.Click += btnSave_Click;
// Asetetaan se toiseksi alimmalle riville
Grid.SetRow(btnSave, Properties.Settings.Default.Vakiorivit); Grid.SetRow(btnSave, Properties.Settings.Default.Vakiorivit);
Grid.SetColumnSpan(btnSave, 2); Grid.SetColumnSpan(btnSave, 2);
grdRivit.RowDefinitions.Add(new RowDefinition());
grdRivit.Children.Add(btnSave); grdRivit.Children.Add(btnSave);
grdRivit.RowDefinitions.Add(new RowDefinition()); // Luodaan label, jonne voidaan laittaa ohjeita ja virheitä.
lblInfo = new Label(); lblInfo = new Label();
lblInfo.Style = Resources["Isompi"] as Style; lblInfo.Style = Resources["Isompi"] as Style;
lblInfo.Margin = new Thickness(5); lblInfo.Margin = new Thickness(5);
// Se menee alimmalle riville.
Grid.SetRow(lblInfo, Properties.Settings.Default.Vakiorivit + 1); Grid.SetRow(lblInfo, Properties.Settings.Default.Vakiorivit + 1);
Grid.SetColumnSpan(lblInfo, 8); Grid.SetColumnSpan(lblInfo, 8);
grdRivit.RowDefinitions.Add(new RowDefinition());
grdRivit.Children.Add(lblInfo); grdRivit.Children.Add(lblInfo);
// Ladataan kannasta vakiorivit, joilla ikkuna täytetään
try try
{ {
rivit = ViewModel.Riviapuri.Lataa(Properties.Settings.Default.Vakiorivit); rivit = ViewModel.Riviapuri.Lataa(Properties.Settings.Default.Vakiorivit);
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show($"Virhe: {ex.Message}"); lblInfo.Content = $"Virhe ladattaessa rivejä: {ex.Message}";
} }
for (int i = 0; i < 8; i++)
grdRivit.ColumnDefinitions.Add(new ColumnDefinition()); // Sitten luodaan rivit
for (int i = 0; i < Properties.Settings.Default.Vakiorivit; i++) for (int i = 0; i < Properties.Settings.Default.Vakiorivit; i++)
{ {
numerot.Add(new List<TextBox>()); // Gridiin uusi rivi
grdRivit.RowDefinitions.Add(new RowDefinition()); grdRivit.RowDefinitions.Add(new RowDefinition());
// Otetaan kohta luotavat textboxit omaan listaan talteen
numerot.Add(new List<TextBox>());
// rivin numero labeliin, tulee sarakkeeseen 0
Label l = new Label(); Label l = new Label();
l.Content = $"Rivi {i+1}"; l.Content = $"Rivi {i + 1}";
Grid.SetRow(l, i); Grid.SetRow(l, i);
Grid.SetColumn(l, 0); Grid.SetColumn(l, 0);
grdRivit.Children.Add(l); grdRivit.Children.Add(l);
// luodaan 7 textboxia
for (int j = 0; j < 7; j++) for (int j = 0; j < 7; j++)
{ {
TextBox tb = new TextBox(); TextBox tb = new TextBox();
...@@ -90,12 +111,20 @@ namespace Lottokone ...@@ -90,12 +111,20 @@ namespace Lottokone
tb.Height = 25; tb.Height = 25;
tb.Margin = new Thickness(3, 0, 3, 0); tb.Margin = new Thickness(3, 0, 3, 0);
tb.VerticalAlignment = VerticalAlignment.Top; tb.VerticalAlignment = VerticalAlignment.Top;
// kun saadaan focus, halutaan valita kaikki
tb.GotFocus += txbFocus; tb.GotFocus += txbFocus;
// tekstin muuttuessa tehdään validointi
tb.TextChanged += txbChanged; tb.TextChanged += txbChanged;
// tekstilaatikkoon vanha numero valmiiksi
tb.Text = rivit[i].Numerot[j].ToString(); tb.Text = rivit[i].Numerot[j].ToString();
Grid.SetRow(tb, i); Grid.SetRow(tb, i);
Grid.SetColumn(tb, j+1); Grid.SetColumn(tb, j + 1);
grdRivit.Children.Add(tb); grdRivit.Children.Add(tb);
numerot[i].Add(tb); numerot[i].Add(tb);
} }
} }
...@@ -104,7 +133,7 @@ namespace Lottokone ...@@ -104,7 +133,7 @@ namespace Lottokone
private void txbFocus(object sender, RoutedEventArgs e) private void txbFocus(object sender, RoutedEventArgs e)
{ {
TextBox tb = sender as TextBox; TextBox tb = sender as TextBox;
if(tb != null) if (tb != null)
{ {
tb.SelectAll(); tb.SelectAll();
} }
...@@ -112,19 +141,21 @@ namespace Lottokone ...@@ -112,19 +141,21 @@ namespace Lottokone
public void btnSave_Click(object sender, RoutedEventArgs e) public void btnSave_Click(object sender, RoutedEventArgs e)
{ {
// Parsitaan nuo TextBoxit Rivi-oloiksi ja tallennetaan ne lopuksi
List<Rivi> rivit = new List<Rivi>(); List<Rivi> rivit = new List<Rivi>();
foreach(List<TextBox> rivi in numerot) foreach (List<TextBox> rivi in numerot)
{ {
short[] tmp = new short[7]; short[] tmp = new short[7];
// tarvitaan myös indeksi, joten foreach ei käy // tarvitaan myös indeksi, joten foreach ei käy tähän looppiin
for(int i = 0; i < 7; i++) for (int i = 0; i < 7; i++)
{ {
if(short.TryParse(rivi[i].Text, out short s)) if (short.TryParse(rivi[i].Text, out short s))
{ {
// tehdään vielä validaatio ennen tallennusta // tehdään vielä validaatio ennen tallennusta
if(s < 1 || s > 40) if (s < 1 || s > 40)
{ {
lblInfo.Content = "Käytä vain numeroita 1-40"; lblInfo.Content = "Käytä vain numeroita 1-40";
// ei tallennetakkaan, jos ei ole validia syötettä...
return; return;
} }
tmp[i] = s; tmp[i] = s;
...@@ -132,12 +163,14 @@ namespace Lottokone ...@@ -132,12 +163,14 @@ namespace Lottokone
else else
{ {
lblInfo.Content = "Käytä vain numeroita 1-40"; lblInfo.Content = "Käytä vain numeroita 1-40";
// ei tallennetakkaan, jos ei ole validia syötettä...
return; return;
} }
} }
rivit.Add(new Rivi(tmp)); rivit.Add(new Rivi(tmp));
} }
// Jos saatiin parsittua kaikki rivit, tallennetaan, ja suljetaan ikkuna.
try try
{ {
ViewModel.Riviapuri.Tallenna(rivit); ViewModel.Riviapuri.Tallenna(rivit);
...@@ -145,12 +178,14 @@ namespace Lottokone ...@@ -145,12 +178,14 @@ namespace Lottokone
} }
catch (Exception ex) catch (Exception ex)
{ {
// Virheen sattuessa ikkuna jääkin auki, ja virhe tulee alalaitaan.
lblInfo.Content = $"Virhe tallennettaessa rivejä: {ex.Message}"; lblInfo.Content = $"Virhe tallennettaessa rivejä: {ex.Message}";
} }
} }
public void txbChanged(object sender, TextChangedEventArgs e) public void txbChanged(object sender, TextChangedEventArgs e)
{ {
// Validoidaan, että laatikoissa on vain lukuja 1-40.
TextBox tb = sender as TextBox; TextBox tb = sender as TextBox;
if (tb != null) if (tb != null)
{ {
......
...@@ -30,12 +30,6 @@ namespace Lottokone.Model ...@@ -30,12 +30,6 @@ namespace Lottokone.Model
public virtual void ArvoRivi() public virtual void ArvoRivi()
{ {
/*for(int i = 0; i < 7; i++)
{
Numerot[i] = (short)rnd.Next(1, 41);
}*/
Numerot = Array.ConvertAll( Numerot = Array.ConvertAll(
// otetaan numerot 1-40, järjestellään satunnaisesti, valitaan 7 ekaa, ja tehdään niistä taulukko // otetaan numerot 1-40, järjestellään satunnaisesti, valitaan 7 ekaa, ja tehdään niistä taulukko
Enumerable.Range(1, 40).OrderBy(x => Rand.Next(0, Int32.MaxValue)).Take(7).ToArray(), Enumerable.Range(1, 40).OrderBy(x => Rand.Next(0, Int32.MaxValue)).Take(7).ToArray(),
......
...@@ -15,6 +15,12 @@ CREATE TABLE IF NOT EXISTS Lottorivit ( ...@@ -15,6 +15,12 @@ CREATE TABLE IF NOT EXISTS Lottorivit (
n7 INT DEFAULT 7 n7 INT DEFAULT 7
); );
-- Luodaan vakiorivit
INSERT INTO Lottorivit (id) VALUES INSERT INTO Lottorivit (id) VALUES
(1), (2), (3), (4), (5), (6), (7), (8), (1), (2), (3), (4), (5), (6), (7), (8),
(9), (10), (11), (12), (13), (14), (15); (9), (10), (11), (12), (13), (14), (15);
-- Jotain dataa scoreboardillekin
INSERT INTO Scoreboard (Pvm, Nimi, Saldo) VALUES
(DATETIME(), 'Teppo Testaja', -42000000);
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment