ベースボール結果管理ソフトウェアを作成しています。

タグの編集
投稿者 kane  (学生) 投稿日時 2012/7/23 13:33:11
こんにちは
現在、ベースボール結果管理ソフトウェアというものを作成しています。
そこでちょっと分からないことがありますので質問させてください。

1~9番とピッチャーの名前を入力するテキストボックスを配置しています。
テキストボックスに選手の名前を入れOKボタンを押すとtxtなどに書き込みをしたいのですが
どうすればいいのかわかりません・・・

検索した結果1つのテキストボックスの内容を一つずつ書き込む方法は見付けましたが
まとめて書き込む方法がありませんでしょうか?


1あ
2い
3う
4え
5お
6か
7き
8く
9け
Pけ
とテキストボックスに入力します。

OKボタンを押すと自動的にtxtが作成され、
1あ
2い
3う
4え
5お
6か
7き
8く
9け
Pけ
のように書き込みをしたいのですが方法はあるでしょうか・・・?
投稿者 shu  (社会人) 投稿日時 2012/7/23 13:54:11
見つけた方法で記述するとどのようなコードになりますでしょうか?
そしてどのように改善したいのでしょうか?

StreamWriterで書き込むファイルを開いて
WriteLineしていけば出来ますがその方法でよいのでしょうか?
投稿者 kanw  (学生) 投稿日時 2012/7/23 19:07:38
すいませんコード消してしまいわからなくなってしまいました(汗

>>StreamWriterで書き込むファイルを開いて
WriteLineしていけば出来ますがその方法でよいのでしょうか?

よかったら教えていただけないでしょうか?
投稿者 shu  (社会人) 投稿日時 2012/7/23 21:54:06
例外処理その他細かい処理は行っていません。

Imports System.IO
Imports System.Text

Public Class Form1
    Private DicTextBox As Dictionary(Of String, TextBox)

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。 
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。 
        DicTextBox = New Dictionary(Of String, TextBox)
        DicTextBox.Add("1", TextBox1)
        DicTextBox.Add("2", TextBox2)
        DicTextBox.Add("3", TextBox3)
        DicTextBox.Add("4", TextBox4)
        DicTextBox.Add("5", TextBox5)
        DicTextBox.Add("6", TextBox6)
        DicTextBox.Add("7", TextBox7)
        DicTextBox.Add("8", TextBox8)
        DicTextBox.Add("9", TextBox9)
        DicTextBox.Add("P", TextBox10)
    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim wt As New StreamWriter("C:\tmp\abc.txt"False, Encoding.UTF8)
        For Each keyvalue In DicTextBox
            wt.WriteLine("{0}{1}", keyvalue.Key, keyvalue.Value.Text)
        Next
        wt.Close()
    End Sub
End Class
投稿者 kane  (学生) 投稿日時 2012/7/24 00:00:16
すいませんちゃんと保存はされたのですが説明不足でした・・・

今現在は
1あ




で、保存されていますがこのようには出来ないでしょうか?
1あ 守備一 打率.000 HR0 打点0 盗塁0

それぞれテキストボックスを配置しています。
TextBox1は「あ」
TextBox2は「一」
TextBox3は「.000」
TextBox4は「0」
TextBox5は「0」
TextBox6は「0」

という感じです
投稿者 shu  (社会人) 投稿日時 2012/7/24 00:16:09
> Private DicTextBox As Dictionary(Of String, TextBox)

Private DicTextBox As Dictionary(Of String, TextBox())


 > DicTextBox = New Dictionary(Of String, TextBox)
DicTextBox = New Dictionary(Of String, TextBox())


> DicTextBox.Add("1", TextBox1)
DicTextBox.Add("1", New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6})

> wt.WriteLine("{0}{1}", keyvalue.Key, keyvalue.Value.Text)
wt.WriteLine("{0}{1} 守備{2} 打率{3} HR{4} 打点{5} 盗塁{6}", keyvalue.Key, keyvalue.Value(0).Text, keyvalue.Value(1).Text, keyvalue.Value(2).Text, keyvalue.Value(3).Text, keyvalue.Value(4).Text, keyvalue.Value(5).Text)

のようにすると良いかと思います。
項目がたくさんあるのでかなり省略してます。 
投稿者 kane  (学生) 投稿日時 2012/7/24 18:24:19
shuさん毎回毎回本当にすいません。
間違えていました・・・

1あ 守備一 打率.000 HR0 打点0 盗塁0

テキストボックスとNumericUpDownを使っていました・・・

TextBox1は「あ」
TextBox2は「一」
TextBox3は「.000」
NumericUpDown1は「0」
NumericUpDown2は「0」
NumericUpDown3は「0」

これが出来れば後は自分で頑張りますので
すいませんがお願いいたします。
投稿者 (削除されました)  () 投稿日時 2012/7/24 22:41:38
(削除されました)
投稿者 shu  (社会人) 投稿日時 2012/7/24 22:44:24
     Private Class Record
         Public 名前 As TextBox
         Public 守備 As TextBox
         Public 打率 As TextBox
         Public HR As NumericUpDown
         Public 打点 As NumericUpDown
         Public 盗塁 As NumericUpDown

         Public Sub New(名前 As TextBox, 守備 As TextBox, 打率 As TextBox, HR As NumericUpDown, 打点 As NumericUpDown, 盗塁 As NumericUpDown)
             Me.名前 = 名前
            Me.守備 = 守備
            Me.打率 = 打率
            Me.HR = HR
             Me.打点 = 打点
            Me.盗塁 = 盗塁
        End Sub
     End Class

こんな感じのクラスを作成し

 DicTextBox = New Dictionary(Of String, Record)
 DicTextBox.Add("1"New Record(TextBox1, TextBox2, TextBox3, NumericUpDown1, NumericUpDown2, NumericUpDown3))

のようにDictionaryを変更し

             wt.WriteLine("{0}{1} 守備{2} 打率{3} HR{4} 打点{5} 盗塁{6}", keyvalue.Key, _
                          keyvalue.Value.名前.Text, keyvalue.Value.守備.Text, keyvalue.Value.打率.Text, _
                          keyvalue.Value.HR.Value, keyvalue.Value.打点.Value, keyvalue.Value.盗塁.Value)


 WriteLineをこのように変更するとよいかと思います。 
投稿者 shu  (社会人) 投稿日時 2012/7/25 08:43:15
1人分の情報をまとめて扱うユーザーコントロールを作成した方がスマートかもしれません。
投稿者 kane  (学生) 投稿日時 2012/7/28 16:00:50
ありがとうございます。
保存できるようになっていました。

あの~本当に申し訳ないのですが
入力し保存した内容を、また読み込ませることは可能でしょうか?
投稿者 shu  (社会人) 投稿日時 2012/7/28 22:57:45
この保存の仕方だと読むのに単純な読み込みが出来ないので正規表現を使用した方がいいです。

Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions



        Dim rd As New StreamReader("C:\tmp\abc.txt", Encoding.UTF8)
        Dim reg As New Regex("(?<No>.)(?<名前>.*?) 守備(?<守備>.*?) 打率(?<打率>.*?) HR(?<HR>.*?) 打点(?<打点>.*?) 盗塁(?<盗塁>.*?)$")

        For Each keyvalue In DicTextBox
            With keyvalue.Value
                .名前.Text = ""
                .守備.Text = ""
                .打率.Text = ""
                .HR.Value = 0
                .打点.Value = 0
                .盗塁.Value = 0
            End With
        Next

        Dim LineData = rd.ReadLine
        Do While LineData IsNot Nothing
            Dim m = reg.Match(LineData)
            If m.Success Then
                Dim No = m.Groups("No").Value
                Dim 名前 = m.Groups("名前").Value
                Dim 守備 = m.Groups("守備").Value
                Dim 打率 = m.Groups("打率").Value
                Dim HR = m.Groups("HR").Value
                Dim 打点 = m.Groups("打点").Value
                Dim 盗塁 = m.Groups("盗塁").Value

                Dim itm As Record = Nothing
                If DicTextBox.TryGetValue(No, itm) Then
                    itm.名前.Text = 名前
                    itm.守備.Text = 守備
                    itm.打率.Text = 打率
                    itm.HR.Value = CInt(HR)
                    itm.打点.Value = CInt(打点)
                    itm.盗塁.Value = CInt(盗塁)
                End If
            End If

            LineData = rd.ReadLine
        Loop
        rd.Close()