Commit e51ba930 authored by M1888's avatar M1888

päiväkoodailut

parent da72682e
......@@ -38,7 +38,7 @@
<StackPanel>
<DockPanel Margin="5">
<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>
<TextBlock Margin="25,-5,0,0">Paljonko yksi lottorivi maksaa?</TextBlock>
</StackPanel>
......
......@@ -34,22 +34,54 @@ namespace Lottokone
private void BtnRivit_Click(object sender, RoutedEventArgs e)
{
var ikkuna = new Lottorivit();
ikkuna.ShowDialog();
new Lottorivit().ShowDialog();
}
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;
if (tb != null)
{
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 (result >= 0 && result < 6_000_000)
if (result >= 0 && result <= maksimi)
ok = true;
if (!ok)
{
lblInfo.Content = "Asetathan luvuille tarkoitettuihin laatikoihin vain numeroita.";
lblInfo.Content = $"{tb.Name}: sallitut luvut väliltä 0 - {maksimi:N0}";
btnSave.IsEnabled = false;
}
else
......@@ -74,12 +106,14 @@ namespace Lottokone
if(!ok)
{
lblInfo.Content = "Vakiorivejä voi olla 0-15 kpl";
btnSave.IsEnabled = false;
btnRivit.IsEnabled = false;
}
else
{
lblInfo.Content = "";
btnRivit.IsEnabled = true;
btnSave.IsEnabled = true;
}
}
......
......@@ -38,50 +38,71 @@ namespace Lottokone
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()
{
this.Height = 80 + Properties.Settings.Default.Vakiorivit * 40;
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.Content = "Tallenna";
btnSave.Margin = new Thickness(5);
btnSave.Click += btnSave_Click;
// Asetetaan se toiseksi alimmalle riville
Grid.SetRow(btnSave, Properties.Settings.Default.Vakiorivit);
Grid.SetColumnSpan(btnSave, 2);
grdRivit.RowDefinitions.Add(new RowDefinition());
grdRivit.Children.Add(btnSave);
grdRivit.RowDefinitions.Add(new RowDefinition());
// Luodaan label, jonne voidaan laittaa ohjeita ja virheitä.
lblInfo = new Label();
lblInfo.Style = Resources["Isompi"] as Style;
lblInfo.Margin = new Thickness(5);
// Se menee alimmalle riville.
Grid.SetRow(lblInfo, Properties.Settings.Default.Vakiorivit + 1);
Grid.SetColumnSpan(lblInfo, 8);
grdRivit.RowDefinitions.Add(new RowDefinition());
grdRivit.Children.Add(lblInfo);
// Ladataan kannasta vakiorivit, joilla ikkuna täytetään
try
{
rivit = ViewModel.Riviapuri.Lataa(Properties.Settings.Default.Vakiorivit);
}
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++)
{
numerot.Add(new List<TextBox>());
// Gridiin uusi rivi
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();
l.Content = $"Rivi {i+1}";
l.Content = $"Rivi {i + 1}";
Grid.SetRow(l, i);
Grid.SetColumn(l, 0);
grdRivit.Children.Add(l);
// luodaan 7 textboxia
for (int j = 0; j < 7; j++)
{
TextBox tb = new TextBox();
......@@ -90,12 +111,20 @@ namespace Lottokone
tb.Height = 25;
tb.Margin = new Thickness(3, 0, 3, 0);
tb.VerticalAlignment = VerticalAlignment.Top;
// kun saadaan focus, halutaan valita kaikki
tb.GotFocus += txbFocus;
// tekstin muuttuessa tehdään validointi
tb.TextChanged += txbChanged;
// tekstilaatikkoon vanha numero valmiiksi
tb.Text = rivit[i].Numerot[j].ToString();
Grid.SetRow(tb, i);
Grid.SetColumn(tb, j+1);
Grid.SetColumn(tb, j + 1);
grdRivit.Children.Add(tb);
numerot[i].Add(tb);
}
}
......@@ -104,7 +133,7 @@ namespace Lottokone
private void txbFocus(object sender, RoutedEventArgs e)
{
TextBox tb = sender as TextBox;
if(tb != null)
if (tb != null)
{
tb.SelectAll();
}
......@@ -112,19 +141,21 @@ namespace Lottokone
public void btnSave_Click(object sender, RoutedEventArgs e)
{
// Parsitaan nuo TextBoxit Rivi-oloiksi ja tallennetaan ne lopuksi
List<Rivi> rivit = new List<Rivi>();
foreach(List<TextBox> rivi in numerot)
foreach (List<TextBox> rivi in numerot)
{
short[] tmp = new short[7];
// tarvitaan myös indeksi, joten foreach ei käy
for(int i = 0; i < 7; i++)
// tarvitaan myös indeksi, joten foreach ei käy tähän looppiin
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
if(s < 1 || s > 40)
if (s < 1 || s > 40)
{
lblInfo.Content = "Käytä vain numeroita 1-40";
// ei tallennetakkaan, jos ei ole validia syötettä...
return;
}
tmp[i] = s;
......@@ -132,12 +163,14 @@ namespace Lottokone
else
{
lblInfo.Content = "Käytä vain numeroita 1-40";
// ei tallennetakkaan, jos ei ole validia syötettä...
return;
}
}
rivit.Add(new Rivi(tmp));
}
// Jos saatiin parsittua kaikki rivit, tallennetaan, ja suljetaan ikkuna.
try
{
ViewModel.Riviapuri.Tallenna(rivit);
......@@ -145,12 +178,14 @@ namespace Lottokone
}
catch (Exception ex)
{
// Virheen sattuessa ikkuna jääkin auki, ja virhe tulee alalaitaan.
lblInfo.Content = $"Virhe tallennettaessa rivejä: {ex.Message}";
}
}
public void txbChanged(object sender, TextChangedEventArgs e)
{
// Validoidaan, että laatikoissa on vain lukuja 1-40.
TextBox tb = sender as TextBox;
if (tb != null)
{
......
......@@ -30,12 +30,6 @@ namespace Lottokone.Model
public virtual void ArvoRivi()
{
/*for(int i = 0; i < 7; i++)
{
Numerot[i] = (short)rnd.Next(1, 41);
}*/
Numerot = Array.ConvertAll(
// 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(),
......
......@@ -15,6 +15,12 @@ CREATE TABLE IF NOT EXISTS Lottorivit (
n7 INT DEFAULT 7
);
-- Luodaan vakiorivit
INSERT INTO Lottorivit (id) VALUES
(1), (2), (3), (4), (5), (6), (7), (8),
(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